使用 linux perf 工具测量应用程序的 FLOP
Posted
技术标签:
【中文标题】使用 linux perf 工具测量应用程序的 FLOP【英文标题】:Measuring FLOPs of an application with the linux perf tool 【发布时间】:2010-12-02 12:34:08 【问题描述】:我想测量一些应用程序使用“perf”执行的浮点数和算术运算的数量,这是 linux 性能计数器子系统的新命令行接口命令。 (出于测试目的,我使用了我创建的一个简单的虚拟应用程序,见下文)。
因为我找不到为测量 FP 和整数运算定义的任何“性能”事件,我开始挖掘原始硬件事件代码(与 -rNNN 一起使用,其中 NNN 是事件代码的十六进制值)。所以我真正的问题是,我为退役指令(INST_RETIRED)找到的代码没有区分 FP 和其他指令(X87 和 MMX/SSE)。当我尝试对特定代码使用适当的 umask 时,我发现不知何故“perf”不理解或不支持 umask 包含。我试过了:
% perf stat -e rC0 ./a.out
这给了我退休的指示,但是
% perf stat -e rC002 ./a.out
应该给我执行的 X87 指令说我提供了错误的参数。也许是这样,但是将原始硬件事件的 umask 与“perf”一起使用的正确方法是什么?一般来说,使用 perf 工具获得程序执行的浮点和整数运算的确切数量的方法是什么?
非常感谢, 康斯坦丁·博亚诺夫
这是我的测试应用:
int main(void)
float numbers[1000];
float res1;
double doubles[1000];
double res2;
int i,j=3,k=42;
for(i=0;i<1000;i++)
numbers[i] = (i+k)*j;
doubles[i] = (i+j)*k;
res1 = numbers[i]/(float)k;
res2 = doubles[i]/(float)j;
【问题讨论】:
【参考方案1】:要使用的事件取决于处理器。您可以使用 libpfm4 (http://perfmon2.git.sourceforge.net/git/gitweb-index.cgi) 来确定哪些是可用的事件(使用 showevinfo 程序),然后从同一发行版中 check_events 找出原始的事件的代码。我的 Sandy Bridge CPU 支持 FP_COMP_OPS_EXE 事件,我根据经验发现该事件与 FLOP 计数密切相关。
【讨论】:
【参考方案2】:我不确定性能,但 oprofile 具有适用于许多处理器的浮点事件。可能会有一些重叠,因为 INST_RETIRED 也是一个有效的 oprofile 事件。
【讨论】:
以上是关于使用 linux perf 工具测量应用程序的 FLOP的主要内容,如果未能解决你的问题,请参考以下文章
用于测量 Linux 中 NUMA 节点缓存未命中/命中的工具?