C++17 並行排序初體驗

演算法時空發表於2018-12-03

MSVC篇

微軟在2018年9月份釋出部落格Using C++17 Parallel Algorithms for Better Performance宣佈正式支援C++17的並行演算法。它的使用方法和C++17標準基本一致,不用作太多改動。

由於多核會讓clock_t多次累計,因此計時得換用chrono提供的時間函式。至於究竟使用high_resolution_clock還是system_clock倒是無所謂,因為我們測試資料量較大,用時相對會長一點。

最亮眼的一句是:

#include <execution>
複製程式碼

有了它之後就可以發揮多核計算的效能了。由於沒有在Windows的較高機器配置,僅僅測試了小資料量情況,一次順利通過。

ICC篇

為了在Mac上體驗C++17的並行新特性,我申請了教育版套裝Intel® Parallel Studio XE 2019,其中包含了Intel® C++ Compiler 19.0 for macOS。雖然也有很多使用的曲折,但感覺它將來可以做得更完善一些。

這個編譯器使用很簡單,參考安裝路徑下的這篇幫助即可:

opt/intel/documentation_2019/en/compiler_c/ps2019/get_started_mc.htm
複製程式碼

使用C++編譯器:

icpc source.cpp
複製程式碼

要想體驗並行,可以根據這篇Get Started with Parallel STL的指點配置。使用上基本上都遵循了C++17標準,但是包含標頭檔案得加上pstl。比如要使用並行的演算法algorithm,在原始的標頭檔案基礎上還得追加:

#include <pstl/execution>
#include <pstl/algorithm>
複製程式碼

這點和標準不太一致。

我們考慮對10億個double型隨機數進行排序,採用均勻分佈。一行程式碼即可:

std::sort(std::execution::par, V.begin(), V.end());
複製程式碼

實測速度是非常的驚人:11秒!

由於使用了並行排序,實際佔用記憶體量會更大且每次執行不同,但不會超過原有向量兩倍也即15GB。這說明了記憶體很重要。

其他

clang和gcc:得加油,得加油,得加油。