【问题标题】:Does C internally use Karatsuba algorithm to multiply two integers?C 内部是否使用 Karatsuba 算法将两个整数相乘?
【发布时间】:2017-02-13 11:16:28
【问题描述】:

当 C 将两个 n-bits 整数相乘时,它是在内部使用普通的 O(n^2) 乘法算法,还是使用 Karatsuba 的 O(n^log_2(3)) 乘法算法的变体?

【问题讨论】:

  • C 标准本身并没有规定这样的实现细节。每个编译器都会为每个目标架构选择适当的指令,因此它将取决于该指令集。
  • C - 没有。编译器 - 可能不是。底层硬件架构——也许吧。
  • C 没有 n 位整数。
  • 这取决于实现。在没有乘法指令的硬件上,可能是的,但您需要检查库/编译器的源代码。
  • “它既不是硬件也不是我在学习建筑课程”?这跟我说的有什么关系???

标签: c algorithm multiplication


【解决方案1】:

没有。 Karatsuba 算法的“记账”开销太高太复杂。即使要在机器字级别上实现收支平衡的递归深度,它也会比乘法器占用更多的硅片。对于足够大的n,硬件加密加速器或 FPGA 可能值得。即便如此,收支平衡可能太高而无法满足加密需求。没有免费的午餐。

另一方面,我们可以查看GMP library 中的gmp-mparam.h 文件,这些文件定义了阈值 值,在该值处,渐近更快的算法实际上开始发挥作用。 'Karatsuba' 是更通用的 Toom-Cook 算法的 2x2 情况。即使在像 Broadwell 和 Skylake CPU 这样的怪物上,阈值也大约是 28 个“字”或 1792 位。这是由于(递归地)将 3 个结果加在一起的开销,以及进位传播。随着乘法指令吞吐量的增加,这些阈值会越来越高。

【讨论】:

    【解决方案2】:

    C 不会相乘。它定义了二进制* 运算符的语义。它的实现方式留给编译器。

    编译器不会乘法。它将二进制 * 运算符转换为 (a) 机器指令,由 CPU 执行。

    CPU 倍增。它通常为此提供专门的说明。它向编译器提供什么指令,以及它如何实现这些指令取决于 CPU 和它的预期用途。但是乘法是一项非常常见的任务,任何值得称道的台式机 CPU 都有专门的硬件电路。

    【讨论】:

      猜你喜欢
      • 2011-05-26
      • 1970-01-01
      • 1970-01-01
      • 2016-04-14
      • 2020-08-17
      • 1970-01-01
      • 1970-01-01
      • 2019-06-01
      • 1970-01-01
      相关资源
      最近更新 更多