我在 asm 中有以下循环:
.LBB5_5:
vaddpd ymm0, ymm0, ymmword, ptr, [rdi, +, 8*rcx]
vaddpd ymm1, ymm1, ymmword, ptr, [rdi, +, 8*rcx, +, 32]
vaddpd ymm2, ymm2, ymmword, ptr, [rdi, +, 8*rcx, +, 64]
vaddpd ymm3, ymm3, ymmword, ptr, [rdi, +, 8*rcx, +, 96]
add rcx, 16
cmp rax, rcx
jne .LBB5_5
[f64]
这是一个更大函数的一部分,该函数计算Rust 中数组的总和。
我使用标准板条箱对这段代码进行了基准测试,并在我的 Rocket Lake CPU (i7 11700K) 上得到了1 000 000 000
双打周期200 000 000
在各种来源中,我发现该 CPU 上浮点加法的延迟为 4 个周期。这意味着每个vaddpd
只能每 4 个周期运行一次,因为它们依赖于前一个总和。这意味着我每个周期最多只能进行 4 次双加法。
我的测量显示它每个周期添加 5 次。(它使用RDTSC
指令来测量它,我不确定这是否会出现问题)
我主要想了解正在发生的事情并测试我对 CPU 管道的理解程度。
我认为您每个周期观察到 5 个添加,因为您正在使用
RDTSC
测量。在过去十年左右的时间里,RDTSC 指令不计算 CPU 周期。相反,它使用 CPU 的基本频率来测量挂钟时间。
您的 CPU基本频率为 3.6 GHz,最大睿频频率为 5.00 GHz。如果您运行一个简短的测试,您的 CPU 将以睿频运行,但是使用 RDTSC 测量的计数器仍然以基本频率运行。