【发布时间】:2016-10-27 12:50:33
【问题描述】:
我有一个很大的向量。一些向量成员并行匹配某个条件。我想找到与条件匹配的第一个元素。
我的问题与这个问题 (tbb: parallel find first element) 非常相似,但我没有 tbb。检查条件非常繁琐(所以我不能按顺序为所有这些检查)。这就是为什么我想并行运行它。不得不提的是,我想找到第一个元素(所以元素的索引位置对我来说很重要)。
例如,如果我有 4 个线程。
ThreadNr Index condition
1 0 Not Meet
2 1 Not Meet
3 2 Not Meet
4 3 Not Meet
ThreadNr Index condition
1 4 Not Meet
2 5 Meet
3 6 Not Meet
4 7 Meet
函数必须重新调整索引号 5。 线程必须分布并处理顺序迭代块(块大小可以大于 1。例如线程 1 处理前 4 个元素,线程 2 处理后 4 个元素,依此类推)。
对于上面的例子,如果线程 4(索引 7)在线程 2(索引 5)之前找到成员,它必须等待所有线程完成工作。正如我之前所说,最低的索引号是目标。
如果您有更好的算法,请纠正我。
注意:我可以使用外部库,例如 boost 1.62、OpenMP 2.0
【问题讨论】:
-
请注意,最佳情况复杂度从 0 增加到 N/K,其中 N 是元素总数,K 是线程数。
-
这很大程度上取决于元素的大小以及检查条件需要多长时间。如果你对
std::vector<int>做一些简单的事情,比如==,你不会想要这样交错,因为它会对缓存造成严重破坏。在这种情况下,您可能希望线程一次检查整数块。如果您的矢量对象是 1mb 一块,并且需要 1-2 秒来执行检查,那么交错可能更有意义。 -
如果 tbb 对您有吸引力,请使用它。在 Openmp 中,如果我理解这个问题,您会像对内部搜索循环所做的那样对数据进行分区,将内部结果组合成外部 omp 减少 firstprivate lastprivate 或critical。
标签: c++ multithreading boost parallel-processing openmp