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