HPC应用中向量Intrinsics内存加载与寄存器指令延迟及汇编性能差异咨询
两段AVX2汇编代码的性能差异分析
先对比两段目标汇编代码:
代码片段1
vmovapd ymm0, YMMWORD PTR [Address] vaddpd ymm0, ymm0, YMMWORD PTR [Address]
代码片段2
vmovapd ymm0, YMMWORD PTR [Address] vmovapd ymm1, YMMWORD PTR [Address] vaddpd ymm0, ymm0, ymm1
基于Ryzen Zen3微架构(参考Agner Fog的微架构文档)的特性,该CPU配备两个独立的加载/存储端口,这一特性直接决定了两段代码的性能差异:
对于代码片段1:
第一条vmovapd指令占用一个加载端口完成内存到寄存器的加载;第二条vaddpd指令的第二个源操作数来自内存,这个加载操作可以同时占用另一个空闲的加载端口,而加法运算本身由ALU端口并行执行。两个加载操作能够同时启动、并行完成,加法指令的加载阶段与第一条加载指令的执行完全重叠,整体执行的延迟和吞吐量更高效。对于代码片段2:
前两条vmovapd虽然可以利用两个加载端口并行完成加载,但后续的vaddpd必须等待两个加载操作全部完成后才能启动运算。这段代码的执行流程是“加载+加载→加法”,无法像片段1那样让加载与运算阶段重叠,整体需要的执行周期更长。
结论:代码片段1在Zen3架构上的性能优于代码片段2,它充分利用了双加载端口的并行性,最大化了指令级并行度,减少了整体执行时间。
内容的提问来源于stack exchange,提问作者BigTuna
相关产品推荐
相关产品推荐

