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

X86 Haswell内核一次可以执行多少32位整数运算?,x86,cpu,simd,avx,cpu-speed,X86,Cpu,Simd,Avx,Cpu Speed,在准备一些演示文稿时,我突然想到,我不知道Haswell core一次可以执行的整数运算的理论极限是多少 我曾经天真地假设“英特尔内核有HT,但这可能是并行化不同类型的工作,因此可能一个内核使用256位AVX操作来最大化其并行性,因此每个时钟周期可以发出8个整数运算(并且假设良好的流水线,8个完成)。”-所以8个运算/周期 但后来我注意到,这告诉我Haswell(和Sandy Bridges)有3个调度端口,可以为矢量单元供电。那么,真的是图24整数运算/周期吗 PS-我意识到,在实践中,您可能

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

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

但后来我注意到,这告诉我Haswell(和Sandy Bridges)有3个调度端口,可以为矢量单元供电。那么,真的是图24整数运算/周期吗


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

理论最大值为每个周期2532位整数运算:

  • 端口0:1个标量运算或1个按常量或按位布尔运算的向量移位
  • 端口1:1个标量运算或1个向量加法/分/最小/最大或cmp或按位布尔运算
  • 端口5:1个标量运算或1个向量加法/分/最小/最大或cmp或按位布尔运算
  • 端口6:1标量运算(如果使用64位整数寄存器计数,则为2)
由于向量运算可以执行8个32位运算,因此每个周期最多有25个整数运算-端口0、1和5各8个,端口6各1个。或26当p6上的SIMD-IN-a寄存器可行时。(见保罗·克莱顿的评论。)

如果我们只是讨论“普通”整数(加法/乘法/按位/移位),那么如果我们想要实现每个时钟25次运算,就必须排除do 32位乘法(除2的幂次常数)。实整数代码通常能够让p0忙于乘法、
PSADBW
、移位和布尔运算,并且几乎总是有大量的混洗(p5)。我们人为地排除了不是严格意义上的每时钟8次32位运算的事情,比如乘法、可变计数移位以及整数和向量寄存器之间的数据移动。(
MOVD
/
MOVQ

向量乘法在p0上运行,但是
VPMULLD
(八个32x32->32b乘法)仅以每2个周期运行一次,因为它需要2个依赖的UOP(10c延迟)。请参阅说明uop/端口/吞吐量/延迟表

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


Wikipedia说,他们最多可以有8个以上的物理内核,“每个内核有8个执行端口”,并有“14到19个阶段的指令管道”。缓存使得获得真正的性能值变得困难,因此,为什么基准测试软件会随机化缓存。HT不能提供100%的性能增益(两个线程进入一个内核),因为每个内核在两个线程之间共享它的大部分硬件。我会说制作一个汇编测试程序,对其进行基准测试,然后给出真实的结果。有几篇关于这方面的好文章。@rdtsc:我说的是单核,是理论上的限制,而不是你在实践中能达到的。冒着听起来迂腐的风险,当理论限制无法达到时,理论限制的价值是什么?@rdtsc:事实上,由于外部因素(例如内存带宽)而无法达到限制不会使它变得毫无意义或无用。它为评估可实现的价值提供了背景;并指出了消除障碍对实现这一目标的重要性。在x86体系结构中,“障碍”不会被消除。当然,速度提高了,但向后兼容性至关重要。x86仍然可以运行30年前的代码。相反,格言是“添加新功能”。这是几十年来相互叠加的“功能”的融合。因此,请求另一个端口或更多缓存可能会增加理论上的限制,但最终结果总是更复杂、更依赖代码和缓存。好吧,这很公平,但是-管道理论上能支持这一点吗?e、 g.根据Abner Fog-是,每周期解码4条指令,以便为这些端口馈电。看@Zboson:你说的是FP。这个问题是关于整数的:Haswell可以在p1/p5上运行
VPADDD
(和其他向量int-add/sub/min/max),但
PMULDQ
(和其他向量int-multiply和multiply-add)只能在p0上运行。整数向量乘法的需求量并没有那么大,而且据推测,复制这个功能单元根本不值得晶体管的成本。他们也喜欢在相同的端口上保持相同延迟的操作。@PeterCordes,谢谢你提供的信息。我现在觉得有点傻。我真的希望英特尔能实现快速的64位*64位到128位矢量乘法。这是多字SIMD操作的主要问题(带进位的加法不太成问题)。只要32位边界没有破坏性的交叉,纯标量端口就可以执行两个32位操作。(如果可以忽略更改,例如使用右移和掩码,则交叉可能是非破坏性的。交叉甚至可能是有益的,例如在自然处理内部进位/进位的情况下,查找32位整数向量的和。)按位逻辑运算自然符合此要求,但shift、add、,在适当限制输入的情况下,减法也可以满足这一要求。