使用NUMA架構(gòu)的計算機(jī)具有不只一個系統(tǒng)總線。每個可用的系統(tǒng)總線都由一組處理器使用。因此,每組處理器都可以訪問自己的內(nèi)存和I/O通道。如前所述,通過合適的協(xié)調(diào)機(jī)制,每組處理器也能夠訪問其他組處理器所擁有的內(nèi)存。然而,訪問外部NUMA節(jié)點(diǎn)的內(nèi)存顯然比訪問通過本地系統(tǒng)總線就能訪問的內(nèi)存(即NUMA節(jié)點(diǎn)自己的內(nèi)存)的開銷要大。
NUMA硬件需要特別的優(yōu)化。應(yīng)用程序必須能夠感知NUMA硬件及其配置。通過這種方式,應(yīng)用程序才能在同一個NUMA節(jié)點(diǎn)內(nèi)運(yùn)行需要訪問相似的內(nèi)存區(qū)域的并發(fā)任務(wù)和線程。應(yīng)用程序必須避免昂貴的內(nèi)存訪問,必須在考慮內(nèi)存需要的前提下優(yōu)先使用并發(fā)。
Windows 7和Windows Server 2008 R2引入了前面提到的處理器組的概念。線程、進(jìn)程和中斷可以指定在某一個內(nèi)核、處理器、節(jié)點(diǎn)或組上執(zhí)行操作的偏好。然而,在TPC和C#中都不支持這么底層的定義。TPL對NUMA做了優(yōu)化,能夠盡可能地在最合適的內(nèi)核上運(yùn)行支持并行的線程,并且能夠盡可能地使用本地內(nèi)存。因此,您編寫的并行化代碼能夠天然地支持NUMA,當(dāng)然,當(dāng)支持并行化代碼的線程必須訪問外部NUMA節(jié)點(diǎn)的時候,您仍然會面臨一些不希望發(fā)生的性能問題。
Coreinfo是一個簡單且功能強(qiáng)大的命令行工具,這個工具可以提供有關(guān)處理器、組織結(jié)構(gòu)和高速緩存拓?fù)涞姆浅S杏玫男畔?。這個工具可以顯示邏輯處理器(或硬件線程)和物理內(nèi)核之間的映射關(guān)系。此外,還能顯示NUMA節(jié)點(diǎn)、組、插槽以及所有級別的高速緩存。在運(yùn)行性能測試之前,可以方便地保存底層硬件的信息,然后可以通過性能測試判斷NUMA架構(gòu)是否會導(dǎo)致性能問題。Coreinfo v2.0可以在 http://technet.microsoft.com/en-us/ sysinternals/cc835722.aspx下載到。下載后,解壓可執(zhí)行文件,然后就可以在命令行(Start | All Programs | Accessories | Command Prompt)中運(yùn)行這個工具。
這個實用工具通過GetLogicalProcessorInformation Windows API獲得所有信息并將其顯示在屏幕上。程序清單1-1展示了在一臺單Intel Core i7微處理器的計算機(jī)上運(yùn)行CoreInfo v2.0的結(jié)果。在Logical to Physical Processor Map區(qū)域中可以看出,這里具有一個插槽,插槽上有4個物理內(nèi)核。然而,由于這個CPU提供了Intel Hyper-Threading Technology,因此Coreinfo提示了Hyperthreaded。Coreinfo通過星號(*)表示映射關(guān)系。這個例子有4個物理內(nèi)核,每個物理內(nèi)核帶有兩個硬件線程,因此用兩個星號表示(**)。此外,還有一個統(tǒng)一的8MB三級高速緩存。8個硬件線程共享這個緩存,因此Coreinfo在Logical Processor to Cache Map區(qū)域最后一行左側(cè)顯示了8個星號(********),表示這個緩存映射到所有硬件線程及其物理內(nèi)核。