本博文为原创,遵循CC3.0协议,转载请注明出处:http://blog.csdn.net/lux_veritas/article/details/24766015
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Bandwidth是一款内存带宽基准測试程序,主要针对x86及x86_64平台,通过顺序读写与随机读写不同大小的数据块,測试系统的内存带宽性能。
Bandwidth提供了一套汇编语言实现的支持库,用来完毕体系结构相关的特定操作,比如读取某些寄存器的内容。
利用该汇编库,检測当前系统CPU的型号及支持的特性,并选择对应的工作模式,如笔者机器的CPU为:
CPU family: GenuineIntel CPU features: MMX SSE SSE2 SSE3 SSSE3 SSE4.1 SSE4.2 XD Intel64在主程序执行时,依据CPU特性选择工作模式:
if (mode == SSE2) { print (L"(128-bit), size = "); } else if (mode == AVX) { print (L"(256-bit), size = "); } else { #ifdef __x86_64__ print (L"(64-bit), size = "); #else print (L"(32-bit), size = "); #endif }笔者的CPU支持SSE2,不支持AVX,故採用128bit的数据位宽进行对应的内存读写操作。
以笔者的机器为例,測试主要分为下面几个部分:
|-------|128bit |64bit |
|:-----:|:-----:|:----:|
|顺序读 | | |
|随机读 | | |
|顺序写 | | |
|随机写 | | |
能够选择是否旁路掉各级cache,笔者机器的CPU cache情况例如以下:
Cache 0: L1 data cache, line size 64, 8-ways, 64 sets, size 32k Cache 1: L1 instruction cache, line size 64, 8-ways, 64 sets, size 32k Cache 2: L2 unified cache, line size 64, 16-ways, 4096 sets, size 4096k
用于读写的数据块大小从128B逐渐增大到128MB,因为各级cache的大小不同,进行内存读写时,较小的数据块会存放在cache中,较大的数据块则会经过cache存放在主存中。所以,随着数据块大小的添加,在几个节点上带宽的大小会有明显的跳变,主要原因就是到达了各级cache的容量上限,而转向下层存储。bandwidth会将測试结果生成一个日志文件,一张图表,这样的带宽的跳变在图表中有最直观的表现。如图,在32KB与4MB处带宽有明显的下降趋势