陆续写些关于新书《自己动手写CPU》的博客,本篇主要是讲解如何使用llcbench测试缓存性能。
LLCbench (底层表征基准测试 Low-Level Characterization Benchmarks) 是一个基准测试工具,集成了 MPBench, CacheBench, 和 BLASBench 测试方法。这里只使用其中的CacheBench测试缓存性能。
在http://icl.cs.utk.edu/projects/llcbench/llcbench.tar.gz下载LLCbench。
然后解压缩,以/root/gem5/llcbench为例。打开终端,进入该路径,输入make,会出现如下提示
Please use one of the following targets: alpha alpha-mpich linux-lam linux-mpich o2000 pow2 pow3 ppc solaris solaris-mpich t3e reconfig (to bring this menu up again)
在这里选择linux-lam,所以输入
make linux-lam
显示如下结果:
ln -s conf/sys.linux-lam sys.def
再次输入make,显示如下:
Please use one of the following targets: For all three : compile, run, script, graph, clean, clobber, reconfig For BlasBench : blas-bench, blas-run, blas-script, blas-graph For CacheBench: cache-bench, cache-run, cache-script, cache-graph For MPBench : mp-bench, mp-run, mp-script, mp-graph clean: removes object files and leaves result files clobber: removes binary files and leaves result files distclean: removes everything!
因为是三个工具的和集,所以输入make compile会编译全部三个软件,笔者在make compile的时候发现编译BlasBench会报错,提示找不到g77,CentOS7没有g77安装包,于是决定只编译CacheBench,所以输入如下命令:
make cache-bench
然后输入:
make bench-run
这样就开始测试了,大约需要等待40分钟左右,在这个过程中,最好不要操作计算机,同时在开始这个测试之前,最好关掉一些不用的程序,笔者第一次测试的时候,就因为内存不足,而失败,提示cachebench: cachebench.c:712: do_memory_copy: Assertion `y = (void *)malloc(memsize)‘ failed,后来关掉了耗内存的firefox,测试顺利结束。
测试过程显示如下:
cd cachebench; make run make[1]: 进入目录“/root/gem5/llcbench/cachebench” ln -s ../results results Measuring Read... ./cachebench -m 29 -e 1 -x 2 -d 5 -r > results/localhost.localdomain-x86_64_cache_read.dat Measuring Write... ./cachebench -m 29 -e 1 -x 2 -d 5 -w > results/localhost.localdomain-x86_64_cache_write.dat Measuring RMW... ./cachebench -m 29 -e 1 -x 2 -d 5 -b > results/localhost.localdomain-x86_64_cache_rmw.dat Measuring Tuned Read... ./cachebench -m 29 -e 1 -x 2 -d 5 -tr > results/localhost.localdomain-x86_64_cache_handread.dat Measuring Tuned Write... ./cachebench -m 29 -e 1 -x 2 -d 5 -tw > results/localhost.localdomain-x86_64_cache_handwrite.dat Measuring Tuned RMW... ./cachebench -m 29 -e 1 -x 2 -d 5 -tb > results/localhost.localdomain-x86_64_cache_handrmw.dat Measuring memset()... ./cachebench -m 29 -e 1 -x 2 -d 5 -s > results/localhost.localdomain-x86_64_cache_memset.dat Measuring memcpy()... ./cachebench -m 29 -e 1 -x 2 -d 5 -p > results/localhost.localdomain-x86_64_cache_memcpy.dat
可见,实际是运行了八次,分别是read、write、rmw、handread、handwrite、handrmw、memset、memcpy。
然后输入命令:
make cache-script
然后输入命令:
make cache-graph
如果出现“ gnuplot: 未找到命令” 的错误,那是因为没有安装gnuplot的缘故,使用yum install gnuplot安装即可,然后再次运行上面的make caceh-graph命令,即可得到图形结果。
cd cachebench; make graph make[1]: 进入目录“/root/gem5/llcbench/cachebench” cd results; gnuplot < localhost.localdomain-x86_64_cache.gp > localhost.localdomain-x86_64_cache.ps Memory heirarchy graph is in results/localhost.localdomain-x86_64_cache.ps make[1]: 离开目录“/root/gem5/llcbench/cachebench”
笔者的结果如下:
可以发现在32KB的时候有一个明显的拐点,使用 lscpu 命令查看系统的缓存情况,显示如下:
Architecture: x86_64 CPU op-mode(s): 32-bit, 64-bit Byte Order: Little Endian CPU(s): 2 On-line CPU(s) list: 0,1 Thread(s) per core: 1 Core(s) per socket: 2 座: 1 NUMA 节点: 1 厂商 ID: GenuineIntel CPU 系列: 6 型号: 23 型号名称: Pentium(R) Dual-Core CPU E5800 @ 3.20GHz 步进: 10 CPU MHz: 3203.000 BogoMIPS: 6384.21 虚拟化: VT-x L1d 缓存: 32K L1i 缓存: 32K L2 缓存: 2048K NUMA 节点0 CPU: 0,1
一级缓存正是32KB。在1级cache失效的时候,二级cache发挥了作用,所以图中在32KB到512KB、1MB之间还有一个稍微平滑的阶段,过了这个阶段之后,优惠出现了一个拐点。
有一一个疑问:我的处理器的二级缓存是2MB,是指令和数据共用,按理说应该在2MB左右出现拐点才对,为何实验结果在512KB-1MB之间就出现了拐点?