C++std::排序实现

C++ std::sort implementation

本文关键字:实现 排序 C++std      更新时间:2023-10-16

我想知道std::sortc++11中的实现。我有一个MPI管理的并行代码,其中每个列将文件中的数据读取到需要排序的向量A中。每个列都会调用std::sort来执行此操作。

当我用大约100个秩运行这个时,有时有一个秩挂在对std::sort的调用上。最终,我意识到,它并没有挂起来,只是需要很长时间。也就是说,一个等级的排序时间是其他等级的200倍。

起初我怀疑这是一个负载平衡问题。不,我已经彻底检查了每个等级的A的大小是否尽可能平衡。

我已经得出结论,这可能只是一个秩具有A的初始条件,这样就实现了快速排序的最坏情况性能(或者至少是非理想情况)。

我为什么这么想?

  • 如果我更改MPI配置(从而干扰每个列组的A内容,因为它来自文件读取),问题就会消失,或者它可以转移到其他列组
  • 如果我将std::sort更改为std::stable_sort(不再使用快速排序算法),那么一切都很好

然而,通过在每次迭代中选择随机枢轴点来实现快速排序似乎是最明智的。如果std::sort是这种情况,那么在多次迭代中,从A中随机选择最坏情况下的值是不太可能的(这将导致200倍的性能命中)。

因此,我的观察结果表明,std::sort实现了一个固定的快速排序枢轴值(例如,总是选择数组中的第一个值,或者类似的值)。这是我所看到的行为可能发生的唯一方式,并且在相同的MPI配置上重新运行时也会给出一致的结果(确实如此)。

我的结论正确吗?我确实找到了std的源代码,但sort函数完全不可读,并且对各种辅助函数进行了过多的调用,我宁愿避免兔子洞。除此之外,我在HPC系统上运行,我甚至不清楚如何确定mpicxx到底链接到了什么。我找不到任何描述算法实现的文档

std::sort是特定于实现的。

而且,由于所需的复杂性从平均值上的O(N log N)转移到O(N log N),因此自C++11以来,常规快速排序不再是有效的实现。