我想知道std::sort
中c++11
的实现。我有一个MPI
管理的并行代码,其中每个等级将文件中的数据读取到向量A
中,该向量需要排序。每个等级都会调用std::sort
来执行此操作。
当我用〜100个等级运行此命令时,有时调用std::sort
会挂一个等级。最终,我意识到它没有挂起,只是花了很长时间。也就是说,一个等级的排序时间要比其他所有等级高200倍左右。
起初,我怀疑这是一个负载平衡问题。不,我已经彻底检查了每个等级A
的大小是否尽可能平衡。
我已经得出结论,这可能只是一个等级的初始条件为A
,从而实现了worst-case performance of quicksort之类的东西(或至少是非理想情况)。
我为什么这么认为?
MPI
的配置(由于每个等级的A
的内容受到干扰,因为它来自读取的文件),该问题就会消失,或者它可能会转移到其他等级。std::sort
更改为std::stable_sort
(不再使用quicksort算法),那么一切都很好。但是,通过在每次迭代中选择一个 random 枢轴点来实现快速排序似乎是最明智的。如果std::sort
就是这种情况,那么在许多迭代中从A
中随机选择一个最坏情况的值将是绝对不可能的(这将导致200倍的性能下降)。
因此,我的观察结果表明std::sort
实现了一个固定的快速排序枢轴值(例如,始终选择数组中的第一个值或类似的值)。这是我所看到的行为可能发生的唯一方法,并且在相同的MPI
配置上重新运行时,它也会给出一致的结果(确实如此)。
我对这个结论是否正确?我确实找到了std
的源,但是sort
函数是完全不可读的,并且对各种辅助函数进行了过多的调用,所以我宁愿避开兔子洞。除此之外,我正在HPC系统上运行,我什至还不清楚如何确定确切链接到mpicxx
的内容。我找不到任何描述算法实现的文档
答案 0 :(得分:5)
std::sort
是特定于实现的。
从C ++ 11开始,常规的快速排序不再是有效的实现,因为所需的复杂度从平均值的O(N log N)
变为O(N log N)
。