使用 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 节点缓存未命中/命中的工具?

Linux Perf Counting Instructions, Cycles, Cache misses更轻量级

我看不到 perf 的功率/能量核心选项来测量功耗

sh 如何使用linux perf工具分析应用程序

使用linux perf工具生成java程序火焰图

读 perf 笔记 简写