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

时间:2015-10-16 02:36:33

标签: c++ multithreading sorting vector timsort

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

2 个答案:

答案 0 :(得分:1)

omp parallel需要看到它要并行化的循环。你声明它的方式,omp将并行化一段代码,这段代码没有任何好处。

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

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

答案 1 :(得分:0)

认为openMP不够聪明,因为你认为......  如果你想为gfx::timsort进行并行,你不能从外面做到......  您应该在函数gfx::timsort

中添加此代码
#pragma omp parallel for
for(int i=0;i<num;i++)
...

旁边,shared是指示变量的关键词,你不希望它被并行编辑