对 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::sort
与 std::execution::par_unseq
执行策略,
__gnu_parallel::sort
,和
thrust::sort
与 OMP
后端。
还有其他已建立的排序实现可以使用源代码吗?
我知道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 数字有更多了解(例如,您确定对于int
s,它们都在 1 到 1000000 之间,或者它们都在 -1.0 之间
和 3.0 for 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 系统,可能会鼓舞人心。
【讨论】:
谢谢!您的回复也帮助我更准确地回答了我的问题。使用加速器或分布式节点不是我的基准测试的目的。不希望针对某些分布进行优化,但如果算法在某个分布上表现更好,那当然没问题。我们已经有了一个广泛的基准框架,现在正在寻找“正确”的排序实现来插入。当然,我们使用了所有优化。感谢您提供其他提示! 我的建议:为您感兴趣的问题支付博士论文(因此博士候选人工作 4 年)以上是关于对 int/float 进行排序的最快并行 C++ 排序实现是啥? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章