【问题标题】:How modern X86 processors actually compute multiplications?现代 X86 处理器如何实际计算乘法?
【发布时间】:2014-12-09 19:21:12
【问题描述】:

我在看一些关于算法的讲座,教授用乘法作为如何改进朴素算法的例子......

这让我意识到乘法并不那么明显,虽然我在编码时只是认为它是一个简单的原子操作,但乘法需要一个算法来运行,它不像对数字求和那样工作。

所以我想知道,现代桌面处理器实际使用什么算法?我猜他们不依赖对数表,也不用数千和循环......

【问题讨论】:

  • 您需要指定“整数”或“浮点数”;可能还有哪个 CPU。请注意,对于浮点,指数相加,有效数字相乘,有效数字大多在 1.0 到 1.9999* 的范围内,这使得它们“更适合”对整数没有意义的方法..
  • 您需要选择一个特定的 CPU 并查看它的完整数据表(我的意思是 10MByte 或更大的 PDF)。他们有时会提到这样的事情。但是要确定您需要询问 CPU 开发人员/制造商或 inspect its die Visual6502 包含很多芯片的镜头,然后选择一个...较旧的整数乘法器现在使用 Shift 和 Add 乘法,谁知道呢(LUT,近似值,Karatsuba ...)
  • 如果您确实是指 FP:很多 FP 乘数是整数尾数乘数。添加指数很简单,并且重新规范化尾数结果只是对指数的额外 0 或 1 偏移,假设标准化的输入和结果。
  • ALU 的内部设计可以成为 CPU 快速和节能的秘诀之一。这对 CPU 架构师来说很有趣,但与软件完全无关,甚至与 asm 的低级手动调整无关。重要的是性能:延迟和吞吐量。也就是说,就硬件设计算作编程而言,这是一个编程问题,但它询问的是现有设计是如何完成的。

标签: algorithm x86 cpu-architecture alu micro-architecture


【解决方案1】:

有一个可以在 CPU 中使用的乘法程序数组。例如,大多数计算机体系结构/组织课程中教授的 2 的补码二进制数的 Booth 乘数。二进制乘法比十进制乘法更简单。计算部分产品很简单。被乘数,M,(如果乘数位为 1)或 0(如果乘数位为 0)。将其与十进制比较,它可以是(0*M 到 9*M)之间的任何值。每当有人设计定制 CPU(如 FPGA 上的软核)时,开发人员都可以选择适当的乘法程序。一些常用的是CORDIC乘法器、Radix-2、Radix-4、Radix-8...展台乘法器。所有这些乘法器算法都会生成部分乘积(如手动乘法)。添加所有部分产品以获得最终产品。在现代处理器中有多种方法可以做到这一点,例如使用 Dadda 乘法器、Wallace 树。

简单地说,每个处理器设计人员都可以使用任何乘法器算法来生成部分乘积并将部分乘积相加得到最终结果。根据处理器寄存器内部使用的二进制表示、寄存器大小(以位为单位),最佳算法会有所不同。

【讨论】:

  • (我想至少在 Paul A. Clayton 回答时,上述内容已为 Speeder 所熟知(请参阅Paul R's comment)。真正的问题是 什么是乘数 通用处理器使用“当前”? - 显然是一个移动的目标。Alsup 先生关于检查专利申请和(侵权)挑战以及授权的建议可能是您找出答案的最佳选择。)
  • 我详细阐述了speeder提到的“我猜他们不依赖对数表,也不用成千上万的和制作循环......”。我的回答解释说它不会是“千和”,只会为 N 位操作数/寄存器添加 N 或更少的部分乘积。如果使用 CORDIC 实现,则比利鲍勃建议的 LUT 将发挥作用。
  • 通过 Google 快速搜索发现 dsprelated.com/thread/3151/details-of-a-cordic-multiplier 链接了 A survey of CORDIC algorithms for FPGA based computers。 +1,这个答案确实比仅仅说一切最终都使用达达树更详细。
【解决方案2】:

Mitch Alsup(曾开发过 Motorola 88K、Ross SPARC、AMD x86 等)在 comp.arch 新闻组中表示:

所有现代乘法器设计者都使用 Dadda 方法来构建树。

Message-ID: <c45d9d2e-039d-4085-a617-d90f7a3b1f93@googlegroups.com> — 2018 年 12 月 14 日)

以及(关于 AMD/Intel/NVIDIA 使用哪些乘法机制的最新参考资料):

仅在专利局。

Message-ID: <d92d1961-a3e4-441e-8b3d-b9ce6bd24b58@googlegroups.com> — 2020 年 1 月 14 日)

有关Dadda tree multipliers 的信息,请参阅维基百科。

【讨论】:

  • (提一下时间框架:命名的处理器设计来自 1990 年代,Alsup 先生是千禧年之交的 Athlon K9 的首席架构师,并于 2015 年左右退休。消息来自 12 月18 和 20 年 1 月。)
【解决方案3】:

现代处理器具有板载数学协处理器。我相信它们包含用于乘法的 LUT(查找表)。

【讨论】:

  • 有人能确认一下,这家伙刚刚写了什么吗?
  • @speeder 没有人可以,因为您没有指定 CPU 和操作...这就是为什么没有高级代表用户回答...因为没有指定是您的问题无法回答
猜你喜欢
  • 2013-07-06
  • 2020-04-19
  • 2013-10-22
  • 1970-01-01
  • 2013-09-11
  • 2017-12-27
  • 2018-04-03
  • 2015-07-02
  • 2015-11-12
相关资源
最近更新 更多