多线程搜索的解决方案空间很大

Multi-threading search of a large solution space

本文关键字:空间 解决方案 搜索 多线程      更新时间:2023-10-16

我必须在大的解决方案空间(枚举特定顺序的所有拉丁方)中搜索有效的解决方案。我正在尝试多线程(boost::thread)。我将解空间划分为子空间,并研究单个线程中的特定子空间。这样做效果很好,因为线程之间没有依赖关系。

但现在我想将所有有效的解决方案保存在一个列表中。最好是使用单个列表(共享数据)并用互斥对象包围它,还是应该为每个线程创建列表(本地数据)并在线程完成后加入列表?

对于更高的订单,可能有数百万个有效的解决方案。因此,该过程要么涉及大量互斥锁/解锁,要么涉及每个线程占用大量内存。

谢谢,Daniel Dekkers

根据您的解释,您希望在算法结束时连接本地列表。如果每个线程都要找到许多解决方案,那么在互斥体中使用会大大降低计算速度。根据我对你的理解,现在你应该认为内存相当便宜,但如果不知道解决方案的大小,很难确定。

还可以有内存空间最小的列表合并算法(即通过一次复制少量数据),这可以解决小内存占用问题。

话虽如此,您的问题也有混合解决方案。例如,您可以创建一个共享容器并对其进行分区,以便为每个线程分配分区,无论是交错的还是块中的。这将允许您删除每次访问互斥,但需要一个复杂的容器增长机制(因为似乎不可能事先知道有多少解决方案)。