lmbench有很多测试集, lat_mem_rd是用来测试内存延迟的
使用方法
./bin/x86_64-linux-gnu/lat_mem_rd 1 16
./bin/x86_64-linux-gnu/lat_mem_rd 1(范围, 单位M) 16(步长)
"stride=16
0.00049 1.584(单位M, 512字节范围内, 步长16访问延迟, 为什么显示0.00049, 512/1024/1024)
源代码(fprintf(stderr, "%.5f %.3fn", range / (1024. * 1024.), result);)
0.00098 1.583
0.00195 1.593
0.00293 1.593
0.00391 1.597
0.00586 1.598
0.00781 1.600
0.01172 1.600
0.01562 1.602
0.02344 1.602
0.03125 1.628
0.04688 2.230
0.06250 2.207
0.09375 2.205
0.12500 2.204
0.18750 2.237
0.25000 2.278
0.37500 2.326
0.50000 2.351
0.75000 2.345
1.00000 2.349
测试原理
如果光光使用lat_mem_rd来跑得出一个结果, 不了解测试细节的话, 很多东西都理解还不深刻, lat_mem_rd的延迟测试的代码是这样写的
#define ONE p = (char **)*p;
#define FIVE ONE ONE ONE ONE ONE
#define TEN FIVE FIVE
#define FIFTY TEN TEN TEN TEN TEN
#define HUNDRED FIFTY FIFTY
while (iterations-- > 0) {
for (i = 0; i < count; ++i) {
HUNDRED;
}
}
用指针指向下一个内存地址空间来循环访问, 比如说0.00049 1.584, 这个结果就是在512字节范围内, 步长16来一直循环访问, 最后时间除以访问次数就是延迟
范围超过l1 cache的32k的时候, 会有一个阶级变化