lmbench套件
操作手册,里面介绍了每个程序的参数怎么写,作用是什么,输入输出有哪些。
下载和构建
gcc -O -DRUSAGE -DHAVE_uint=1 -DHAVE_int64_t=1 -DHAVE_DRAND48 -DHAVE_SCHED_SETAFFINITY=1 -c lib_tcp.c -o ../bin//lib_tcp.o
In file included from lib_tcp.c:9:
bench.h:38:10: 致命错误:rpc/rpc.h:没有那个文件或目录
38 | #include <rpc/rpc.h>
| ^~~~~~~~~~~
编译中断。
gmake[1]: *** [Makefile:246:../bin//lib_tcp.o] 错误 1
gmake[1]: 离开目录“/home/admin/logs/mba_yl/lmbench3/src”
make: *** [Makefile:114:lmbench] 错误 2
$ yum install libtirpc-devel
$ find /usr -name "rpc.h"
/usr/include/gssrpc/rpc.h
/usr/include/tirpc/rpc/rpc.h
$ find /usr -name "libtirpc.so*"
/usr/lib64/libtirpc.so.3.0.0
/usr/lib64/libtirpc.so
/usr/lib64/libtirpc.so.3
这里需要对Makefile做一定的修改
CFLAGS += -I/usr/include/tirpc # 确保编译器能找到 rpc/rpc.h
LDFLAGS += -L/usr/lib64 -ltirpc # 链接 libtirpc 库
@env CFLAGS=-O MAKE="$(MAKE)" ...
# 替换为
@env CFLAGS="$(CFLAGS)" MAKE="$(MAKE)" ...
lat_mem_rd
这个工具会逐渐增加内存访问的步长,开始时步长很短,得到的延迟是一级、二级缓存、LLC的缓存访问延迟;之后步长增加就得到了内存访问的延迟。
由于程序逐渐增加步长,其实一次测试还比较费时常,如果只想测某一部分的,可以修改这个程序的step函数以调整步长。
这里是部分测试数据,这个数据前面是内存访问步长,后面是对应的延迟,单位ns
484.00000 109.938
488.00000 107.705
492.00000 110.366
496.00000 108.049
500.00000 107.005
504.00000 108.194
508.00000 106.910
512.00000 108.315
bw_mem
输出数据第一个表示测试内存块大小,第二个表示理论带宽值。
调整-p参数的大小将产生不同大小的内存带宽。
自己写的内存带宽压力测试程序
指针追逐(pointer chasing)模式来制造内存访问压力。通过创建内存地址间的相互引用,强制CPU按特定顺序访问内存,使得缓存无效。并且启动多线程,同时多个内存访问请求,进一步增加带宽压力。
char* mem = mmap(NULL, memsize, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
// 创建指针追逐结构
for (i = 0; i < size - 1; i++)
*(char **)&mem[indices[i]*stride] = (char*)&mem[indices[i+1]*stride];
*(char **)&mem[indices[size-1]*stride] = (char*)&mem[indices[0]*stride];
初始化阶段可以用嵌套宏展开,也会产生大量内存访问指令。
STREAM
$ yum install gcc-gfortran
$ export OMP_NUM_THREADS=64; taskset -c 0-63 ./stream_c.exe
-------------------------------------------------------------
This system uses 8 bytes per array element.
-------------------------------------------------------------
Array size = 10000000 (elements), Offset = 0 (elements)
Memory per array = 76.3 MiB (= 0.1 GiB).
Total memory required = 228.9 MiB (= 0.2 GiB).
Each kernel will be executed 10 times.
The *best* time for each kernel (excluding the first iteration)
will be used to compute the reported bandwidth.
-------------------------------------------------------------
Number of Threads requested = 64
Number of Threads counted = 64
-------------------------------------------------------------
Function Best Rate MB/s Avg time Min time Max time
Copy: 166481.9 0.001047 0.000961 0.001155
Scale: 158425.1 0.001166 0.001010 0.001274
Add: 144154.8 0.001820 0.001665 0.001890
Triad: 142683.6 0.001728 0.001682 0.001767
-------------------------------------------------------------