簡體   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