对 int/float 进行排序的最快并行 C++ 排序实现是啥? [关闭]

Posted

技术标签:

【中文标题】对 int/float 进行排序的最快并行 C++ 排序实现是啥? [关闭]【英文标题】:What are the fastest parallel C++ sorting implementations to sort int/float? [closed]对 int/float 进行排序的最快并行 C++ 排序实现是什么? [关闭] 【发布时间】:2021-03-13 11:11:30 【问题描述】:

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

数据:

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

硬件:

CPU:2x AMD EPYC 7742,64 核(共 128 核) 内存:1TB

到目前为止,我有:

std::sortstd::execution::par_unseq 执行策略,

__gnu_parallel::sort,和

thrust::sortOMP 后端。

还有其他已建立的排序实现可以使用源代码吗?

我知道PARADIS,但它的源代码不可用,因为它已经商业化了。

【问题讨论】:

检查 boost 和 tbb 中的实现。并尝试使用内核数量,一些实现针对更少的内核进行了调整。 你能负担多少个月的开发努力来解决这个有趣的问题? @MarcGlisse boost 和 tbb 是很好的提示,我今天也会添加它们。 @BasileStarynkevitch 对我来说,这样做的主要目标是使用现有方法找到并行 CPU 排序的最快基线。 你想用几个月的努力找到最快的代码?也许编辑你的问题来解释你想要分类什么样的数据(是钱,还是基因组学信息,或者其他什么)。您需要完整的排序,还是可以承受输出的不精确性? 【参考方案1】:

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

这取决于很多...。您可以在自己的 C++ 库中重新实现 PARADIS。

同时考虑:

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

如果您对这些 8G 数字有更多了解(例如,您确定对于ints,它们都在 1 到 1000000 之间,或者它们都在 -1.0 之间 和 3.0 for floats) 你可以编写更具体的代码。如果您确定他们关注某些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 系统,可能会鼓舞人心。

【讨论】:

谢谢!您的回复也帮助我更准确地回答了我的问题。使用加速器或分布式节点不是我的基准测试的目的。不希望针对某些分布进行优化,但如果算法在某个分布上表现更好,那当然没问题。我们已经有了一个广泛的基准框架,现在正在寻找“正确”的排序实现来插入。当然,我们使用了所有优化。感谢您提供其他提示! 我的建议:为您感兴趣的问题支付博士论文(因此博士候选人工作 4 年)

以上是关于对 int/float 进行排序的最快并行 C++ 排序实现是啥? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

一百万个结构数组,根据其中一项值排序,用双链表还是数组排序效率更好,请给出最快C或C++算法代码。

根据类私有成员对包含类的列表进行排序

C++ - 将项目添加到排序数组的最快方法

根据嵌套键值对对象数组进行排序的最快方法

并行前缀和 - 最快的实现

R中的性能:对矩阵中的行元素进行排序的最快方法是啥?