gpt4 book ai didi

x86 - Haswell 内核可以同时执行多少个 32 位整数运算?

转载 作者:行者123 更新时间:2023-12-01 07:08:41 28 4
gpt4 key购买 nike

在准备一些演示文稿时,我突然想到,我不知道 Haswell 内核一次可以执行的整数运算数量的理论限制是多少。

我曾经天真地假设“Intel 内核具有 HT,但这可能会并行化不同类型的工作,因此内核可能通过 256 位 AVX 操作来最大程度地发挥其并行性,因此每个时钟周期可以发出 8 个整数操作(并假设管道良好,8 也完成)。” - 所以 8 次操作/周期。

但后来我注意到this article ,这告诉我 Haswells(和 Sandy Bridges)有 3 个调度端口,可以为矢量单元供电。那么真正的数字是 24 个整数操作/周期吗?

PS - 我意识到,在实践中,您可能需要实际从内存中读取所有数据,而其带宽将是限制因素。否则 QPI 就会太慢。

最佳答案

理论最大值为每周期 25 32 位整数运算:

  • 端口 0:1 个标量运算或 1 个向量常量移位或按位 bool 运算
  • 端口 1:1 个标量运算或 1 个向量加/减/最小/最大或 cmp 或按位 bool 运算
  • 端口 5:1 个标量运算或 1 个向量加/减/最小/最大或 cmp 或按位 bool 运算
  • 端口 6:1 个标量运算(如果使用 64 位整数寄存器计算 SWAR,则为 2 个)。

由于向量运算可以执行 8 个 32 位运算,因此每个周期最多有 25 个整数运算 - 端口 0、1 和 5 各 8 个,端口 6 各 1 个。或者 26 当 p6 上的寄存器内 SIMD 可行时。 (请参阅保罗·克莱顿的评论。)

如果我们只是谈论“普通”整数的东西(加/乘/按位/移位),那么如果我们想要达到 25,我们就必须排除 32 位乘法(除了 2 的幂常数)每个时钟的操作数。实整数代码通常能够使 p0 忙于乘法、PSADBW、移位和 bool 运算,并且几乎总是有大量的改组 (p5)。我们人为地排除了严格来说每个时钟吞吐量不是 8 个 32 位操作的内容,例如乘法、变量计数移位以及整数和向量寄存器之间的数据移动。 (MOVD/MOVQ)。

向量乘法在 p0 上运行,但 VPMULLD(八个 32x32 -> 32b 乘法)仅每 2 个周期运行一次,因为它需要 2 个相关 uops(10c 延迟)。请参阅http://agner.org/optimize/用于指令 uop/端口/吞吐量/延迟表。

在前端维持此吞吐量将需要循环缓冲区,因此请保持循环小于 28 微指令(如果没有超线程则为 56 微指令)。这包括比较和分支循环开销,因此理论吞吐量实际上略低于 25。不过,宏融合比较和分支在 p6 上运行,因此它仅取代每 7 个标量操作,使可持续吞吐量类似于每个时钟 24.85 次操作。 (或使用 SWAR 为 25.85)。

Another source describing Haswell's microarchitecture .

关于x86 - Haswell 内核可以同时执行多少个 32 位整数运算?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30290815/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com