问题描述
我正在对不同的并行 cpu 排序实现进行基准测试。
数据:
-
n >= 8000000000
类型的元素int/long/float/double
- 各种数据分布(例如,
uniform/staggered/normal/...
)
硬件:
- cpu:2 个 AMD EPYC 7742,64 核(共 128 核)
- 内存:1TB
到目前为止,我已经:
-
std::sort
与std::execution::par_unseq
执行政策, -
__gnu_parallel::sort
和 -
thrust::sort
与OMP
后端。
是否有任何其他既定的排序实现可以使用源代码?
解决方法
对 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 machine 和 RefPerSys 系统可能会鼓舞人心。