_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
)