C++ 多线程暴力强制元素之间的比较以创建图形
我有N个元素,它们需要相互比较以创建一个图表。它总共提供了(N*N-1)/2比较 我想多线程进行这些比较我还有几个限制:C++ 多线程暴力强制元素之间的比较以创建图形,c++,multithreading,algorithm,graph-algorithm,C++,Multithreading,Algorithm,Graph Algorithm,我有N个元素,它们需要相互比较以创建一个图表。它总共提供了(N*N-1)/2比较 我想多线程进行这些比较我还有几个限制: 每个元素都相当大,实际上它是一个矩阵,所以复制每个线程中的所有元素会占用太多内存 每次比较都应该进行,这意味着我不能跳过一次 每次可以在列表中添加一个新元素时,这是非常棘手的,因为我需要跟踪已经完成的工作,只做新的工作 由于比较的数量可能很大,比如2000万,我不能有这么大的队列 最后,任何时候都可以停止这个过程,我必须能够在应用程序的其他执行过程中恢复 到目前为止,我有
- 每个元素都相当大,实际上它是一个矩阵,所以复制每个线程中的所有元素会占用太多内存
- 每次比较都应该进行,这意味着我不能跳过一次
- 每次可以在列表中添加一个新元素时,这是非常棘手的,因为我需要跟踪已经完成的工作,只做新的工作
- 由于比较的数量可能很大,比如2000万,我不能有这么大的队列
- 最后,任何时候都可以停止这个过程,我必须能够在应用程序的其他执行过程中恢复
谢谢大家! 假设读取是线程安全的(通常只要没有人在写),一个简单的解决方案是以某种方式在工作线程集中细分任务,提前这样做。例如,对于n个worker,您可以将对(x,y)分配给worker x mod n。唯一的沟通是让每个工人知道其序号(0…n-1)。每个线程都应该将其答案放入一个私有数组中,在其他所有线程完成后可以对其进行整理 适应不同工人生产率的更复杂模型是将每个值0…N-1推送到队列中。每个工作线程从队列中提取一个数字x,计算每个(x,y)对,然后返回另一个x
如果您想花点时间,将对排队以最小化缓存抖动会更有效。这是一个棘手的问题。本质上,您希望将元素的小集群中的对排队,以便在几乎相同的时间对集群中的每一对进行求值。尽管这很棘手,但它可能会对算法的效率产生巨大的影响。可以进一步解释缓存抖动问题吗?正如我所说,我的读取不是线程安全的,因为我可以随时添加元素,所以我有一个readwritelock来保护我的N个元素。在您的模型中,您没有说明如果有新元素,如何停止和恢复。例如,@Kikohs:WRT cache,您可能会遇到的问题是,许多线程访问许多不同的内存区域时,会因为二级缓存的使用而相互争斗。就线程访问的内存而言,将线程保持在一起可以缓解这种情况,有时会对性能产生显著影响。例如,六个线程评估对集{0/1、0/2、0/3、1/2、1/3、2/3}的执行效率可能比评估{0/1、2/3、4/5、6/7、8/9、10/11}的执行效率更高。@Kikohs:Wrt线程安全性取决于列表中元素的管理方式。如果它们从未被移动(例如,链表或deque)或删除,则可以将迭代器或指针对排队。当新元素到达时,主线程将包含新元素的一组新指针对排入队列。