为什么 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个浮点运算。
发生了什么事?
我已经弄明白了。我理解错了:mulsd
和addsd
其实是SSE指令
统计 r530110
(FP_COMPS_OPS_EXE:X87) 不计入 mulsd
或 addsd
.
我需要看看 r538010
(FP_COMPS_OPS:SSE_SCALAR_DOUBLE)。
我猜我的程序中 <not counted>
是因为程序完成得太快了。当我增加矩阵的大小时(因此程序运行时间更长),浮点事件计数正确。
我正在编写一个执行 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个浮点运算。
发生了什么事?
我已经弄明白了。我理解错了:mulsd
和addsd
其实是SSE指令
统计 r530110
(FP_COMPS_OPS_EXE:X87) 不计入 mulsd
或 addsd
.
我需要看看 r538010
(FP_COMPS_OPS:SSE_SCALAR_DOUBLE)。
我猜我的程序中 <not counted>
是因为程序完成得太快了。当我增加矩阵的大小时(因此程序运行时间更长),浮点事件计数正确。