3

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

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

4

2 回答 2

3

不,当您使用 时mpz_t,您不能将 GMP 限制为固定长度的整数。mpz_t 是一个结构,其长度为肢体数组(已分配;已使用)和一个指向实际值的指针,该指针存储为整数数组(肢体;int32 或 int64 数组)。当它变大时,GMP 已准备好扩展任何值的长度。

您可以在初始化时为每个 mpz_t 分配 128 位,使用mpz_init2

 mpz_init2(mpz_t*, bit_number);

但是由此带来的加速很小,仍然存在数据间接和长度处理。

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

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

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

此外,如果您将切换到 64 位 mingw,则可以使用 uint128_t。

于 2011-08-31T22:07:59.297 回答
1

如果您的目标 Windows 机器足够新,可以使用 64 位 Windows(例如 Vista 或 7),您可以使用MinGW-w64代替。

于 2011-08-31T22:10:27.210 回答