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

2019-07-03 11:01发布

所述_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位的向量,而不是两个。

Answer 1:

不,没有整数等效于此。 所以,你必须要么效仿,或欺骗。

一种方法是使用_mm_shuffle_epi32()AB 。 然后屏蔽掉所需项,或者他们重新走到一起。

这往往是凌乱而有大约5条指令。 (或3,如果您使用SSE4.1指令混合)。

这里有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执行单元之间的额外延迟。 因此,这将不仅仅是重排指令更加昂贵。



文章来源: _mm_shuffle_ps() equivalent for integer vectors (__m128i)?
标签: c sse