
介绍
perf是一个测试CPU运行时各项指标(比如cache-miss,band-width)的工具。perf从CPU的Performance Monitor Unit(PMU)计数器中读取这些信息,然后输出。
注意:由于各个厂家的生产CPU的标准不同,perf读取的性能种类也会有一定的差别。
矩阵乘法
在这里主要测试三种矩阵乘法的相关性能——传统乘法、分治算法、Strassen算法。程序都使用C语言写成。
矩阵乘法不是重点,我把代码放在最后了。
perf测试
三种矩阵乘法的程序使用gcc编译之后命名为p1、p2、p3,使用下面三条指令测试三个程序的相关性能:
$ sudo perf stat ./p1
$ sudo perf stat ./p2
$ sudo perf stat ./p3
以p1的结果为例,perf输出如下
Performance counter stats for './p1 -e cache-misses':
176.70 msec task-clock # 0.990 CPUs utilized
26 context-switches # 0.147 K/sec
1 cpu-migrations # 0.006 K/sec
396 page-faults # 0.002 M/sec
397,184,949 cycles # 2.248 GHz (81.90%)
566,738 stalled-cycles-frontend # 0.14% frontend cycles idle (83.25%)
269,961,726 stalled-cycles-backend # 67.97% backend cycles idle (84.20%)
1,103,594,689 instructions # 2.78 insn per cycle
# 0.24 stalled cycles per insn (84.17%)
27,099,584 branches # 153.369 M/sec (84.18%)
101,006 branch-misses # 0.37% of all branches (82.29%)
0.178496560 seconds time elapsed
0.177966000 seconds user
0.000000000 seconds sys
三个乘法算法的比较
我是AMD Ryzen 5 3500U的CPU。貌似它不支持cache-miss

最终三个矩阵乘法的算法的部分性能如下。传统算法是300 * 300的矩阵,剩下两种都是512 * 512的矩阵,因此可能在总体数据上不能和传统乘法作比较,但是在平均值上还是可以比较的。

附录代码
传统矩阵乘法
#include
分治算法
#include
Strassen算法究极长,我放在网站上了