繁体   English   中英

C ++ std :: sort实现

[英]C++ std::sort implementation

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

当我用〜100等级运行此命令时,有时在调用std::sort会挂一个等级。 最终,我意识到它没有挂起,只是花了很长时间。 也就是说,一个等级的排序时间要比其他等级长200倍左右。

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

我已经得出结论,这可能只是一个等级的初始条件为A ,从而实现了快速排序最坏情况 (或至少是非理想情况)之类的事情。

我为什么这么认为呢?

  • 如果我更改了MPI配置(由于每个等级A的内容都来自读取的文件,因此它会受到干扰),问题就会消失,或者它可能会转移到其他等级。
  • 如果我将std::sort更改为std::stable_sort (不再使用quicksort算法),那么一切都很好。

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

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

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

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

而且,由于C ++ 11,普通快速排序不再是一个有效的实现从所需的复杂性举动O(N log N)上的平均 O(N log N)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM