使用NUMA架构的计算机具有不只一个系统总线。每个可用的系统总线都由一组处理器使用。因此,每组处理器都可以访问自己的内存和I/O通道。如前所述,通过合适的协调机制,每组处理器也能够访问其他组处理器所拥有的内存。然而,访问外部NUMA节点的内存显然比访问通过本地系统总线就能访问的内存(即NUMA节点自己的内存)的开销要大。
NUMA硬件需要特别的优化。应用程序必须能够感知NUMA硬件及其配置。通过这种方式,应用程序才能在同一个NUMA节点内运行需要访问相似的内存区域的并发任务和线程。应用程序必须避免昂贵的内存访问,必须在考虑内存需要的前提下优先使用并发。
Windows 7和Windows Server 2008 R2引入了前面提到的处理器组的概念。线程、进程和中断可以指定在某一个内核、处理器、节点或组上执行操作的偏好。然而,在TPC和C#中都不支持这么底层的定义。TPL对NUMA做了优化,能够尽可能地在最合适的内核上运行支持并行的线程,并且能够尽可能地使用本地内存。因此,您编写的并行化代码能够天然地支持NUMA,当然,当支持并行化代码的线程必须访问外部NUMA节点的时候,您仍然会面临一些不希望发生的性能问题。
Coreinfo是一个简单且功能强大的命令行工具,这个工具可以提供有关处理器、组织结构和高速缓存拓扑的非常有用的信息。这个工具可以显示逻辑处理器(或硬件线程)和物理内核之间的映射关系。此外,还能显示NUMA节点、组、插槽以及所有级别的高速缓存。在运行性能测试之前,可以方便地保存底层硬件的信息,然后可以通过性能测试判断NUMA架构是否会导致性能问题。Coreinfo v2.0可以在 http://technet.microsoft.com/en-us/ sysinternals/cc835722.aspx下载到。下载后,解压可执行文件,然后就可以在命令行(Start | All Programs | Accessories | Command Prompt)中运行这个工具。
这个实用工具通过GetLogicalProcessorInformation Windows API获得所有信息并将其显示在屏幕上。程序清单1-1展示了在一台单Intel Core i7微处理器的计算机上运行CoreInfo v2.0的结果。在Logical to Physical Processor Map区域中可以看出,这里具有一个插槽,插槽上有4个物理内核。然而,由于这个CPU提供了Intel Hyper-Threading Technology,因此Coreinfo提示了Hyperthreaded。Coreinfo通过星号(*)表示映射关系。这个例子有4个物理内核,每个物理内核带有两个硬件线程,因此用两个星号表示(**)。此外,还有一个统一的8MB三级高速缓存。8个硬件线程共享这个缓存,因此Coreinfo在Logical Processor to Cache Map区域最后一行左侧显示了8个星号(********),表示这个缓存映射到所有硬件线程及其物理内核。