x86 CPU的128x128位乘法

时间:2015-04-15 18:30:15

标签: gcc x86 inline-assembly multiplication

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

2 个答案:

答案 0 :(得分:2)

有GNU GMP库 - https://gmplib.org/,对于长整数应具有良好的优化乘法。它具有基准https://gmplib.org/download/misc/gmpbench-0.2.tar.bz2,可用于测试128x128案例(multiply.c,args 128 128)

对于固定尺寸,您可以尝试使用GMP的低级接口 - mpn https://gmplib.org/manual/Low_002dlevel-Functions.html

  

功能:mp_limb_t mpn_mul (mp_limb_t *rp, const mp_limb_t *s1p, mp_size_t s1n, const mp_limb_t *s2p, mp_size_t s2n)   将{s1p, s1n}和{s2p, s2n}相乘,并将(s1n+s2n) - 肢体结果写入rp。返回结果中最重要的部分。

     

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

     

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

对于一些特殊情况,haswell声称速度为1.57-1.8个循环/肢体(“通常一个肢体包含32或64位”) http://code.metager.de/source/xref/gnu/gmp/mpn/x86_64/coreihwl/mul_1.asm#35

答案 1 :(得分:2)

如果你只需要快速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