【问题标题】:128-bit arithmetic on x64 in CC 中 x64 上的 128 位算术
【发布时间】:2011-07-14 10:04:34
【问题描述】:

在 x86 上实现 bignums 时,显然最有效的数字大小选择是 32 位。但是,您需要最多两倍于数字大小的算术(即 32+32=33、32*32=64、64/32=32)。幸运的是,x86 不仅提供了这一点,而且还可以从便携式 C (uint64_t) 访问它。

同样,在 x64 上,最好使用 64 位数字。这将需要 128 位算术(即 64+64=65、64*64=128、128/64=64)。幸运的是,x64 提供了这一点。不幸的是,它不能从便携式 C 中访问,尽管显然可以使用汇编。

所以我的问题是它是否可以从不可移植的 C 中访问。x64 上的任何 C 编译器是否提供对此的访问,如果是,语法是什么?

(请注意,我说的不是严格视为 32 位或 64 位字的集合的 128 位向量,它们之间没有进位传播,而是实际的 128 位整数运算。)

【问题讨论】:

    标签: c integer x86-64 biginteger 128-bit


    【解决方案1】:

    您可能需要查看 GNU 多精度算术库:

    http://gmplib.org/

    【讨论】:

      【解决方案2】:

      GCC 4.1 引入了带有 __int128_t__uint128_t 内置类型的初始 128 位整数支持,但自 GCC 4.6__int128 / unsigned __int128 起正式发布了 128 位类型

      Clang 也支持这些类型,虽然我不知道从什么时候开始。 Godbolt (3.0.0) 上的第一个版本确实支持 __int128_t

      ICC 从 13.0.0 版开始获得同样的支持:128-bit integers supporting +, -, *, /, and % in the Intel C Compiler?

      另见


      如果您使用的是 MSVC,那么没有对 128 位类型的直接支持,但有许多内在函数可以帮助您执行 128 位操作:

      • 64*64=128:_mul128()_umul128()__mulh()__umulh()

      • 128/64=64:_div128()_udiv128()

      • 64+64=65:加法中的进位可以很容易地通过将和的低位部分与任何操作数进行比较来获得:

        struct uint128 {
            uint64_t H, L;
        };
        
        inline uint128 add(uint128 a, uint128 b)
        {
            uint128 c;
            c.L = a.L + b.L;                // add low parts
            c.H = a.H + b.H + (c.L < a.L);  // add high parts and carry
            return c;
        }
        

        128位减法也可以用同样的东西

      虽然实现这些是微不足道的,但也有用于移位的内在函数:__shiftleft128()__shiftright128()


      如果您使用的是不受支持的编译器,那么只需使用许多可用库中的一些固定宽度类型,这样会快得多。例如ttmath:UInt&lt;4&gt;(具有四个 32 位分支的 128 位 int 类型),或Boost.Multiprecisioncalccrypto/uint128_t 中的(u)int128_t。像 GMP 这样的任意精度算术库对此来说成本太高了。一个例子:Optimization story: Switching from GMP to gcc's __int128 reduced run time by 95%

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-04-02
        • 1970-01-01
        • 1970-01-01
        • 2017-09-03
        • 1970-01-01
        • 2019-10-22
        • 2011-09-18
        • 2016-03-26
        相关资源
        最近更新 更多