Я пытаюсь переписать этот кусок кода с помощью 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
Я получил результат.