gpt4 book ai didi

c - _mm_shuffle_ps() 等价于整数 vector (__m128i)?

转载 作者:太空狗 更新时间:2023-10-29 17:01:34 26 4
gpt4 key购买 nike

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

例如:

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 位 vector 而不是两个。

最佳答案

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

一种方法是在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);

它所做的是将数据类型转换为 float ,以便它可以使用 float 随机播放。然后将其转换回来。

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

但是,请注意,此方法会导致在整数和浮点 SIMD 执行单元之间来回移动数据的额外延迟。所以它会比仅随机播放指令更昂贵。

关于c - _mm_shuffle_ps() 等价于整数 vector (__m128i)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13153584/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com