我在 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 管道的理解程度。