_mm512_madd52lo_epu64和_mm512_madd52hi_epu64是 Intel AVX-512IFMA (Integer Fused Multiply-Add) 指令集中的两个指令,它们可以用于实现高效的 Montgomery 乘法。这两个指令的功能是:
_mm512_madd52lo_epu64: 将 b 和 c 中的每个 64 位元素中的低 52 位无符号整数相乘,得到 104 位的中间结果,然后将中间结果的低 64 位与 a 中的相应的无符号 64 位整数相加,将结果存储在 dst 中。
intel指令描述:
FOR j := 0 to 7
i := j*64
tmp[127:0] := ZeroExtend64(b[i+51:i]) * ZeroExtend64(c[i+51:i])
dst[i+63:i] := a[i+63:i] + ZeroExtend64(tmp[51:0])
ENDFOR
dst[MAX:512] := 0
_mm512_madd52hi_epu64: 将 b 和 c 中的每个 64 位元素中的低 52 位无符号整数相乘,得到 104 位的中间结果,然后将中间结果的高 64 位与 a 中的相应的无符号 64 位整数相加,将结果存储在 dst 中。
intel指令描述:
FOR j := 0 to 1
i := j*64
tmp[127:0] := ZeroExtend64(b[i+51:i]) * ZeroExtend64(c[i+51:i])
dst[i+63:i] := a[i+63:i] + ZeroExtend64(tmp[103:52])
ENDFOR
dst[MAX:128] := 0
尝试利用IFMA进行大整数的乘法操作
#include <immintrin.h>
__m512i muladd52(__m512i a, __m512i b, __m512i c) {
__m512i lo = _mm512_madd52lo_epu64(a, b, c); // 低 64 位的乘法和累加
__m512i hi = _mm512_madd52hi_epu64(lo, b, c); // 高 64 位的乘法和累加 依旧是保持两部分 每部分52bits
return hi;
}