了解 simd sum 实现 x86 的吞吐量

问题描述 投票:0回答:1

我在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

这是一个更大函数的一部分,该函数计算 Rust 中

[f64]
数组的总和。

我用标准板条箱对这段代码进行了基准测试,并得到了

1 000 000 000
在我的 Rocket Lake CPU (i7 11700K) 上双倍使用
200 000 000
周期

在各种来源中,我发现该 CPU 上浮点加法的延迟为 4 个周期。 这意味着每个

vaddpd
只能每 4 个周期运行一次,因为它们依赖于前一个总和。这意味着我每个周期最多只能进行 4 次双加法。

我的测量显示每个周期添加 5 次。 (它使用

RDTSC
指令来测量它,我不确定这是否会出现问题)

我主要想了解正在发生的事情并测试我对 CPU 管道的理解程度。

x86 simd
1个回答
0
投票

我认为您每个周期观察到 5 个添加,因为您使用

RDTSC
进行测量。

在过去十年左右的时间里,RDTSC 指令不计算 CPU 周期。相反,它使用 CPU 的基本频率来测量挂钟时间。

您的CPU的基本频率为3.6 GHz,最大睿频频率为5.00 GHz。如果您运行一个简短的测试,您的 CPU 将以睿频运行,但是使用 RDTSC 测量的计数器仍然以基本频率运行。

© www.soinside.com 2019 - 2024. All rights reserved.