Vector256.Shuffle 在 .Net 7+ 中如何工作?

问题描述 投票:0回答:2

Avx2.Shuffle 使用 _mm256_shuffle_epi8 根据掩码对 128 位通道内的字节进行混洗,如果设置了最后一位,则将值归零。

Vector256.Shuffle
如何运作?与
Avx2.Shuffle
不同,如果随机播放控制掩码值超过元素数量,它将为零。此外,它还支持跨车道洗牌。

我猜测它使用了检查恒定洗牌掩码的组合,使用 _mm256_cmpgt_epi8 屏蔽为零元素,并在需要跨车道洗牌时使用 _mm256_permutevar8x32_epi32 。

如何查看运行时发出的 IL 代码?我不认为 SharpLab 会这样做 - 我的例子

编辑我以前从未看过jit源代码,但link似乎表明jit将检查是否有任何洗牌索引超出其通道,如果索引确实超出范围,则回退到手动版本,否则它将使用相关的 Avx 指令。这是我最好的猜测,我一点也不知道 jit 是如何工作的。

c# simd intrinsics
2个回答
0
投票

0
投票

目前,.Net7 中的 Shuffle 方法始终使用标量后备代码。我在 X86 和 Arm 平台上测试过它,发现它没有硬件加速。

为了解决Shuffle方法没有硬件加速的问题,我开发了VectorTraits库。它支持X86和Arm平台。

  • X86平台:使用_mm256_shuffle_epi8等指令。
  • Arm平台:使用vqvtbl1q_u8等指令。

方法如下。

不仅针对Vector256,还针对Vector128和Vector,该库提供了Shuffle方法。

NuGet:https://www.nuget.org/packages/VectorTraits

© www.soinside.com 2019 - 2024. All rights reserved.