有没有更好的方法使用SSE将unsigned char
数组加载到short
中?例如
unsigned char foo1[16];
__m128i foo2 = _mm_loadu_si128((__m128i*)foo1);
我希望foo2
能够用short int
数据类型存储元素。
有没有更好的方法使用SSE将unsigned char
数组加载到short
中?例如
unsigned char foo1[16];
__m128i foo2 = _mm_loadu_si128((__m128i*)foo1);
我希望foo2
能够用short int
数据类型存储元素。
不是很清楚你想要什么。
但是,如果你想要每个输入字节都有一个短值的SSE寄存器,那么你可能需要这样做(未经测试):
__declspec( align( 16 ) ) unsigned char foo1[ 16 ];
// Fill your array with data
const __m128i src = _mm_load_si128( ( __m128i* )foo1 );
const __m128i zero = _mm_setzero_si128();
const __m128i lower = _mm_unpacklo_epi8( src, zero ); // First 8 short values
const __m128i higher = _mm_unpackhi_epi8( src, zero ); // Last 8 short values
pmovzxbw xmm,[mem]
,因为它们有两个128b的洗牌单元,特别是如果内存地址不使用索引寻址模式(因此可以微融合)。无论如何,如果您的数据是8B对齐但不是16B对齐,则2x pmovzx从内存中读取将更好。这也是较少的融合域uops(没有单独的负载),而且您不需要零向量。 - Peter Cordes