使用Linux perf工具测量应用程序的FLOPs

5

我想使用“perf”来测量某个应用程序执行的浮点和算术操作数量,这是 Linux 性能计数子系统的新命令行接口。 (为了测试目的,我使用了一个简单的虚拟应用程序,如下所示)。

由于我找不到任何用于测量浮点和整数操作的“perf”事件,因此我开始深入研究原始硬件事件代码(用于-rNNN,其中NNN是事件代码的十六进制值)。 所以我的真正问题是,我找到的退休指令代码(INST_RETIRED)没有区分FP和其他指令(X87和MMX / SSE)。 当我尝试对特定代码使用适当的umasks时,我发现“perf”不理解或支持umask包含。 我尝试过:

% perf stat -e rC0 ./a.out

这使我感到退役的指示,但是

% perf stat -e rC002 ./a.out 

当我提供错误的参数时,应该给我执行的X87指令说。也许是这样,但使用与“perf”一起使用原始硬件事件的掩码的正确方法是什么?总的来说,使用perf工具获取程序执行的浮点和整数操作的确切数量的方法是什么?

非常感谢, Konstantin Boyanov


这是我的测试应用程序:

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;
  }
}
2个回答

6

使用的事件取决于处理器。您可以使用libpfm4(http://perfmon2.git.sourceforge.net/git/gitweb-index.cgi)确定可用事件(使用showevinfo程序),然后从相同的分发中检查事件以找出事件的原始代码。我的Sandy Bridge CPU支持FP_COMP_OPS_EXE事件,我经验性地发现它与FLOP计数密切相关。


2

我不确定perf是否支持,但是oprofile支持许多处理器的浮点事件。可能会有一些重叠,因为INST_RETIRED也是一个有效的oprofile事件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接