如何分析Zen4上AVX-512双精度计算的指令流水线?
Zen4平台AVX-512双精度计算性能分析问题
我已获得AMD Zen4服务器的访问权限,测试了AVX-512打包双精度计算的性能。选用调和级数(即正整数的1/n求和)作为测试场景,对比了标准双精度、AVX2(4个打包双精度)和AVX-512(8个打包双精度)的性能表现。
AVX2版本比标准双精度版本快4倍,但我原本预期AVX-512版本比AVX2版本快2倍,实际运行时间几乎没有明显提升:
Method Runtime (minutes:seconds) HarmonicSeriesPlain 0:41.33 HarmonicSeriesAVX256 0:10.32 HarmonicSeriesAVX512 0:09.82
为排查该现象,我测试了单独的除法运算,结果如下:
Method Runtime (minutes:seconds) div_plain 1:53.80 div_avx256f 0:28.47 div_avx512f 0:14.25
有趣的是,div_avx256f耗时28秒,而HarmonicSeriesAVX256仅需10秒完成——后者执行了更多操作(对结果求和并每次递增分母,打包除法的次数相同),这种加速必然源于指令流水线的优化。
不过,我需要帮助获取更深入的分析细节。
使用llvm-mca(LLVM机器码分析器)进行分析失败,因为它尚不支持Zen4:
gcc -O3 -mavx512f -mfma -S "$file" -o - | llvm-mca -iterations 10000 -timeline -bottleneck-analysis -retire-stats error: found an unsupported instruction in the input assembly sequence. note: instruction: vdivpd %zmm0, %zmm4, %zmm2
在Intel平台上,我会使用perf stat -M pipeline binary来获取流水线细节,但该指标组在Zen4上不可用。我已尝试以下perf stat事件:
cycles,stalled-cycles-frontend,stalled-cycles-backend,cache-misses,sse_avx_stalls,fp_ret_sse_avx_ops.all,fp_ret_sse_avx_ops.div_flops,fpu_pipe_assignment.total,fpu_pipe_assignment.total0, fpu_pipe_assignment.total1,fpu_pipe_assignment.total2,fpu_pipe_assignment.total3
从结果中可以看出该工作负载属于后端受限,AMD的性能事件fp_ret_sse_avx_ops.all(已退役的SSE/AVX操作数)有一定帮助,但我仍希望更深入了解Zen4的指令流水线,有什么可行的分析建议?
内容的提问来源于stack exchange,提问作者Jirka
相关产品推荐
相关产品推荐

