私は、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_and_si256
と_mm256_andnot_si256
を使用することができた後、マスクベクトルを生成する_mm256_cmpeq_epi8
を使用して考えていました。
問題はb [i]は8ビット整数で、vは16ビットです。
マスクベクトルが{0xff, 0x00, 0xff, 0x00...}
の場合、16ビット値を選択するには{0xffff, 0x0000, 0xffff, 0x0000...}
に拡張する必要があります。
どうすればいいですか? は(私の英語のため申し訳ありませんが)
編集:
私はthis questionからのインスピレーションと解決策を見つけました。
_mm256_shuffle_epi256
は、128ビットのレーン内でしか実行できません。 したがって、_mm256iマスクを2つの_mm128iレジスタに分割しました。そして、_mm256_broadcastsi128_si256
と_mm256_shuffle_epi256
で結果を得ました。