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:得加油,得加油,得加油。