我現在在不同的機器上運行多執行緒 C 代碼。我在 Matlab mex 函式中使用它,所以整個程式是從 MatLab 運行的。我在這里使用了這個鏈接中的代碼,只改變了“main_loop”中所做的事情以適應我的任務。該代碼在我的兩臺計算機上運行得非常好,并且比將相同的 C 代碼作為單執行緒運行要快很多倍。所以我認為程式本身很好。
但是,當我在第三臺機器上運行相同的東西時,它突然變得非常慢。單執行緒版本很好,但多執行緒版本需要 10-15 倍的時間。現在,由于其他計算機上的一切似乎都很好,我的猜測是它與第三臺機器的規格有關(詳細資訊見下文)。我的猜測:第三臺計算機有兩個物理處理器。我想這需要將所有內容物理復制到兩個處理器?(原始代碼是有意撰寫的,因此不需要任何相關變數的硬拷貝)如果是這樣,有沒有辦法控制在哪個處理器上打開執行緒?(如果我可以將自己限制在一個 CPU 上并避免復制所有內容,那已經很有幫助了)我已經嘗試將執行緒數設定為 2,但這沒有幫助。
2-CPU計算機規格:
- Intel Xeon Silver 4210R,2.40Ghz(2 次),128 GB Ram 64 位,Windows 10 Pro
其他電腦規格:
- 英特爾酷睿 i7-8700、3.2Ghz、64 GB 記憶體 64 位、Windows 10 專業版
- 英特爾酷睿 i7-10750H、2.6Ghz、16 GB 記憶體 64 位、Windows 10 專業版、筆記本電腦
uj5u.com熱心網友回復:
TL;DR: NUMA 效果與錯誤共享相結合很可能僅在 2 插槽系統上產生觀察到的效果。用于確認/反駁假設的低級分析資訊。
多處理器系統受NUMA 影響。非統一記憶體訪問平臺由具有自己本地記憶體的 NUMA 節點組成。訪問另一個節點的記憶體更昂貴(更高的延遲或/和更小的吞吐量)。位于訪問同一 NUMA 節點記憶體的多個 NUMA 節點上的多個執行緒/行程可能會使它飽和。
分配的記憶體被拆分為映射到 NUMA 節點的頁面。確切的映射策略非常依賴于作業系統 (OS)、其配置和目標行程之一。第一次接觸政策很常見。這個想法是在 NUMA 節點上分配頁面,在目標頁面上執行第一次訪問。關于目標選擇的策略,作業系統可以根據遠程 NUMA 節點訪問量將頁面從一個 NUMA 節點遷移到另一個節點。控制策略在 NUMA 平臺上至關重要,尤其是在應用程式不支持 NUMA 的情況下。
由于快取一致性協議和高性能處理器間通信網路(在您的情況下為超路徑互連),多個 NUMA 節點的記憶體保持一致。快取一致性也適用于同一處理器的內核之間。問題是將快取線從一個內核的(L2 快取)移動到另一個(L2 快取)比將它從一個處理器的(L3 快取)移動到另一個(L3 快取)要快得多。這是人類交流的一個類比:不同皮層區域的神經元交流的速度比兩個人在一起的速度要快。
如果您的應用程式在同一快取行上并行運行,則錯誤共享可能會導致快取行反彈效應,這種效應在分布在不同處理器上的執行緒之間更加明顯。
這是一個非常復雜的話題。話雖如此,您可以使用像 VTune(或在 Linux 上)這樣的低級分析器來分析這些影響。perf這個想法是分析低級性能硬體計數器,例如 L2/L3 快取未命中/命中、RFO、遠程 NUMA 訪問等。對于不熟悉處理器和作業系統如何作業的人來說,這可能是復雜而乏味的,但 VTune 可以幫助少量。請注意,英特爾有一些更具體的工具可以分析(更容易)通常發生在并行應用程式上的特定影響。AFAIK,它們是英特爾 XE 應用程式集的一部分(不是免費的)。最好的辦法是避免使用填充錯誤共享,設計您的應用程式,使每個執行緒都應該在自己的記憶體位置上運行盡可能多地(即良好的區域性)來控制 NUMA 分配策略并最終將執行緒/行程系結到核心(以避免意外遷移)。
實驗基準也可以用來快速檢查是否出現 NUMA 效應和錯誤共享。例如,您可以將所有執行緒/行程系結在同一個 NUMA 節點上,并告訴作業系統在該 NUMA 節點上分配頁面。這使您能夠找到與 NUMA 效果相關的問題。另一個例子是將兩個執行緒/行程系結在相同物理內核的兩個不同邏輯內核(即硬體執行緒)上,然后系結到不同的物理內核上,以查看性能是否受到影響。這可以幫助您找到虛假共享問題。話雖如此,此類實驗可能會受到許多其他影響的影響,這些影響會增加噪聲并使大型應用在實踐中的分析非常復雜。因此,基于硬體性能計數器的低級分析更好。
請注意,某些處理器(如 AMD Zen 處理器)由多個子部分(稱為 CCD/CCX)組成,即使只有一個處理器和一個插槽,也可以看到具有多個 NUMA 節點。這樣的架構在未來肯定會變得更加普遍。事實上,Intel 也開始朝著這個方向發展Sub-NUMA Clustering。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/482583.html
上一篇:c#讓我的特定行在x秒后超時c#
