为什么 perf 显示的浮点事件少于预期?

Why does perf show less floating point events than expected?

我正在编写一个执行 50x50 矩阵乘法的 C 程序。

我将它编译为汇编,我看到它在最内层循环中至少有 2 个浮点指令(mulsd 和 addsd)。循环执行了 125000 次,所以我期望 perf stat 至少给我计算 250000 次浮点运算。

但是当我运行下面的命令时,

perf stat -e r530110 -e r531010 -e r532010 -e r534010 -e r538010 ./matmul

我只得到以下计数

           448 r530110                                                     
             0 r531010                                                     
             0 r532010                                                     
             0 r534010                                                     
 <not counted> r538010                 

   0.001082287 seconds time elapsed

我的编译器不生成 SSE 指令,因此其他零计数是预期的。但是,我只得到了448个浮点运算。

发生了什么事?

我已经弄明白了。我理解错了:mulsdaddsd其实是SSE指令

统计 r530110 (FP_COMPS_OPS_EXE:X87) 不计入 mulsdaddsd.

我需要看看 r538010 (FP_COMPS_OPS:SSE_SCALAR_DOUBLE)。

我猜我的程序中 <not counted> 是因为程序完成得太快了。当我增加矩阵的大小时(因此程序运行时间更长),浮点事件计数正确。