Avx2.Shuffle 使用 _mm256_shuffle_epi8 根据掩码对 128 位通道内的字节进行混洗,如果设置了最后一位,则将值归零。
Vector256.Shuffle
如何运作?与 Avx2.Shuffle
不同,如果随机播放控制掩码值超过元素数量,它将为零。此外,它还支持跨车道洗牌。
我猜测它使用了检查恒定洗牌掩码的组合,使用 _mm256_cmpgt_epi8 屏蔽为零元素,并在需要跨车道洗牌时使用 _mm256_permutevar8x32_epi32 。
如何查看运行时发出的 IL 代码?我不认为 SharpLab 会这样做 - 我的例子。
编辑我以前从未看过jit源代码,但link似乎表明jit将检查是否有任何洗牌索引超出其通道,如果索引确实超出范围,则回退到手动版本,否则它将使用相关的 Avx 指令。这是我最好的猜测,我一点也不知道 jit 是如何工作的。
目前,.Net7 中的 Shuffle 方法始终使用标量后备代码。我在 X86 和 Arm 平台上测试过它,发现它没有硬件加速。
为了解决Shuffle方法没有硬件加速的问题,我开发了VectorTraits库。它支持X86和Arm平台。
方法如下。
不仅针对Vector256,还针对Vector128和Vector,该库提供了Shuffle方法。