元素之间的多线程暴力比较以创建图形

Multithreaded bruteforce comparisons between elements to create a graph

本文关键字:比较 创建 图形 之间 多线程 元素      更新时间:2023-10-16

我有N个元素需要相互比较才能创建一个图。它总共给出了 (N*N-1)/2 个比较。

我想多线程这些比较我也有几个约束:

    每个元素
  • 都很大,实际上它是一个矩阵,因此复制每个线程中的所有元素会占用太多内存。

  • 每次比较都应该发生,这意味着我不能跳过一个。

  • 每次可以在列表中添加新元素时,这都非常棘手,因为我需要跟踪已完成的操作,只执行新操作。

  • 由于比较的数量可能很大,比如 2000 万,我不能有那么大的队列。

  • 最后,可以随时停止该过程,我必须能够恢复我甚至在应用程序的其他执行中的位置。

到目前为止,我有一个主线程,其中包含线程池中的所有元素和几个工作线程。工作线程比较对列表或一系列元素。我想到了一个比较生成器,它可以按需提供下一个 X 比较。

我怎样才能构建这个生成器?

我是否应该复制工作线程的每一对,直接从工作线程使用读写锁定从主节点读取数据?

如何跟踪每个线程的进度?

如何停止并恢复比较状态?

如果有很多问题,我很抱歉。谢谢!

假设读取是线程安全的(通常只要没有人在写入),一个简单的解决方案是以某种方式在工作线程集之间细分任务,提前这样做。例如,对于 n 个工人,您可以将对 (x, y) 分配给工人 x mod n唯一的沟通是让每个工作线程知道其序数 (0...n-1)。每个线程都应该将其答案放入一个私有数组中,可以在其他人完成后进行整理。

适应不同员工生产力的更复杂的模型是将每个值推 0...N-1 到队列中。每个工作线程从队列中提取一个数字 x,评估每个 (xy) 对,然后返回另一个 x

如果您想花时间,将成对排队会更有效,以最大程度地减少缓存抖动。这是一个棘手的问题。本质上,您希望将来自小型元素集群的对排队,以便几乎同时评估集群中的每个元素对。尽管这很棘手,但它可能会对算法的效率产生巨大影响。