C++ 最快的并行C++;将实现排序为int/float?

C++ 最快的并行C++;将实现排序为int/float?,c++,c++11,c++17,C++,C++11,C++17,我正在测试不同的并行CPU排序实现 数据: n>=800000000类型的元素int/long/float/double 各种数据分布(例如,均匀/交错/正态/…) 硬件: CPU:2x AMD EPYC 7742,64核(总共128核) 内存:1TB 到目前为止,我已经: std::sort使用std::execution::par_unseq执行策略 \uuu gnu\u parallel::sort,以及 使用OMP后端进行排序 是否有其他已建立的排序实现可以使用源代码

我正在测试不同的并行CPU排序实现

数据:

  • n>=800000000
    类型的元素
    int/long/float/double
  • 各种数据分布(例如,
    均匀/交错/正态/…
硬件:

  • CPU:2x AMD EPYC 7742,64核(总共128核)
  • 内存:1TB
到目前为止,我已经:

  • std::sort
    使用
    std::execution::par_unseq
    执行策略

  • \uuu gnu\u parallel::sort
    ,以及

  • 使用
    OMP
    后端进行排序

是否有其他已建立的排序实现可以使用源代码

我知道,但它的源代码是不可用的,因为它是商业化的

<>什么是最快的并行C++排序实现排序INT/FLASH?

这取决于很多。。。。您可以在自己的C++库中重新实现。 还考虑:

  • 用于在GPGPU上运行小数组的子排序
  • 如果您正在对数百万个数字的阵列进行排序,将子阵列传输(可能使用)到某台云计算中的其他节点(或其他核心)进行排序,然后在排序后的子阵列上运行
  • 使用GCC编译和链接整个应用程序,调用GCC作为
    GCC-Wall-Wextra-O3-flto
    (甚至可能使用它编译)
如果您对这些8G数字了解更多(例如,对于
int
s,您确定所有这些数字都在1到1000000之间,或者所有数字都在-1.0之间 对于
float
s)和3.0,您可以编写更具体的代码。如果你确定他们遵循一些,你可能会编写一些更明智的代码

我的猜测是,考虑因素(例如,如果必须使用)对性能影响很大

一种可能的方法(如果你能花上数周时间来解决这个问题),就是生成几个C++例程,编译它们作为插件和插件,并对它们的性能进行比较和测试。另一种方法是在运行时使用与机器代码生成(using)相结合的技术来生成适合您所拥有的特定数据的排序例程

<>请不要忘记在C++编译器中启用优化:使用最近的编译和链接使用<代码> g++Walth-FLTO-


Pitrat的书和系统可能很有启发性。

检查boost和tbb中的实现。通过测试内核的数量,一些实现被调整为更少的内核。你能在这个有趣的问题上花费多少个月的开发时间?@Marglisse boost和tbb是很好的技巧,我今天也会添加它们。@BasileStrynkevich,这项工作的主要目标是找到使用现有方法进行并行CPU排序的最快基线。您希望在几个月的时间内找到最快的代码?也许可以编辑你的问题来解释你想对什么样的数据(是钱,还是基因组学信息,或者其他什么)进行排序。你需要一个完整的排序,还是你能负担得起输出的不精确性?谢谢!你的回答也使我的问题更加准确。使用加速器或分布式节点不是我的基准测试的目的。不需要对某些分布进行优化,但如果算法在某个分布上表现更好,当然也可以。我们已经有了一个广泛的基准框架,现在正在搜索“正确”的排序实现来插入。当然,我们使用所有的优化。谢谢你的其他建议!我的建议是:为你感兴趣的问题支付一篇博士论文的费用(因此,一位博士候选人工作了4年)