【问题标题】:C++ parallel sortC++ 并行排序
【发布时间】:2015-02-14 21:52:57
【问题描述】:

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

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

其中ab 是指向数据数组块的指针,我们可以通过索引数组和数据数组开头的指针获得。 排序不应该对数据数组进行排序,而是对索引数组进行排序。 所以问题是:我可以使用什么并行算法(除了框架、库,我需要精确的算法或标准语言包,如 pthread 或 qt 库或 c/c++ 标准库)以避免同步错误?代码或伪代码也会有所帮助。

【问题讨论】:

  • 我会在切片(或子数组)上并行使用std::sort,然后使用一些合并排序。顺便说一句,你至少需要 C++11
  • 顺便说一句,您确定您的数据足够大,可以进行并行排序吗?典型的数据大小是多少?
  • @BasileStarynkevitch 平均数据数组大小约为 9-11 Gb。我需要对小零件进行排序,所以问题是如何快速完成。
  • 你的目标平台/工具链是什么?
  • @BaummitAugen x64 linux 服务器 - 主平台。

标签: c++ c sorting parallel-processing


【解决方案1】:

如果您使用 libstdc++(g++ 的标准)作为标准库实现,则可以依赖其内置的 "Parallel Mode"

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

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

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

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

【讨论】:

  • 好方法,喜欢。但是如何将这种排序用于自定义大小的结构数组?在标准的 qsort() 中,我们有 begin、end、count、size 和 comparer 参数,但在 gnu_parallel::sort() 中我们没有 size 参数。那么如何使用这个函数对自定义结构数组进行排序呢?
  • @HackSaw std::sort(std::begin(myArray), std::end(myArray), comp); 如果它是一个编译时大小的数组,std::sort(myArray, myArray + lengthOfArray, comp); 如果myArray 是一个指针。 comp 是可选的,默认使用operator&lt;
  • 只是为了清除。如果myArray 是指向结构数组的指针,那么lengthOfArraysizeof(arraytype) * numberOfElements 组成,对吗?不只是numberOfElements
  • @HackSaw 否,元素的实际数量。例如。 int* p = new int[50] 将按 std::sort(p, p+50) 排序。
【解决方案2】:

并行排序是 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

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

更多详情请访问:Are C++17 Parallel Algorithms implemented already?

算法讨论见:Which parallel sorting algorithm has the best average case performance?

【讨论】:

    猜你喜欢
    • 2011-12-21
    • 1970-01-01
    • 1970-01-01
    • 2014-06-18
    • 2021-03-04
    • 1970-01-01
    • 1970-01-01
    • 2014-07-30
    • 1970-01-01
    相关资源
    最近更新 更多