【发布时间】:2017-02-21 03:26:32
【问题描述】:
我正在尝试使用 simd 重写这段代码:
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 我得到了结果。
【问题讨论】: