在 C++ 中使用 OpenMP 和 Timsort 算法

Posted

技术标签:

【中文标题】在 C++ 中使用 OpenMP 和 Timsort 算法【英文标题】:Using OpenMP in C++ with Timsort Algorithm 【发布时间】:2015-10-16 02:36:33 【问题描述】:

我一直在寻找一种使用多线程实现 Timsort for C++ (Implementation found on Github) 的方法,我已经尝试在这个过程中使用。 我确定我使用了正确的编译器标志,但是每当我尝试使用 Timsort 时,如下所示:

#pragma omp parallel shared(DataVector)

     gfx::timsort(DataVector.begin(), DataVector.end(), comp_1);

注意:被排序的数据是一个包含单个单词字符串的向量,我使用的是我自己的比较器。

似乎在不使用 OpenMP 的情况下运行所需的时间相同。为 chrono 等使用适当的包含,我的时间值平均在 0.01 秒内,我的排序徘徊在 1.24 秒左右。

线程似乎不适用于我的排序方法,还是我实现 OpenMP 的方式有问题?

特意注意:我一直在使用 __gnu_parallel::sort 并获得更好的结果,但我希望自己在实践中比较这些方法。

【问题讨论】:

【参考方案1】:

omp parallel 需要查看将要并行化的循环。按照您声明的方式,omp 将并行化一段没有任何好处的代码。

检查您的文档以了解 omp parallel 的使用情况。

要执行 for 循环,您需要使用 omp parallel for 和后面的 for 语句。你现在拥有它的方式,它将在你拥有的每个核心上运行你的 timsort。

【讨论】:

那么我基本上需要进入 timsort 本身的实际代码并将omp parallel for 添加到适当的位置吗?我的假设是使用 DataVector.begin()DataVector.end() 的并行 for 循环不会完全按照我的计划工作。 @Tekrin 类似的东西。为了与 OMP 一起工作,for 语句存在一些限制。 我还没有找到使用 Timsort 实现 OpenMP 的确切方法,所以我会留下“未回答”的问题但是您的回答似乎确实为我指明了正确的方向,实际上引导我修复代码中其他地方的另一个问题。【参考方案2】:

认为 openMP 没有你想象的那么聪明... 如果你想为gfx::timsort 做一个平行,你不能从外面做... 您应该将此代码添加到函数gfx::timsort

#pragma omp parallel for
for(int i=0;i<num;i++)
...

此外,shared 是一个关键字,用于指示您不希望它被并行编辑的变量

【讨论】:

以上是关于在 C++ 中使用 OpenMP 和 Timsort 算法的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ OpenMP 代码中测量执行时间

在 C++ OpenMP 代码中测量执行时间

在 C++ 中使用 OpenMP 并行化递归函数

在 C++ 中使用 OpenMP 并行化算法

在 Openmp (C++) 中销毁线程

如何使用 OpenMP 在 C++ 中实现监视器?