使用GMP的固定大小整数...?

3
我已经尝试了几天在MINGW下安装GMP库。我在64位Linux环境下使用gcc和__uint128_t数周,然后将相同的程序移植到GMP和mingw(32位版本)下。我使用mpz_class整数代替__uint128_t。然后我启动了我的新程序...!使用__uint128_t和64位需要16分钟才能完成,而使用GMP和MINGW需要91小时!!!
有什么方法可以加快速度吗?在32位环境下有更快的方式进行128位整数运算吗?我不需要超过128位,所以有没有办法告诉GMP“好的,我只需要128位,保持精度固定但请加速”?

在128位上需要进行哪些操作?(+-</>*/,还有更有趣的操作吗?) - osgx
编译器本身支持64位。查找使用32位uint执行64位算术的代码,并使用这些原则将其实现为使用64位uint的128位uint。它可能不像本机128位支持那样快(例如,您可以使用SSE获得),但它可能比libgmp更快。 - user786653
编译器可能支持64位,但是特别是像除法(和取模)和乘法这样的操作在真正的64位环境中可以更快(也就是说,使用64位寄存器,并且寄存器数量更多)。 - Rudy Velthuis
2个回答

3
不,当您使用mpz_t时,无法将GMP限制为固定长度的整数。 mpz_t是具有limbs数组(已分配;已使用)长度的结构体,并且指向实际值的指针存储为int(limbs; int32或int64数组)。当值变得太大时,GMP将准备扩展其长度。
您可以在初始化时为每个mpz_t分配128位,使用mpz_init2
 mpz_init2(mpz_t*, bit_number);

但是这种加速只能稍微提升一点速度,仍然存在数据间接和长度处理的问题。
您可以直接使用limbs并切换到mpn_低级函数: http://www.gnu.org/software/gmp/manual/html_node/Low-level-Functions.html#Low-level%20Functions 这样就没有对limbs的指针(这对缓存很有好处),也没有简单的输入/输出代码;也没有自动limbs大小处理(或自动扩展或分配)。您应该自己处理所有存储空间,甚至可能需要手动处理一些进位,但是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。

使用mpz_init2并分配128位是否会使它更快? - Matteo Monti
@Matteo 他说:“但是这样加速的效果很小。” - Seth Carnegie
@ Seth(谢谢,但他编辑了答案!:D 我之前没看到!) - Matteo Monti

1

如果你的目标 Windows 机器是新的,并且装有64位Windows(如Vista或7),则可以使用MinGW-w64


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接