Performance AVX512中的128位跨车道操作是否具有更好的性能?

Performance AVX512中的128位跨车道操作是否具有更好的性能?,performance,x86,intel,avx,avx512,Performance,X86,Intel,Avx,Avx512,在为AVX256、AVX512和一天AVX1024设计前瞻性算法时,考虑到大SIMD宽度的完全通用置换的潜在实现复杂性/成本,我想知道即使在AVX512中,通常保持128位的隔离操作是否更好 特别是考虑到AVX有128位单元来执行256位操作 为此,我想知道,与512bit向量的每个4x128bit子向量中的置换类型操作相比,所有512bit向量中的AVX512置换类型操作是否存在性能差异?通常是的,在通道中,SKX上的延迟仍然较低(1个周期比3个周期),但是通常情况下,不值得花费额外的指令来使

在为AVX256、AVX512和一天AVX1024设计前瞻性算法时,考虑到大SIMD宽度的完全通用置换的潜在实现复杂性/成本,我想知道即使在AVX512中,通常保持128位的隔离操作是否更好

特别是考虑到AVX有128位单元来执行256位操作


为此,我想知道,与512bit向量的每个4x128bit子向量中的置换类型操作相比,所有512bit向量中的AVX512置换类型操作是否存在性能差异?

通常是的,在通道中,SKX上的延迟仍然较低(1个周期比3个周期),但是通常情况下,不值得花费额外的指令来使用它们,而不是强大的过道洗牌。然而,
vpermt2w
和其他几个随机播放需要多个随机播放端口UOP,因此它们的成本与多个简单的随机播放相同

如果不小心使用最新的Intel CPU(端口5上只有一个洗牌执行单元),洗牌吞吐量很容易成为瓶颈。有时甚至值得使用两个重叠的加载,而不是一次加载和洗牌,即使用未对齐的加载作为洗牌,因为L1D缓存很快,未对齐加载的加载端口处理也很快。(不过,AVX512的情况就不是这样了,特别是因为每个未对齐的512b加载都会自动进行缓存线拆分,因为向量和缓存线都是64字节。)

还有旋转(AVX512中新增)和移位指令(非新增)。例如,如果使用移位或旋转计数32或16,则64位元素大小版本可以在较小的元素之间移动数据
vprolq-zmm,zmm,32
是1c延迟,在端口0(对于xmm/ymm版本也是端口1)上运行,将每个元素与其相邻元素交换在SKX上移动/旋转不竞争端口5


,唯一真正的选择是按什么顺序洗牌。通常从
extract
/
add
开始,直到128b,然后使用
\uuum128
洗牌(或整数移位),而不是每次洗牌都使用
vpermd/q
。或者,如果要将结果广播到所有元素,请在前几次添加之间使用车道混洗,然后使用车道交叉混洗在128b然后256b块中进行混洗。(128b数据块中的混洗并不比SKX上的
vpermq z,z,imm8
等更小粒度的即时控制混洗快,但在使用
vshufps
vpermilps
进行车道内操作后,这就是hsum所需的全部)

在KNL上,重要的不是通道,而是单源与双源洗牌
e、 g.
vshufps-dst,same,same,imm8
vpermilps-dst,src,imm8
吞吐量的一半
但是,使用向量控件(如
vpermd v,v,v
)的单源随机播放仍然很快(1源+1个随机播放控制向量)

即使只有1 uop,4-7c延迟洗牌(2输入)的吞吐量也低于2c。我猜这意味着KNL的洗牌装置没有完全流水线化


请注意,一些未来的AMD CPU可能会将512b操作分成两个256b操作(或者可能是四个128b操作)。在那里,车道交叉洗牌的费用要高得多。即使Ryzen上的
vperm2f128
也是8个uop,3个lat/3个吞吐量,而SKL上是1个uop。车道内混乱很明显很容易分解为每条车道1个uop,但车道交叉口却不是


原始数据

对于Skylake-AVX512(又名Skylake-X、又名SKL-SP或SKX),有(指令吞吐量/延迟)结果,并支持它。Instratx64合并了来自IACA(仅uop计数和端口)的数据,并由Intel以PDF格式发布(吞吐量/延迟),以及来自真实硬件上的真实实验测试(吞吐量/延迟)。检查主Instrat页面以获取更新

指令表中有Knight's Landing Xeon Phi(KNL)的数据,在他的Microach PDF中有一节介绍了基于Silvermont的微体系结构。不幸的是,他还没有SKX测试结果

如果KNL指令的输入来自同一执行单元(例如,shuffle->shuffle),那么与FMA->shuffle相比,KNL指令具有更好的延迟。(参见Agner电子表格顶部的注释)。这就是4-7c延迟数字的含义。一个转置或做一系列洗牌的东西可能会看到大部分的低延迟数。(但是KNL通常具有很高的延迟,这就是它具有4路超读的原因 试图隐藏它们)


SKX:Skylake-AVX512(可能是未来的主流Intel CPU) 所有车道交叉洗牌最多为1UOP、3c延迟和1c吞吐量。但即使是复杂/功能强大的,如双输入
vpermt2ps
也有那么快。这包括所有洗牌,洗牌整个车道,或插入/提取256b块

所有仅车道内的混洗都是1c延迟(除了xmm版本的一些新的avx512车道交叉混洗)。因此,当您需要时,请使用
vpshufd-zmm、zmm、imm8
vpunpcklqdq-zmm、zmm、zmm
。或带有矢量控制输入的
vpshufb
vpermilps

与Haswell和SKL(非avx512)一样,SKX只能在端口5上运行随机UOP。再次像那些早期的CPU一样,它可以只使用加载端口来广播加载,所以这和常规向量加载一样便宜。AVX512广播加载可以进行微融合,使内存源广播比寄存器源广播更便宜(在随机播放吞吐量方面)

即使是
vmovsldup-ymm,[mem]
/
vmovshdup-ymm,[mem]
也只需为256b随机播放使用一个加载uop。IDK约512b;Instrat没有测试内存源movsl/hdup,所以我们只有Agner Fog的数据。(IIRC我在自己的SKL上确认了这一点)

请注意,在运行512b指令时,