mul不是a的一部分 的 循环体 强> 依赖链,所以可以 mulpd 来自飞行中的多次迭代的insns。单个指令的延迟根本不是问题,而是依赖性 链 。每次迭代都有一个 分离 13c依赖链的加载,mulpd,subpd,store。乱序执行允许多次迭代的uops同时在飞行中。
mulpd
该 cmp / jl 在每次迭代中取决于 add 从那次迭代,但是 add 在下一次迭代中不依赖于 cmp 。推测执行和分支预测意味着控制依赖(条件分支和间接跳转/调用) 不 数据依赖链的一部分。这就是为什么一次迭代的指令可以在之前开始运行的原因 jl 从前面的迭代退休。
cmp
jl
add
通过比较, cmov 是 数据依赖性而不是控制依赖性,因此无分支循环往往具有循环携带的依赖链。如果分支预测良好,这往往比分支慢。
cmov
每个循环迭代都有一个单独的 cmp / jl 依赖链,就像FP依赖链一样。
我无法理解为什么依赖链不会增加整个吞吐量。
我不知道这句话是什么意思。我想我能够找出你所有其他混淆的单词和短语。 (例如“链依赖”而不是“依赖链”。)看看我对你的问题的编辑;其中一些也可能有助于您的理解。