固定大小整数与gmp ......?

时间:2011-08-31 22:00:22

标签: c++ c mingw gmp 128-bit

我已经尝试了几天在MINGW下安装GMP库。我已经在linux64位环境下使用gcc数周__uint128_t,然后在GMP和mingw(32位版本)下移植了相同的程序。我使用了mpz_class个整数而不是__uint128_t。然后我开始了我的新程序......使用__uint128_t和64位需要16分钟才能完成,GMP和MINGW需要91小时!!!

我应该怎么做才能加速一些事情?有没有更快的方法在32位环境下进行128位整数运算?我不需要超过128位,所以有没有办法告诉GMP“好吧,我只需要128位,保持预定固定,但请更快”?

2 个答案:

答案 0 :(得分:3)

不,当您使用mpz_t时,您无法将GMP限制为fixed-len整数。 mpz_t是一个带有长度数组(已分配;已使用)和指向实际值的指针的结构,该指针存储为整数数组(四肢; int32或int64的数组)。 GMP随时可以扩展任何价值的长度。

您可以使用mpz_init2

在init为每个mpz_t分配128位
 mpz_init2(mpz_t*, bit_number);

但是由此产生的加速很小,仍有数据间接和长度处理。

您可以直接使用肢体切换到mpn_低级功能:

http://www.gnu.org/software/gmp/manual/html_node/Low-level-Functions.html#Low-level%20Functions

没有指向肢体的指针(这对缓存很有用),没有简单的输入/输出代码;并且没有自动肢体大小处理(也不自动扩展;也没有分配)。你应该自己做所有存储;可能甚至一些携带必须手动处理,但会有GMP的快速*/%操作;您可以使用mpz_t t;t._mp_size = t._mp_alloc=limb_number;t._mp_d=pointer_to_limb_array重建mpz_t以便于输入/输出。

另外,如果你要切换到64位mingw,你可以使用uint128_t。

答案 1 :(得分:1)

如果您定位的Windows计算机足够新,可以使用MinGW-w64,而不是64位Windows(例如Vista或7)。