使用Intel性能调试工具测量Xeon® 5500 Series平台上内存访问的带宽

基于新一代Nehalem架构的Intel® Xeon®5500处理器改变了传统的FSB(front-side-bus)设计,使用的是NUMA(non-uniform memory access) 架构以增强内存访问的带宽。

以前写过一篇如何在Nehalem架构上用Intel® VTune™ Performance Analyzer性能计数器MEM_UNCORE_RETIRED.REMOTE_DRAM测量多线程应用程序中由于等待IMC(Integrated memory controller)与 I/O Hub交互造成的额外开销。详见 - /zh-cn/blogs/2009/12/25/intel-core-i7-processor-numa

但有时我们关心的是程序运行的一段时间内,内存访问的带宽饱和情况。这会对程序的性能有很大的影响。

在Core(TM)2 Duo 的架构下,我们可以用如下公式得到内存带宽的数据:

(64 * BUS_TRANS_MEM.ALL_AGENTS * CPU Frequency) / CPU_CLK_UNHALTED.CORE

可是在Nehalem架构的处理器上,Uncore部分可为各个Core共享 – 如LLC,IMC,QPI等。我们不能简单使用上述公式。基本的计算带宽的公式应该是

Memory Bandwidth = 1.0e-9 * (UNC_IMC_NORMAL_READS.ANY+UNC_IMC_WRITES.FULL.ANY)*64 / (wall clock time in seconds)

遗憾的是UNC_系列的性能计数器不被Intel性能调试工具直接支持,也不能够使用Event based sampling 来采集数据。用户必须下载Intel® Performance Tuning Utility 及补丁程序(其中包含了uncore.bat 示例)- 见/en-us/articles/how-do-i-measure-memory-bandwidth-on-an-intel-core-i7-or-xeon-5500-series-platform-using

最后得到bandwidth.txt 结果, 如:

Version Info: Sampling Enabling Product version: 2.9.devbuild (private) built on Mar 18 2009 02:53:25 P:Intel® Core™ i7 Processor M:14 S:1

UNC_IMC_WRITES.FULL.ANY    42,663,832,344  1,371,808  1,371,566  1,371,685     1,371,684  1,371,597  1,371,589  1,371,665  1,371,662

UNC_IMC_NORMAL_READS.ANY   42,663,832,420  3,613,851  3,612,901  3,613,353     3,613,353  3,612,910  3,612,807  3,613,207  3,613,207

----------

20.06s real            0.750s user       159.625s system        157.390s idle

补充说明:

用户可以修改命令行“sep -start -d %TIME% -ce -ec UNC_IMC_WRITES.FULL.ANY, UNC_IMC_NORMAL_READS.ANY -out bandwidth” 在uncore.bat, 如

sep -start -ce -ec UNC_IMC_WRITES.FULL.ANY, UNC_IMC_NORMAL_READS.ANY -app "c:\Program Files (x86)\Intel\VTune\Examples\VTuneDemo\Release\vtundemo.exe" -out bandwidth

分类:
如需更全面地了解编译器优化,请参阅优化注意事项