iam*_*iam 8 performance x86 intel avx avx512
在为AVX256,AVX512和一天AVX1024设计前瞻性算法时,考虑到大SIMD宽度的完全通用置换的潜在实现复杂性/成本,我想知道即使在AVX512中通常保持隔离128位操作是否更好?
特别是考虑到AVX有128位单元来执行256位操作.
为此,我想知道在所有512位向量中AVX512置换类型操作之间是否存在性能差异,而在 512位向量的每个4x128位子向量中是否存在置换类型操作?
Pet*_*des 13
通常是的,车道内的SKX延迟仍然较低(1个周期对3个),但通常不值得花费额外的指令来使用它们而不是强大的车道交叉shuffle.然而,vpermt2w其他几个shuffle需要多个shuffle-port uops,因此它们的成本与多个简单的shuffle一样多.
如果您对最近的Intel CPU(端口5上只有一个shuffle执行单元)不小心,则Shuffle 吞吐量很容易成为瓶颈.有时,它采用两个重叠的负载,而不是装载一次洗牌,即使用未对齐的负荷洗牌甚至值得,因为L1D缓存快,所以不对齐负载的负载港口装卸.(尽管AVX512不太常见,特别是因为每个未对齐的512b加载都是自动缓存行分割,因为向量和缓存行都是64字节.)
还有旋转(AVX512中的新增功能)和移位指令(不是新的).例如,如果使用移位或旋转计数为32或16,则64位元素大小版本可以在较小元素之间移动数据. vprolq zmm, zmm, 32是1c延迟并在端口0上运行(对于xmm/ymm版本也是port1),用它的邻居交换每个元素. 换档/旋转不会在SKX上竞争端口5.
对于水平和,唯一真正的选择是什么顺序进行随机播放.通常以extract/ add向下开始到128b,然后使用__m128shuffle(或整数移位),而不是vpermd/q用于每次shuffle.或者,如果您希望将结果广播到所有元素,请在前几个添加之间使用通道内随机播放,然后在128b中随机播放,然后使用通道交叉随机播放256b块.(在128B块洗牌不小于粒度即时控制洗牌一样快vpermq z,z,imm8上SKX,但仅此而已,你需要用做通道内的东西后HSUM vshufps或vpermilps).
在KNL上,它不是通道,它是1源和2源shuffle重要.例如vshufps dst, same,same, imm8,吞吐量的一半vpermilps dst, src, imm8.vpermd v,v,v尽管(1个源+ 1个随机控制向量),带有矢量控制的1源shuffle 仍然很快.
即使它们只有1个uop,4-7c延迟洗牌(2输入)的吞吐量也低于2c.我想这意味着KNL的shuffle单元没有完全流水线化.
请注意,未来的某些AMD CPU可能会将512b操作分成两个256b操作(或可能是四个128b操作).过道洗牌在那里显得更加昂贵.即使vperm2f128在Ryzen上也是8 uops,3c lat/3c吞吐量,而SKL则为1 uop.车道内洗牌显然很容易分解为每个车道1个uop,但是车道交叉没有.
原始数据
对于SKYLAKE微架构-AVX512(又名SKYLAKE微架构-X,又名SKL-SP或SKX),有InstLatx64(指令吞吐量/延迟)的结果,和IACA支持它.InstLatx64有一个电子表格(ODS OpenOffice/LibreOffice格式),它结合了来自IACA的数据(只是uop计数和端口),并由英特尔以PDF(吞吐量/延迟)和实际硬件(吞吐量/延迟)的真实实验测试发布.检查主InstLat页面以获取更新.
昂纳雾的指令表对骑士的着陆至强融核(KNL)数据,并有一节关于它在他microarch基于PDF的Silvermont,微架构.不幸的是,他还没有SKX测试结果.
如果他们的输入来自相同的执行单元(例如shuffle - > shuffle)而不是FMA - > shuffle,则KNL指令具有更好的延迟.(参见Agner电子表格顶部的注释).这就是4-7c延迟数的含义.转置或做一连串洗牌的事情可能会看到较低的延迟数.(但KNL通常具有较高的延迟,这就是为什么它有4路超线程来试图隐藏它们).
所有车道交叉洗牌最多1个uop,3c延迟,1c吞吐量.但即使像2输入这样复杂/强大的vpermt2ps也是如此.这包括所有随机播放整个通道,或插入/提取256b块的shuffle.
所有仅限通道内的shuffle是1c延迟(除了xmm版本的一些新的avx512车道交叉shuffle).所以使用vpshufd zmm, zmm, imm8或vpunpcklqdq zmm, zmm, zmm何时只需要你.或者vpshufb或vpermilps用矢量控制输入.
像Haswell和SKL(非avx512)一样,SKX只能在端口5上运行shuffle uops .与早期的CPU一样,它只能使用加载端口进行广播加载,因此与常规向量加载一样便宜.AVX512广播负载可以微融合,使得存储器源广播比寄存器源更便宜(以随机吞吐量方式).
偶数vmovsldup ymm, [mem]/ vmovshdup ymm, [mem]仅使用256b shuffle的加载uop.IDK约512b; Instlat没有测试内存源movsl/hdup,所以我们只有Agner Fog的数据.(和IIRC我在我自己的SKL上证实了这一点).
请注意,运行512b指令时,端口1上的向量ALU将被禁用,因此每个时钟的最大吞吐量为2个向量ALU uop.(但是p1仍然可以运行整数.)并且向量加载/存储uops不需要p0/p5,所以你仍然可以在代码中混合使用前端(每个时钟发出4个uop /重命名)的瓶颈-fused load,stores和ALU(以及整数循环开销,以及使用unfused-domain uop在重命名阶段处理的vmovdqa寄存器复制).
SKX规则的例外情况:
VPMOVWB ymm, zmm类似的截断或有符号/无符号饱和指令是2 uops,4c延迟.(或xc版本的2c). vpmovqd是1个UOP,3C(或1c XMM)延迟,因为其最小粒度是双字和它的唯一的截断,不饱和,所以也可以在内部与同时需要的相同的硬件来实现pshufb,例如. vpmovz/sx说明仍然只有1个uop.
vpcompressd/q(基于掩码的左包)是2 uops(p5),3c延迟.(或根据英特尔发布的内容6c;也许Instlat正在测试矢量 - >矢量延迟,而英特尔正在给出k寄存器 - >矢量延迟?不太可能它依赖于数据并且通过一个简单的掩码更快.) vpexpandd也是2 uops.
对于所有3个操作数大小(xmm/ymm/zmm),AVX512BW vpermt2w/ vpermi2w是3 uops (p0 + 2p5),7c延迟.小粒度宽shuffle在硬件上是昂贵的(请参阅AVX2中的VPERMB在哪里?包括注释).这是一个双源16位元素shuffle,控件在第3个向量中.在第一代Core2 Conroe/Merom中,它最终可能会在未来几代中变得更快pshufb(并且所有粒度小于8字节的全寄存器随机播放)都很慢,但在下一代(Penryn)的缩小版本中速度很快.
AVX512BW vpermw(单源跨越字随机播放)是2p5,6c延迟,2c吞吐量,因为它是一个跨越通道的字随机播放.
期待AVX512VBMI vpermt2b在Cannonlake上一样糟糕或更糟,即使Cannonlake确实提高了vpermt2w/ vpermw.
vpermt2d/q/ps/pd在SKX中都是高效的,因为它们的粒度是dword(32位)或更宽.(但显然xmm版本仍有3c延迟,所以他们没有构建单独的硬件来加速单通道版本).这些甚至比过道更强大shufps:变量控制,并且不限制每个元素来自哪个源寄存器.它是一个完全通用的2源shuffle,您可以在其中索引2个寄存器的串联,覆盖index(vpermi2*)或其中一个表(vpermt2*).只有一个内在因为编译器处理寄存器分配和复制以保留仍然需要的值.
Shuffle仅在FP0端口上运行,但前端吞吐量仅为每个时钟2个uop.因此,除非他们是半吞吐量混洗,否则你的总指令中的更多可以是混乱而没有瓶颈(与SKX相比).
一般来说,2输入shuffle喜欢vperm2f128/ vshuff32x4或vshufps2c吞吐量/ 4-7c延迟,而1输入shuffle像vpermd1c吞吐量/ 3-6c延迟.(即2个输入占用混洗单元一个额外的周期(半吞吐量)并且花费1个额外的延迟周期).瓦格纳是不是正是未完全流水线洗牌的效果很明显,但我认为它只是挤占洗牌单元,而不是一切都在端口FP0(如FMA单元).
车道交叉或不使上KNL,例如没有差别vpermilps和vpermps均快(1C吞吐量,延迟3-6C),但vpermi2ps并vshufps都慢(2C吞吐量,延迟4-7C).对于KNL支持AVX512版本的说明,我没有看到任何例外情况.(即不计算AVX2 vpshufb,即几乎任何具有32位或更大粒度的东西).
vinserti32x4等等(插入/提取粒度至少为128b)是插入的2输入shuffle,但速度很快:3-6c lat/1c tput.但是提取到内存是多个uop并且导致解码瓶颈:例如VEXTRACTF32X4 m128,z是4个uop,每8c吞吐量一个.(主要是因为解码).
vcompress/ps/d,vpcompressd/q并且v[p]expandd/q/ps/pd是1 uop,3-6c延迟.(在SKX上为2 uops).但吞吐量仅为每3c一个:Agner并不表示这是否会占用整个洗牌单元2c,或者只是这个部分没有完全流水线化.
对于256b操作数大小,AVX2字节/字混洗非常慢:pshufb xmm吞吐量为5 uops/10c,吞吐量vpshufb ymm为12 uops/12c.(MMX pshufb mm是1 uop,2-6c延迟,1c吞吐量,所以我猜字节粒度shuffle单位是64b宽.)
pshuflw xmm是快速1 uop,但是vpshuflw ymm4 uops,8c吞吐量.
使用128位AVX(vpsadbw xmm快速)时,KNL 上的视频编码可能几乎不值得,但AVX2 ymm指令通常比使用更多1 uop xmm指令慢.
movss/sd xmm,xmm 是一种混合,而不是随机播放,具有0.5c吞吐量/ 2c延迟.
vpunpcklbw/wd超级慢(除了xmm版本),但是即使对于ymm/zmm操作数大小,DQ和QDQ也是常规速度.(2c吞吐量/ 4-7c延迟,因为它是2输入shuffle).
vpmovzx即使是3c延迟(不是3-6c?)和2c吞吐量vpmovzxbw. vpmovsx较慢:2 uops,因此解码瓶颈,使其8c延迟和7c吞吐量.变窄的截断指令(vpmovqb等等)是1 uop,3c lat/1c tput,但是变窄的饱和指令是2 uop,因此很慢.Agner没有用内存目的地测试它们.