【问题标题】:SIMD latency throughputSIMD 延迟吞吐量
【发布时间】:2015-04-16 10:11:27
【问题描述】:

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++ performance x86 sse simd


【解决方案1】:

一条指令的“延迟”是指执行一条指令需要多少时钟周期(结果需要多长时间才能准备好相关指令将其用作输入)。如果你有一个循环携带的依赖链,你可以将操作的延迟相加来找到关键路径的长度。

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


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

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

英特尔在此处记录: https://software.intel.com/en-us/articles/measuring-instruction-latency-and-throughput


要了解两个不同指令是否相互竞争相同的吞吐量资源,您需要查阅更详细的指南。例如,https://agner.org/optimize/ 有指令表和微架构指南。这些详细介绍了执行端口,并将指令分解为三个重要的维度:微指令中的前端成本、哪些后端端口和延迟。

例如,_mm_shuffle_epi8_mm_cvtsi32_si128 在大多数 Intel CPU 上都在端口 5 上运行,因此竞争相同的 1/clock 吞吐量。但是_mm_add_epi32 在 Haswell 的端口 1 或端口 5 上运行,因此它的 0.5c 吞吐量只能部分与 shuffle 竞争。

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?

【讨论】:

  • @Novelocrat:原来如此。
  • 不,吞吐量是每个时钟周期的指令数。英特尔引用了倒数吞吐量并将其称为吞吐量。
  • 根据英特尔在此处另一个答案中的定义,他们对吞吐量的使用是一致的。我只是习惯了 Agner Fog 使用的那个。但无论如何,在他的所有表格中,他都使用倒数吞吐量,因此英特尔的定义可能更实用。他的定义在计算 FLOPS 时很有用,但无论如何这只是一个逆问题。
  • @Zboson 恕我直言,对于现实生活中吞吐量的实际含义,Fog 的定义比英特尔的定义要一致得多,即每时间量的一些数量。我声称英特尔所谓的“吞吐量”应该被称为“互惠吞吐量”。
【解决方案2】:

以下引自英特尔页面Measuring Instruction Latency and Throughput

延迟和吞吐量

延迟是一条指令所需的处理器时钟数 使其数据可供另一条指令使用。所以, 一条延迟为 6 个时钟的指令将有它的数据 可用于另一条指令,它启动它的许多时钟后 执行。

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

【讨论】:

    猜你喜欢
    • 2022-12-25
    • 2018-12-14
    • 2021-04-16
    • 1970-01-01
    • 2019-08-27
    • 2017-11-19
    • 2016-11-16
    • 2017-03-05
    • 2017-10-29
    相关资源
    最近更新 更多