在 C++ 中使用 OpenMP 和 Timsort 算法
Using OpenMP in C++ with Timsort Algorithm
我一直在寻找一种通过多线程为 C++ (Implementation found on Github) 实现 Timsort 的方法,并且我已经尝试在此过程中使用。
我确信我使用的是正确的编译器标志,但每当我尝试使用 Timsort 时,我都会像下面那样:
#pragma omp parallel shared(DataVector)
{
gfx::timsort(DataVector.begin(), DataVector.end(), comp_1);
}
注意:正在排序的数据是一个包含单个单词字符串的向量,我正在使用自己的比较器。
排序的时间似乎与不使用 OpenMP 的 运行 花费的时间相同。对 chrono 等使用适当的 include,我计时的值平均相差在 0.01 秒以内,我的排序徘徊在 1.24 秒左右。
线程似乎无法与我的排序方法一起使用是有原因的,还是我实施 OpenMP 的方式有问题?
特意说明:我也一直在使用 __gnu_parallel::sort 并获得了更好的结果,但我希望自己在实践中比较这些方法。
omp parallel
需要查看要并行化的循环。按照您声明的方式,omp 将并行化一段没有任何好处的代码。
查看有关 omp parallel
用法的文档。
要执行 for 循环,您需要使用 omp parallel for
和后面的 for 语句。你现在拥有它的方式将 运行 你拥有的每个核心上的 timsort。
认为 openMP 没有您想象的那么智能...
如果你想为 gfx::timsort
做一个并行,你不能从外面做...
您应该在函数 gfx::timsort
中添加此代码
#pragma omp parallel for
for(int i=0;i<num;i++)
...
此外,shared
是一个关键字,用于指示您不希望它被并行编辑的变量
我一直在寻找一种通过多线程为 C++ (Implementation found on Github) 实现 Timsort 的方法,并且我已经尝试在此过程中使用。 我确信我使用的是正确的编译器标志,但每当我尝试使用 Timsort 时,我都会像下面那样:
#pragma omp parallel shared(DataVector)
{
gfx::timsort(DataVector.begin(), DataVector.end(), comp_1);
}
注意:正在排序的数据是一个包含单个单词字符串的向量,我正在使用自己的比较器。
排序的时间似乎与不使用 OpenMP 的 运行 花费的时间相同。对 chrono 等使用适当的 include,我计时的值平均相差在 0.01 秒以内,我的排序徘徊在 1.24 秒左右。
线程似乎无法与我的排序方法一起使用是有原因的,还是我实施 OpenMP 的方式有问题?
特意说明:我也一直在使用 __gnu_parallel::sort 并获得了更好的结果,但我希望自己在实践中比较这些方法。
omp parallel
需要查看要并行化的循环。按照您声明的方式,omp 将并行化一段没有任何好处的代码。
查看有关 omp parallel
用法的文档。
要执行 for 循环,您需要使用 omp parallel for
和后面的 for 语句。你现在拥有它的方式将 运行 你拥有的每个核心上的 timsort。
认为 openMP 没有您想象的那么智能...
如果你想为 gfx::timsort
做一个并行,你不能从外面做...
您应该在函数 gfx::timsort
#pragma omp parallel for
for(int i=0;i<num;i++)
...
此外,shared
是一个关键字,用于指示您不希望它被并行编辑的变量