我一直在寻找一种使用多线程实现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以及更好的结果,但我希望自己在实践中比较这些方法。
答案 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
是指示变量的关键词,你不希望它被并行编辑