_mm256_shuffle_ps 是如何工作的?

How does _mm256_shuffle_ps work?

我了解 _mm_shuffle_ps 的工作原理。例如,在下面。

__m128 r = _mm_shuffle_ps(x,y, _MM_SHUFFLE(2,0,2,0)); 

r 会有内容,x[0], x[2], y[0], y[2].

但我看到 _MM_SHUFFLE 也为 _mm256_shuffle_ps 采用 4 个参数,而每个向量将有 8 个元素。所以,逻辑上 _MM_SHUFFLE 应该有 8 个参数。有人可以解释一下这是如何工作的吗?

_mm256_shuffle_ps 独立地对两个 128 位通道中的每一个进行洗牌,就好像在两个 XMM 上调用 _mm_shuffle_ps 一样。如果你想洗牌所有8个32位元素,你需要_mm256_permutevar8x32_ps

SSE/AVX 采用立即数操作数的指令始终只采用 8 位立即数。

像往常一样,the manual explains how the 8-bit immediate is used。它对两个 128b 通道应用相同的洗牌。

部分指令在128b版本的立即数中有空闲位,256b版本可以使用。例如256b shufpd 将立即数的第 2 位和第 3 位用于上通道,与通常的第 0 位和第 1 位分开用于下 128。

shufps 需要四组 2 位到 select 每个目标元素的四个元素之一,因此 imm8 中没有额外的空间。