使用 AVX512 或 SVML 内在函数将压缩的 16 位整数与掩码相除
Dividing packed 16-bit integer with mask using AVX512 or SVML intrinsics
我正在寻找用掩码(例如__mmask16
)划分压缩的 16 位整数的解决方案。 _mm512_mask_div_epi32
内在函数似乎不错;但是它们只支持打包的 32 位整数,这不必要地迫使我在使用之前将打包的 16 位扩展为打包的 32 位。
_mm512_mask_div_epi32
不是真正的内在;这是一个英特尔 SVML 函数。 x86 没有 SIMD 整数除法,只有 SIMD FP double
和 float
.
如果您的除数向量是编译时常量(或重复用于多次被除数),请参阅 https://libdivide.com/ 使用乘法逆进行精确除法。
否则,您最好的选择可能是转换为可以精确表示每个 16 位整数的单精度 FP。如果 _mm512_mask_div_epi32
做了任何额外的工作来处理 FP32 不能 准确表示所有可能的 int32_t
的事实,那对你的用例来说是浪费了。
(某些未来的 CPU 可能会在 IA 内核中支持某种 16 位 FP,而不仅仅是 GPU,但目前这是利用高吞吐量硬件的最佳方式 div/sqrt SIMD 执行单元是通过转换为 float
。比如 Skylake vdivps ymm
每 5 个时钟周期一个 __m256
一个 uop,或者每 10 个时钟周期一个 __m512
一个3-uop vdivps zmm
)
我正在寻找用掩码(例如__mmask16
)划分压缩的 16 位整数的解决方案。 _mm512_mask_div_epi32
内在函数似乎不错;但是它们只支持打包的 32 位整数,这不必要地迫使我在使用之前将打包的 16 位扩展为打包的 32 位。
_mm512_mask_div_epi32
不是真正的内在;这是一个英特尔 SVML 函数。 x86 没有 SIMD 整数除法,只有 SIMD FP double
和 float
.
如果您的除数向量是编译时常量(或重复用于多次被除数),请参阅 https://libdivide.com/ 使用乘法逆进行精确除法。
否则,您最好的选择可能是转换为可以精确表示每个 16 位整数的单精度 FP。如果 _mm512_mask_div_epi32
做了任何额外的工作来处理 FP32 不能 准确表示所有可能的 int32_t
的事实,那对你的用例来说是浪费了。
(某些未来的 CPU 可能会在 IA 内核中支持某种 16 位 FP,而不仅仅是 GPU,但目前这是利用高吞吐量硬件的最佳方式 div/sqrt SIMD 执行单元是通过转换为 float
。比如 Skylake vdivps ymm
每 5 个时钟周期一个 __m256
一个 uop,或者每 10 个时钟周期一个 __m512
一个3-uop vdivps zmm
)