元素之间的多线程暴力比较以创建图形
Multithreaded bruteforce comparisons between elements to create a graph
我有N个元素需要相互比较才能创建一个图。它总共给出了 (N*N-1)/2 个比较。
我想多线程这些比较我也有几个约束:
- 每个元素
都很大,实际上它是一个矩阵,因此复制每个线程中的所有元素会占用太多内存。
每次比较都应该发生,这意味着我不能跳过一个。
每次可以在列表中添加新元素时,这都非常棘手,因为我需要跟踪已完成的操作,只执行新操作。
由于比较的数量可能很大,比如 2000 万,我不能有那么大的队列。
最后,可以随时停止该过程,我必须能够恢复我甚至在应用程序的其他执行中的位置。
到目前为止,我有一个主线程,其中包含线程池中的所有元素和几个工作线程。工作线程比较对列表或一系列元素。我想到了一个比较生成器,它可以按需提供下一个 X 比较。
我怎样才能构建这个生成器?
我是否应该复制工作线程的每一对,直接从工作线程使用读写锁定从主节点读取数据?
如何跟踪每个线程的进度?
如何停止并恢复比较状态?
如果有很多问题,我很抱歉。谢谢!
假设读取是线程安全的(通常只要没有人在写入),一个简单的解决方案是以某种方式在工作线程集之间细分任务,提前这样做。例如,对于 n 个工人,您可以将对 (x, y) 分配给工人 x mod n。唯一的沟通是让每个工作线程知道其序数 (0...n-1)。每个线程都应该将其答案放入一个私有数组中,可以在其他人完成后进行整理。
适应不同员工生产力的更复杂的模型是将每个值推 0...N-1 到队列中。每个工作线程从队列中提取一个数字 x,评估每个 (x, y) 对,然后返回另一个 x。
如果您想花时间,将成对排队会更有效,以最大程度地减少缓存抖动。这是一个棘手的问题。本质上,您希望将来自小型元素集群的对排队,以便几乎同时评估集群中的每个元素对。尽管这很棘手,但它可能会对算法的效率产生巨大影响。
- 用于基于成员字段或函数创建比较器的快捷方式
- 是否有任何统一的方法可以在 c++ 中创建自定义比较器?
- 如何为C++映射创建自己的字符串比较对象
- 为 map<int、pair<int、int 创建比较器>>
- 如何比较 2 个向量并根据比较创建单独的向量
- 如何以自定义类/比较器作为密钥创建地图
- 为指针后面的对象创建比较器的通用方法
- 创建和比较两组卡片
- 创建对象的副本以进行多重比较是一种很好的做法
- 比较两个数组并创建具有公共元素的第三个数组
- 如何将字符串变量与从文件创建的字符串数组进行比较
- 如何创建一个递归方法来比较两个值
- 创建一个比较两个对象的方法
- 如何使用比较器创建类
- 是否可以创建一个函数来比较对象向量中动态选择的变量
- 如何创建一个接受比较器的类(对于最大堆和最小堆)
- 在c++中创建未命名容器,以便在单元测试中进行临时比较
- 创建比较函数以对 C 样式字符串进行排序
- 是否有一个(比较高级的)c++库来创建在iOS和Android上运行的pdf文档?
- 如何在c++中使用我的自定义比较创建一个集合