【发布时间】:2014-05-28 23:21:46
【问题描述】:
有没有人有任何使用 TBB 有效并行化 std::partition 的技巧?这已经完成了吗?
这是我的想法:
- 如果数组很小,std::partition it (serial) and return
- 否则,使用自定义迭代器将数组视为 2 个交错数组(在缓存大小的块中交错)
- 为每对迭代器启动并行分区任务(递归到步骤 1)
- 在两个分区/中间指针之间交换元素*
- 返回合并的分区/中间指针
*我希望在一般情况下,与数组的长度相比,或者与将数组划分为连续块时所需的交换相比,该区域会很小。
在我尝试之前有什么想法吗?
【问题讨论】:
-
如果您使用 gcc,您可以从
-fopenmp开始并定义_GLIBCXX_PARALLEL以使用已经编写、测试等的标准库的并行版本。如果您真的想要要仅并行运行std::partition,您可以包含parallel/algorithm,并调用__gnu_parallel::partition。 -
这需要与 gcc 和 clang 编译。另外,做分区的代码已经在tbb任务中运行了,openmp调度器和tbb调度器能很好地协同工作吗?
-
我期望他们付出了一些努力来让他们一起玩得很好,但我还没有测试过,所以很难确定。
-
不,如果在最外层的并行循环(TBB 或其他)内调用 OpenMP,通常会创建二次超额订阅。这取决于 OpenMP 规范。通过 OMP_DYNAMIC 模式可以降低超额订阅的程度,但仍然嵌套两个不同的运行时效率低。
-
顺便说一句,如果您不想依赖 GCC 的扩展但可以使用 GPL3 代码,您可以捆绑它们的实现。如果您真的想避免使用 OpenMP,您也可以将他们的代码转换为 TBB。在我看来,他们使用分而治之的方法概括为任意线程数。 gcc.gnu.org/onlinedocs/gcc-4.6.2/libstdc++/api/…
标签: c++ algorithm sorting parallel-processing tbb