我一直在寻找一种通过多线程为C++ (Implementation found on Github)实现Timsort的方法,并且我尝试在此过程中使用它。
我确定我使用的是正确的编译器标志,但是每当我尝试使用Timsort时,如下所示:
#pragma omp parallel shared(DataVector)
{
gfx::timsort(DataVector.begin(), DataVector.end(), comp_1);
}
注意:排序的数据是一个包含单个单词的字符串的 vector ,而我使用的是我自己的比较器。
它看起来与在不使用OpenMP的情况下运行所花费的时间相同。使用适用于chrono之类的include时,我计时的值平均彼此之间都在0.01秒之内,而我的排序则徘徊在1.24秒左右。
是因为线程似乎无法与我的排序方法一起工作是有原因的,还是我实现OpenMP的方式有问题?
有目的地请注意:我也一直在使用__gnu_parallel::sort并获得更好的结果,但我希望自己在实践中比较这些方法。
最佳答案
omp parallel
需要查看将要并行化的循环。用您声明的方式,omp将并行处理单个代码段,这没有任何好处。
查看有关omp parallel
用法的文档。
要进行for循环,您需要在后面的for语句中使用omp parallel for
。您现在拥有的方式将在您拥有的每个核心上运行您的timsort。