Gcc x86 CPU上的128x128位乘法

Gcc x86 CPU上的128x128位乘法,gcc,x86,inline-assembly,multiplication,Gcc,X86,Inline Assembly,Multiplication,在我的应用程序中,我需要一个快速的128x128位乘法(结果=256位)。是否有任何x86优化库执行此操作?有GNU GMP库-它应该具有良好的长整数优化乘法。它具有可用于测试128x128情况的基准(multiply.c,args 128) 对于固定尺寸,您可以尝试GMP-mpn的低级接口 功能:mp\u limb\u t mpn\u mul(mp\u limb\u t*rp,const mp\u limb\u t*s1p,mp\u size\u t s1n,const mp\u limb\u

在我的应用程序中,我需要一个快速的128x128位乘法(结果=256位)。是否有任何x86优化库执行此操作?

有GNU GMP库-它应该具有良好的长整数优化乘法。它具有可用于测试128x128情况的基准(multiply.c,args 128)

对于固定尺寸,您可以尝试GMP-
mpn的低级接口

功能:
mp\u limb\u t mpn\u mul(mp\u limb\u t*rp,const mp\u limb\u t*s1p,mp\u size\u t s1n,const mp\u limb\u t*s2p,mp\u size\u t s2n)
将{
s1p,s1n
}和{
s2p,s2n
}相乘,并将(
s1n+s2n
)肢体结果写入
rp
。返回结果的最重要部分

目的地必须有空间容纳
s1n+s2n
肢体,即使产品的最重要肢体为零。目标和任一源之间不允许重叠

此功能要求
s1n
大于或等于
s2n

对于haswell上的某些特殊情况,声称速度为1.57-1.8个周期/支路(“支路通常包含32或64位”)

如果您只需要快速的128x128位乘法运算,您可以自己完成

在32位CPU下需要16(32*32位)乘法,在64位CPU下需要4(64*64位)乘法

32位CPU(使用32位乘法)下的算法为:

假设ABCD和EFGH表示两个128位数字,任何字母表示一个32位的128位数字

ABCD * EFGH =  
  ABCD * E * 2^96 //Multiplication with 2^96 is 96 left shift or mov for 3 32bit digits 
+ ABCD * F * 2^64 
+ ABCD * G * 2^32 
+ ABCD * H 
其中n是32位数字

ABCD * n =  
  A * n * 2^96 //Multiplication with 2^96 is 96 left shift or mov for 3 32bit digits
+ B * n * 2^64
+ C * n * 2^32 
+ D * n

Recetn GCC具有
int128\u t
,因此您可以利用它是的,但它不支持256位整数作为结果。足够快多少?相关:。您还可以将2
int128\u t
s相乘以获得低位128位,然后手动计算高位,因为两个操作数的大小相同。许多ISA提供了加宽乘法(一对寄存器中32x32=>64位),例如x86、ARM和MIPS。(一些剥离臂芯只有窄mul)。在C语言中,编译器通常知道如何将
a*(uint64_t)b
优化为一个加宽的乘法。(但是当您试图让编译器发出带进位的adc时,C的问题就出现了)