C++并行排序

C++ parallel sort

本文关键字:排序 并行 C++      更新时间:2023-10-16

我需要对存储在结构数组中的数据块进行排序。结构没有指针。每个块都有其计数器编号和数组中与结构块相等的数据块所在位置的坐标。例如,如果我们有一个数据数组,我们可以将其划分为NxN的4个块,在结构块的索引数组中,我们有4个结构块,每个结构块都有自己的编号和在数据数组中的位置。借助于此,我们可以使用索引块来计算数据数组中块的指针。应该使用比较器来进行排序,比较器将两个块进行比较,使两个块中最少的一个块具有最少的第i个数据数。例如比较器:

for( i = 0; i < N * N; ++i )
{
    if( a[i] < b[i] ) return -1;
    if( a[i] > b[i] ) return 1;
}

其中CCD_ 1和CCD_。排序不应该对数据数组进行排序,而应该对索引数组进行排序。所以问题是:我可以使用什么并行算法(除了框架、库,我确切地需要算法或标准语言工具包,如pthread或qt-libs,或c/c++标准libs)来避免同步错误?代码或伪代码也会有所帮助。

并行排序是C++17的一部分

在实现方面,一切都与Ubuntu 19.10一致,在那里你可以做的只是:

#include <execution>
#include <algorithm>
std::sort(std::execution::par_unseq, input.begin(), input.end());

并使用构建和运行

sudo apt install gcc libtbb-dev
g++ -ggdb3 -O3 -std=c++17 -Wall -Wextra -pedantic -o main.out main.cpp -ltbb
./main.out

该函数调用会自动为您生成执行并行排序的线程

更多详细信息,请访问:C++17并行算法是否已经实现?

有关算法讨论,请参阅:哪种并行排序算法的平均情况性能最好?

如果使用libstdc++(g++的标准)作为标准库实现,则可以依赖其内置的"并行模式"

要使用它,您需要使用-fopenmp进行编译,并在编译过程中定义_GLIBCXX_PARALLEL。在这里,您可以找到更多关于用法的信息,以及gcc将考虑用于并行化的算法列表。

请注意使用网站的以下警告:

请注意,_GLIBCXX_PARALLEL定义可能会更改标准类模板(如std::search)的大小和行为,因此,如果在两个翻译单元之间没有传递容器的实例化,则只能链接使用并行模式编译的代码和不使用并行模式编译的代码。并行模式功能具有明显的联系,不能与正常模式符号混淆。

每个单独的并行算法也可以显式调用。您只需要使用-fopenmp(而不是_GLIBCXX_PARALLEL标志)进行编译,并根据文档的本小节中列出的函数包括parallel/numericparallel/algorithm。请注意,并行算法位于__gnu_parallel命名空间中。