我想测量某些应用程序执行的浮点和算术操作的峰值,该应用程序是“ perf”,即“新命令行”接口命令到Linux Performance Counter子系统。 (为了测试目的,我使用了我创建的简单虚拟应用程序,请参见下文)。

因为我找不到用于测量FP和整数操作的任何“ perf”事件,所以我开始挖掘RAW硬件事件代码(与-RNNN一起使用,其中NNN是事件代码的十六进制值)。因此,我真正的问题是,我为退休说明(Inst_retired)找到的代码不会区分FP和其他说明(X87和MMX/SSE)。当我尝试将适当的灯罩用于特定代码时,我发现“ perf”不理解或支持透明度包含。我尝试了:

% perf stat -e rC0 ./a.out

这给了我退休的指示,但是

% perf stat -e rC002 ./a.out 

这应该给我执行的X87指令说我提供了错误的参数。也许是这样,但是使用“ perf”使用原始硬件事件的透明度的正确方法是什么?通常,获得使用PURF工具执行的程序的确切浮点和整数操作的方法是什么?

非常感谢,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;
  }
}
有帮助吗?

解决方案

要使用的事件取决于处理器。您可以使用libpfm4(http://perfmon2.git.sourceforge.net/git/git/gitweb-index.cgi)来确定哪些是可用的事件(使用Showevinfo程序),然后从同一分布中check_events找出原始分布事件的代码。我的Sandy Bridge CPU支持FP_COMP_OPS_EXE事件,我经验发现,该事件与Flop计数紧密相对应。

其他提示

我不确定PERF,但是Oprofile对于许多处理器都有浮点事件。可能会有一些重叠,因为Inst_retired也是一个有效的oprofile事件。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top