4
我想使用SIMD重寫這段代碼:使用SIMD,我如何將8位掩碼擴展爲16位掩碼?
int16_t v;
int32_t a[16];
int8_t b[32];
...
((int16_t *)a[i])[0] = b[i]==1? -v:v;
((int16_t *)a[i])[1] = b[i]==1? -v:v;
我想用_mm256_cmpeq_epi8
生成一個掩碼矢量,在那之後我可以用_mm256_and_si256
和_mm256_andnot_si256
進行價值選擇的。
問題是b [i]是8位整數,而v是16位。
如果掩碼向量與{0xff, 0x00, 0xff, 0x00...}
相似,則需要將其擴展爲{0xffff, 0x0000, 0xffff, 0x0000...}
以執行16位值選擇。
我該怎麼做? (對不起,我的英文版)
編輯:
我找到了靈感來自this question的解決方案。
_mm256_shuffle_epi256
只能在128位通道內執行。 因此,我打破_mm256i掩碼到2 _mm128i寄存器。然後用_mm256_broadcastsi128_si256
和_mm256_shuffle_epi256
我得到了結果。