SIMD延迟吞吐量

问题描述 投票:9回答:2

在大多数指令的Intel Intrisics Guide上,它还具有等待时间和吞吐量的值。示例:

__ m128i _mm_min_epi32

Performance
Architecture Latency Throughput
Haswell      1       0.5
Ivy Bridge   1       0.5
Sandy Bridge 1       0.5
Westmere     1       1
Nehalem      1       1

这些数字到底是什么意思?我猜想等待时间越慢意味着该命令需要花费更长的时间执行,但是Nehalem的吞吐量1和Ivy的吞吐量0.5意味着Nehalem的命令速度更快?

c++ sse simd
2个回答
14
投票

一条指令的“等待时间”是执行一条指令要花费多少个时钟周期(结果需要多长时间才能准备好一条从属指令将其用作输入)。如果您有循环传递的依赖链,则可以将操作的延迟加起来以找到关键路径的长度。

如果您在每次循环迭代中都有独立的工作,则乱序的exec可能会使其重叠。该链的长度(以延迟周期为单位)告诉您,OoO执行人员必须付出多少努力才能重叠该依赖链的多个实例。


通常吞吐量是每个时钟周期的指令数,但实际上是倒数吞吐量:每个独立指令开始的时钟周期数-因此0.5个时钟周期意味着可以在一个时钟周期内发出2条指令,并且结果在下一个时钟周期准备就绪。

注意执行单元是流水线的,除法器完全以外的所有单元都是流水线的(每个时钟周期开始一条新指令)。延迟与吞吐量分开(independent操作可以开始的频率)。许多指令是单指令的,因此它们的吞吐量通常为1 / n,其中n是一个小整数(可以执行该指令的执行单元的端口数)。

英特尔在此处提供证明:https://software.intel.com/en-us/articles/measuring-instruction-latency-and-throughput


要找出两个different指令是否在相同的吞吐量资源上相互竞争,您需要查阅更详细的指南。例如,https://agner.org/optimize/具有指令表和微拱门指南。这些详细介绍了执行端口,并将指令分解为三个重要方面:以uops为单位的前端成本,哪个后端端口和延迟。

例如,_mm_shuffle_epi8_mm_cvtsi32_si128都在大多数Intel CPU的端口5上运行,因此争夺相同的1 /时钟吞吐量。但是_mm_add_epi32在Haswell的端口1或端口5上运行,因此其0.5c的吞吐量仅部分地与混洗竞争。

https://uops.info/具有来自自动测试的非常详细的指令表,包括从每个输入到输出的等待时间。

[Agner Fog的表很好(紧凑且可读),但有时会有错别字或错误,并且只有一个延迟数,并且您并不总是知道哪个输入构成了dep链。

另请参阅What considerations go into predicting latency for operations on modern superscalar processors and how can I calculate them by hand?


4
投票

以下是来自Intel页面Measuring Instruction Latency and Throughput的引用。

延迟和吞吐量

延迟是一条指令占用的处理器时钟数使它的数据可供另一条指令使用。因此,延迟为6个时钟的指令的数据可用于另一条指令,该指令在启动后需要很多个时钟执行。

吞吐率是一个处理器占用的处理器时钟数执行或执行其计算的指令。指令具有2个时钟的吞吐量将为此占用其执行单元许多周期,从而阻止了需要该执行单元的指令从被执行。只有在完成指令后执行单元可以输入下一条指令。

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