Haswell 内核一次可以执行多少个 32 位整数运算?

Posted

技术标签:

【中文标题】Haswell 内核一次可以执行多少个 32 位整数运算?【英文标题】:How many 32-bit integer ops can a Haswell core perform at once? 【发布时间】:2015-05-17 18:53:27 【问题描述】:

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

我曾经天真地假设“英特尔内核具有 HT,但这可能会并行化不同类型的工作,因此一个内核可能会通过 256 位 AVX 操作最大化其并行性,因此每个时钟周期可以发出 8 个整数操作(并假设流水线很好,也有 8 个完成)。” - 所以 8 个操作/周期。

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

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

【问题讨论】:

Wikipedia en.wikipedia.org/wiki/Haswell_(microarchitecture) 说他们最多可以有 8 个以上的物理内核,以及“每个内核八个执行端口”,以及“14 到 19 级指令管道”。缓存使获得真正的性能值变得困难,因此基准测试软件随机化缓存。 HT 不会提供 100% 的性能提升(两个线程合为一个核心),因为每个核心在两个线程之间共享大部分硬件。我会说制作一个汇编程序测试程序,对其进行基准测试,然后给出真实世界的结果。 masm32.com/board 有几篇关于这方面的好文章。 @rdtsc:我说的是单核 - 以及理论上的限制,而不是您在实践中可以实现的目标。 冒着听起来很迂腐的风险,当理论极限无法达到时,它们的价值是多少? @rdtsc:由于外部因素(例如内存带宽)而无法达到限制这一事实并不意味着它毫无意义或无用。它为评估可达到的价值提供了背景;并提出消除障碍的重要性。 在 x86 架构中,“障碍”不会被移除。速度提高了,当然,但向后兼容性是最重要的。 x86 仍然可以运行 30 年前的代码。相反,座右铭是“添加新功能”。这是几十年来相互叠加的“功能”的融合。因此,请求另一个端口或更多缓存可能会增加理论上的限制,但最终结果将始终是更复杂以及代码和缓存依赖。 【参考方案1】:

理论上的最大值是 25 32 位整数操作/周期:

端口 0:1 个标量运算或 1 个矢量移位常数或按位布尔运算 端口 1:1 个标量运算或 1 个向量加法/子/最小值/最大值或 cmp 或按位布尔运算 端口 5:1 个标量运算或 1 个向量加法/子/最小值/最大值或 cmp 或按位布尔运算 端口 6:1 个标量运算(或 2,如果您使用 64 位整数寄存器计算 SWAR)。

由于向量运算可以进行 8 次 32 位运算,因此每个周期最多可以进行 25 次整数运算 - 端口 0、1 和 5 各 8 次,端口 6 则为 1。或 26 当 p6 上的 SIMD-within-a-register 可行时。 (参见 Paul Clayton 的评论。)

如果我们只是在谈论“普通”整数的东西(加/乘/按位/移位),那么如果我们想要实现 25,我们必须排除做 32 位乘法(除了 2 的幂常数)每个时钟的操作。实整数代码通常能够让 p0 忙于乘法、PSADBW、移位和布尔值,并且几乎总是会有大量的改组 (p5)。我们人为地排除了并非严格意义上的每个时钟吞吐量 8 个 32 位操作的事物,例如乘法、可变计数移位以及整数和向量寄存器之间的数据移动。 (MOVD/MOVQ)。

向量乘法在 p0 上运行,但 VPMULLD(8 个 32x32 -> 32b 乘法)仅以每 2 个周期运行一次,因为它需要 2 个相关的微指令(10c 延迟)。有关指令 uop/port/throughput/latency 表,请参阅 http://agner.org/optimize/。

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

Another source describing Haswell's microarchitecture.

【讨论】:

好的,很公平,但是 - 管道理论上可以维持这个吗?例如每个周期解码 4 条指令来馈送这些端口? 根据 Abner Fog - 是的。见agner.org/optimize/blog/read.php?i=285#285 @Zboson:你说的是 FP。这个问题是关于整数的:Haswell 可以在 p1/p5 上运行 VPADDD(和其他向量整数加法/子/最小/最大),但 PMULDQ(和其他向量整数乘法和乘法加法)只能在 p0 上运行.整数向量乘法的需求并不大,并且可能复制该功能单元不值得晶体管的成本。他们还喜欢在相同的端口上保持相同的延迟。 @PeterCordes,感谢您提供的信息。我现在觉得有点傻。我真的希望英特尔能够实现快速的 64 位 * 64 位到 128 位向量乘法。这是多字 SIMD 操作的主要问题(带进位的加法问题不大)。 Technically,只要没有破坏性地跨越 32 位边界,纯标量端口就可以执行 两个 32 位操作。 (如果可以忽略更改,例如使用右移和掩码,则交叉可能是非破坏性的。交叉甚至可能是有益的,例如在找到内部进位的 32 位整数向量之和的情况下输出/输入自然处理。)按位逻辑运算自然适合此要求,但移位、加法和减法也可以在适当约束输入的情况下适合此要求。

以上是关于Haswell 内核一次可以执行多少个 32 位整数运算?的主要内容,如果未能解决你的问题,请参考以下文章

golang数据类型变量定义

输出32位整型数据的二进制

设备内存空间中的 cuda 程序内核代码

swift学习第二天:swift中的基本数据类型

int在64位操作系统中占多少位?

Go基本数据类型