首页 > 代码库 > Bandwidth内存带宽测试工具

Bandwidth内存带宽测试工具

本博文为原创,遵循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处带宽有明显的下降趋势