Разделение упакованного 16-битного целого числа с маской с использованием встроенных в AVX512 или SVML - PullRequest
0 голосов
/ 04 февраля 2020

Я ищу решение для деления упакованных 16-битных целых чисел с маской (например, __mmask16). _mm512_mask_div_epi32 внутренности кажутся хорошими; однако они поддерживают только упакованные 32-разрядные целые числа, что излишне вынуждает меня расширять упакованные 16-разрядные в упакованные 32-разрядные перед использованием.

1 Ответ

2 голосов
/ 04 февраля 2020

_mm512_mask_div_epi32 не настоящая сущность; это функция Intel SVML. x86 не имеет целочисленного деления SIMD, только SIMD FP double и float.

Если ваши векторы делителей являются константами времени компиляции (или используются повторно для нескольких дивидендов), см. https://libdivide.com/ для точного деления с использованием мультипликативного обратного.

В противном случае, вероятно, вам лучше всего конвертировать в FP с одинарной точностью, которые могут точно представлять каждое 16-битное целое число. Если _mm512_mask_div_epi32 выполняет какую-либо дополнительную работу, чтобы справиться с тем фактом, что FP32 не может точно представить все возможные int32_t, это будет потрачено впустую для вашего варианта использования.

(Некоторые будущие процессоры могут иметь поддержку неких 16-битных FP в ядрах IA, не только GPU, но на данный момент лучший способ воспользоваться преимуществами высокопроизводительного аппаратного исполнительного модуля div / sqrt SIMD - преобразование в float. один __m256 за 5 тактов для Skylake vdivps ymm с одним мопом или один за 10 тактов для __m512 с 3 мопами vdivps zmm)

...