觀念的分享
NUMA (Non-Uniform Memory Access) 的設計簡化了匯流排的複雜程度,
NUMA 把系統切成數個節點 (node),每個處理器及記憶體就位在某一個節點上,當處理器存取同一個節點的記憶體時,可以有較高的存取速度;而存取其他節點的記憶體時,就需要透過節點間的資料傳遞,會耗費較多時間。
作業系統中為了提高記憶體存取的效率,會針對硬體的 NUMA 配置來設定記憶體存取的策略 (policy),並提供 NUMA 相關的程式介面 (API) 來查詢系統 NUMA 配置和修改存取策略。
以 GNU Linux 為例,作業系統的核心 (kernel) 在2.6版後,就會依據硬體架構的 NUMA 設計,進行記憶體的配置,並提供 NUMA 相關的系統呼叫函式 (system call) 供程式使用;在 /proc 這個程序虛擬檔案系統 (proc file system) 裡,也有 numa_maps 檔案可以查詢某個程序 (process) 的記憶體配置。另外也有 numactl 指令,可以查詢系統的 NUMA 狀況及改變記憶體配置的策略。
因為 NUMA 架構的影響,當利用共享記憶體進行需要資料交換的平行計算時,如果進行計算的執行緒在不同節點的核心的話,共享記憶體存取的效率就會下降,所以需要了解每個執行緒是被那一個核心所執行。在 Linux 的環境中,要觀察目前正在執行的程式狀態可以使用 top 指令,配合-H參數可以顯示所有的執行緒,進入 top 指令的介面後,打開 Last used CPU 的資訊,就可以了解每一個執行緒是被那一個核心執行的。
參考 numactl 指令得到的 NUMA 架構資訊,可以知道每一個核心所屬的節點和每個節點的記憶體配置,利用這些資訊就能規劃執行緒與核心的分配。
進一步對 NUMA 了解,可參考此文
http://technet.microsoft.com/zh-tw/l.../ms345345.aspx
本文參考文章
周秉誼 / 臺灣大學計算機及資訊網路中心作業管理組碩士後研究人員
http://www.cc.ntu.edu.tw/chinese/epa...01220_1508.htm