C++并行排序
C++ parallel sort
我需要对存储在结构数组中的数据块进行排序。结构没有指针。每个块都有其计数器编号和数组中与结构块相等的数据块所在位置的坐标。例如,如果我们有一个数据数组,我们可以将其划分为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/numeric
或parallel/algorithm
。请注意,并行算法位于__gnu_parallel
命名空间中。
- 排序并行数组
- 并行快速排序分区中的隔离错误
- 在OpenMP上的并行合并排序上的数组大小问题.如何将合并分类分类为更多任务
- C++ 并行 std::排序浮点值
- 如何并行化矩阵排序以进行循环
- 改善并行bitonic排序的更好方法
- 并行快速排序不比顺序快速排序快
- 对一个具有重复元素的数组进行排序时更新并行数组
- 并行程序中的多图或排序向量
- libstdc++ 并行模式快速排序的加速较差
- 选择在++中对并行数组排序
- 使用 OPENMP 进行并行合并排序
- C++并行排序
- Windows 线程:并行合并排序
- 从最高到最低对字符串数组和双数组进行排序(并行数组)并对齐文本
- 如何对两个并行数组排序
- 使用指定数量的线程进行并行基数排序
- 为什么GNU并行快速排序比归并排序慢?
- 并行归并排序中的性能问题
- 递归深度切断策略:并行快速排序