Haswell核心可以同时执行多少32位整数运算?

ein*_*ica 2 cpu x86 simd cpu-speed avx

在准备一些演示文稿的背景下,我想到我不知道Haswell核心可以同时执行的整数运算次数的理论极限.

我曾经天真地假设"英特尔核心有HT,但这可能是并行化不同类型的工作,所以可能核心最大化其与256位AVX操作的并行性,所以8个整数运算可以在每个时钟周期发出(并假设不错流水线,8完成)." - 所以8个操作/循环.

但后来我注意到这篇文章,它告诉我Haswells(和Sandy Bridges)有3个调度端口可以提供向量单元.那么真正的数字24整数运算/周期?

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

Cra*_*son 5

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

  • 端口0:1个标量op或1个矢量按常数移位或按位布尔运算
  • 端口1:1标量op或1向量add/sub/min/max或cmp或按位布尔运算
  • 端口5:1个标量op或1个向量add/sub/min/max或cmp或按位布尔op
  • 端口6:1标量操作(或2,如果您使用64位整数寄存器计算SWAR).

由于向量操作可以执行8个32位操作,因此每个周期最多有25个整数操作 - 端口0,1和5各为8个,端口6为1个.或者当p6上的寄存器内的SIMD为26时为26可行的.(见Paul Clayton的评论.)

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

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

在前端维持此吞吐量将需要循环缓冲区,因此保持循环小于28微秒(或56没有超线程).这包括比较和分支循环开销,因此理论吞吐量实际上略低于25,但是p6上的宏融合比较和分支运行,因此它只取代每第7个标量运算,使得可持续吞吐量类似于每时钟24.85次操作.(或SWAR的25.85).

描述Haswell微体系结构的另一个来源.