2

我一直在寻找一种使用多线程实现 Timsort for C++ (在 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 并获得更好的结果,但我希望自己在实践中比较这些方法。

4

2 回答 2

1

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

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

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

于 2015-10-16T02:39:43.567 回答
0

认为 openMP 没有你想的那么聪明......如果你想做一个并行,因为gfx::timsort你不能从外面做......你应该在函数中添加这个代码gfx::timsort

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

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

于 2015-10-16T02:53:31.787 回答