在具有英特爾 CPU 銷售的“6 核 / 12 執行緒”的計算機上,我想運行盡可能多的行程,每個行程都使用不同的輸入資料進行數學相似的計算(每個行程都有一個執行緒)。不涉及 GPU,也不需要行程間通信。
執行數學計算的同一可執行檔案的最佳并行行程數是多少?
我應該運行 6 個行程(每個物理核心一個)嗎?還是 12 個行程(每個執行緒/虛擬核心一個)?
如果一個行程每秒進行 1000 次計算,我很確定運行其中的 6 個行程每個將以 ~1000/sec 的速度運行(因此總共 ~6000/sec)。
但是,運行 12 個行程不會使它們每秒鐘只進行 500 次計算嗎?
TL;DR:我應該在“6 核/12 執行緒 Intel CPU”上每個“核心”運行一個行程還是每個“執行緒”運行一個行程?
uj5u.com熱心網友回復:
它非常依賴于實際的計算代碼。有些應用程式可以從超執行緒中受益,而有些則不能。高性能應用程式很少從超執行緒中受益,因此假設代碼受計算限制且可擴展性良好,每個內核使用 1 個行程無疑是最佳配置。
最新英特爾處理器(例如 Skylake/Icelake)的多個超執行緒可以共享一些執行埠。因此,如果一個行程無法使埠飽和,則整體執行速度會更快。在實踐中,這有點復雜(現代處理器非常復雜),因為計算系結行程可以被處理器的其他部分系結,例如指令解碼或更棘手的低級單元。
例如,以下 C 代碼應該受益于超執行緒(假設沒有應用快速數學優化并且代碼是經過優化的編譯器):
float sum = 0.f;
for(int i=0 ; i<maxi ; i)
sum = array[i];
實際上,浮點加法指令的延遲是 3 到 4 個周期,而通常每個周期可以執行 2 個(在 Skylake 之前只有 1 個)。這意味著代碼受加法指令鏈的延遲約束。超執行緒可以在這段時間內使用等待執行埠,從而使執行速度提高兩倍(其他瓶頸導致實際執行速度不那么快)。如果使用快速數學優化對代碼進行了優化,那么編譯器可以展開回圈并利用指令級并行(IPC)。低 IPC 通常意味著使用超執行緒可能是有益的,特別是如果這種低 IPC 的原因是由于延遲問題(例如指令延遲和快取未命中)。不幸的是,這并不總是正確的。例如,下面的代碼不應該使用超執行緒更快:
for(int i=0 ; i<maxi ; i)
out_array[i] = in_array[i];
這是因為英特爾處理器上通常有 1 個執行存盤埠,并且它應該已經被 1 個超執行緒飽和(否則它應該是記憶體吞吐量限制,這對于超執行緒來說并不是更好)。因此使用更多的超執行緒不應該提高執行時間。事實上,超執行緒引入了輕微的開銷,這會導致執行速度稍慢。
問題是應用程式通常比這復雜得多,而且人們不知道數學函式是如何實作的。因此,除非計算內核很簡單,否則開發人員幾乎不可能在沒有基本基準的情況下知道什么是最佳配置。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/480781.html
上一篇:如何知道彈性搜索集群容量?
下一篇:cython加速3d串列操作
