对于大多数指令,在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的命令速度更快?
最佳答案
一条指令的“等待时间”是执行一条指令要花费多少个时钟周期(结果需要多长时间才能准备好一条从属指令将其用作输入)。如果您具有循环承载的依赖关系链,则可以将操作的延迟加起来以找到关键路径的长度。
如果您在每个循环迭代中都有独立的工作,则乱序的exec可能会使其重叠。该链的长度(以延迟周期为单位)告诉您,OoO执行人员必须付出多少努力才能重叠该依赖链的多个实例。
通常,吞吐量是每个时钟周期的指令数,但这实际上是倒数吞吐量:每个独立指令开始的时钟周期数-因此0.5个时钟周期意味着可以在一个时钟周期内发出2条指令,并且结果准备就绪在下一个时钟周期。
请注意,执行单元是流水线的,除法器之外的所有单元都是完全流水线的(每个时钟周期开始一条新指令)。延迟与吞吐量是分开的(独立操作可以开始的频率)。许多指令是单字节的,因此它们的吞吐量通常为1/n,其中n
是一个小整数(可以执行该指令的执行单元的端口数)。
英特尔在此处说明:
https://software.intel.com/en-us/articles/measuring-instruction-latency-and-throughput
要找出两个不同的指令是否在同一吞吐量资源上相互竞争,您需要查阅更详细的指南。例如,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?