我想使用“perf”(Linux 性能计数器子系统的新命令行接口命令)来测量某些应用程序执行的浮点和算术运算的数量。 (出于测试目的,我使用了我创建的一个简单的虚拟应用程序,请参见下文)。
因为我找不到任何为测量 FP 和整数运算而定义的“perf”事件,所以我开始挖掘原始硬件事件代码(与 -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;
}
}
要使用的事件取决于处理器。您可以使用 libpfm4 (http://perfmon2.git.sourceforge.net/git/gitweb-index.cgi) 来确定哪些是可用事件(使用 showevinfo 程序),然后使用同一发行版中的 check_events 来找出原始事件事件的代码。我的 Sandy Bridge CPU 支持 FP_COMP_OPS_EXE 事件,我根据经验发现该事件与 FLOP 计数密切相关。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)