对 int/float 进行排序的最快的并行 C++ 排序实现是什么?

问题描述

我正在对不同的并行 cpu 排序实现进行基准测试。

数据:

  • n >= 8000000000 类型的元素 int/long/float/double
  • 各种数据分布(例如,uniform/staggered/normal/...

硬件:

  • cpu:2 个 AMD EPYC 7742,64 核(共 128 核)
  • 内存:1TB

到目前为止,我已经:

  • std::sortstd::execution::par_unseq 执行政策,

  • __gnu_parallel::sort

  • thrust::sortOMP 后端。

是否有任何其他既定的排序实现可以使用源代码

我知道 PARADIS,但其源代码已商业化,因此无法使用。

解决方法

对 int/float 进行排序的最快并行 C++ 排序实现是什么?

这在很大程度上取决于....而且您可以在自己的 C++ 库中重新实现 PARADIS

还要考虑:

  • 使用 OpenCL 在您的 GPGPU 上运行小数组的子排序。
  • 如果您正在对数百万个数字的数组进行排序,则将(可能使用 XDR)子数组传输到某个云计算机中的其他节点(或其他核心),然后在 sorted 上运行 merge sort子数组
  • 使用 qsort(3) 并使用作为 gcc -Wall -Wextra -O3 -flto 调用的 GCC 编译和链接您的整个应用程序(甚至可能使用它编译 GNU libc

如果您更了解这些 8G 号码(例如,您确定 int 的所有号码都在 1 到 1000000 之间,或者所有号码都在 -1.0 之间 和 3.0(float s)您可以编写更具体的代码。如果您确定他们遵循某些 normal distribution,您可能可以编写更明智的代码。

我的猜测是 CPU cache 考虑因素(例如,如果您必须使用 std::atomic)会对性能产生很大影响

一种可能的方法(如果您能负担得起在该问题上花费数周时间)是生成几个 C++ 例程,将它们编译为插件并dlopen(3) 这些插件,并对它们进行基准测试和比较表现。另一种方法是在运行时结合使用 dynamic programming 技术和机器代码生成(使用 asmjit)来生成适合您拥有的特定数据的排序例程。

不要忘记在您的 C++ 编译器中启用优化:使用最近的 GCC,使用 g++ -Wall -flto -O3

编译和链接

Pitrat 的书 Artificial Beings,the conscience of a conscious machineRefPerSys 系统可能会鼓舞人心。