gpt4 book ai didi

optimization - 两个相似的汇编代码。巨大的差异

转载 作者:行者123 更新时间:2023-12-03 16:23:07 24 4
gpt4 key购买 nike

我有 Ivy-Bridge CPU。以下代码每次迭代需要 3 个周期:

L1:    
movapd xmm1, [rsi+rax] ; X[i], X[i+1]
mulpd xmm1, xmm2
movapd xmm0, [rdi+rax] ; Y[i], Y[i+1]
subpd xmm0, xmm1
movapd [rdi+rax], xmm0 ; Store result
add rax, 16
cmp rax, rcx
jl L1

以下每次迭代需要 9 个周期:

L1:
movapd xmm1, [rsi+rax] ; X[i], X[i+1]
mulpd xmm1, xmm2
movapd xmm0, [rdi+rax] ; Y[i], Y[i+1]
add rax, 16
subpd xmm0, xmm1
movapd [rdi+rax], xmm0 ; Store result
cmp rax, rcx
jl L1

唯一的区别是顺序(add rax, 16)。这导致程序慢了 3 倍。为什么差别如此之大?

最佳答案

主要原因是它将结果存储在不同的位置,这也恰好是循环的下一次迭代读取的位置。

这样做会干扰 CPU 的乱序执行——由于数据依赖性,循环的下一次迭代在当前迭代完成之前无法开始。

我想如果您将存储指令更改为存储回相同的位置,第二个循环会再次变得更快:

movapd [rdi+rax-16], xmm0 ; Store result

关于optimization - 两个相似的汇编代码。巨大的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36801456/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com