_mm_shuffle_ps() 等价于整数向量 (__m128i)?

Posted

技术标签:

【中文标题】_mm_shuffle_ps() 等价于整数向量 (__m128i)?【英文标题】:_mm_shuffle_ps() equivalent for integer vectors (__m128i)? 【发布时间】:2012-10-31 08:05:43 【问题描述】:

_mm_shuffle_ps() 内在函数允许将浮点输入交错为输出的低 2 个浮点数和高 2 个浮点数。

例如:

R = _mm_shuffle_ps(L1, H1, _MM_SHUFFLE(3,2,3,2))

将导致:

R[0] = L1[2];
R[1] = L1[3];
R[2] = H1[2];
R[3] = H1[3]

我想知道整数数据类型是否有类似的内在函数可用?需要两个 __m128i 变量和一个掩码用于交错的东西?

_mm_shuffle_epi32() 内在函数只接受一个 128 位向量,而不是两个。

【问题讨论】:

取决于元素的大小。如果您需要 32 位整数,只需使用 _mm_shuffle_ps,这也适用于整数。 所以我应该将 __m128i 类型转换为 __m128?让我看看这是否有效.. 【参考方案1】:

不,没有与此等效的整数。所以你要么模仿它,要么作弊。

一种方法是在AB 上使用_mm_shuffle_epi32()。然后屏蔽所需的术语并将它们重新组合在一起。

这往往很混乱,大约有 5 条指令。 (如果您使用 SSE4.1 混合指令,则为 3。)

这是带有 3 条指令的 SSE4.1 解决方案:

__m128i A = _mm_set_epi32(13,12,11,10);
__m128i B = _mm_set_epi32(23,22,21,20);

A = _mm_shuffle_epi32(A,2*1 + 3*4 + 2*16 + 3*64);
B = _mm_shuffle_epi32(B,2*1 + 3*4 + 2*16 + 3*64);

__m128i C = _mm_blend_epi16(A,B,0xf0);

我更喜欢的方法是像这样作弊 - 和浮点洗牌:

__m128i Ai,Bi,Ci;
__m128  Af,Bf,Cf;

Af = _mm_castsi128_ps(Ai);
Bf = _mm_castsi128_ps(Bi);
Cf = _mm_shuffle_ps(Af,Bf,_MM_SHUFFLE(3,2,3,2));
Ci = _mm_castps_si128(Cf);

这样做是将数据类型转换为浮点数,以便它可以使用浮点随机播放。然后再转换回来。

请注意,这些“转换”是按位转换(也称为重新解释)。实际上没有进行任何转换,它们也没有映射到任何指令。在汇编中,整数或浮点 SSE 寄存器没有区别。这些强制转换内在函数只是为了绕过 C/C++ 强加的类型安全。

但是,请注意,这种方法会在整数和浮点 SIMD 执行单元之间来回移动数据时产生额外的延迟。所以它会比 shuffle 指令更昂贵。

【讨论】:

这就是我要发布的内容,但花了我更长的时间。 试试-flax-vector-conversions 我想知道这与不切换域并执行_mm_shuffle_epi32(_mm_unpackhi_epi32(Ai,Bi), 0xd8)相比如何? @Zboson 我从未真正尝试过。我不能说我真的需要这样的整数洗牌了——因为我总是能够找到一个更好的数据布局,还有其他好处。 @Zboson:在整数数据上使用 FP shuffle 没有额外的绕过延迟。 (在某些 CPU 上,情况并非如此。在其他 CPU 上,例如 AMD,甚至 FP shuffle 也会发生在 ivec 域中,并对addps / shufps / addps 施加旁路延迟。)相同的 shuffle 硬件句柄FP 和 int 改组;这只是接线问题。显然,硬件设计人员仍然可以在整数转发网络和 FP 转发网络上提供 FP shuffle 的结果。

以上是关于_mm_shuffle_ps() 等价于整数向量 (__m128i)?的主要内容,如果未能解决你的问题,请参考以下文章

可以从一个来源获取 3 个元素的 _mm_shuffle_ps 的替代方案?

在 Xcode 4 (LLVM GCC) 中使用 _mm_shuffle_ps 时可能出现 OpenMP + SSE 错误

初等行变换不改变列向量组的线性关系

如何在 AVX2 中将 32 位无符号整数转换为 16 位无符号整数?

Javascript 整数除法,或者是 Math.floor(x) 等价于 x | 0 代表 x >= 0?

Python 等价于 PHP Mcrypt