计算机如何实现“乘法”

下面分层次把乘法在数据表示 → 整数硬件/软件 → 大整数 → 浮点数 → 特殊场景里的主流实现方式讲清楚,并给出取舍建议与简单伪代码。


0)前置:数的表示

  • 无符号整数:按二进制位权求值。
  • 有符号整数:几乎都用二进制补码;负数乘法与正数一样用同一套电路(Booth 等方法天然支持)。
  • 定点数:将小数放到整数域乘法里处理(先按整数乘,再按小数位数右移对齐)。
  • 浮点数(IEEE-754):把数拆成符号 S、阶码 E、尾数/有效数 M;乘法=尾数相乘、阶码相加、符号异或,随后规格化与舍入。

1)整数乘法:从“移位相加”到并行树

1.1 顺序“移位-相加”(Shift-and-Add)

最朴素、面积小,常见于极简 MCU 或需要省门电路的场合。
思想:被乘数 A 与乘数 B,从 B 的最低位起逐位检查;若该位为 1,就把 A 左移相应位后加到累加器里。

伪代码

acc = 0
for i in 0..(n-1):if (B[i] == 1): acc = acc + (A << i)
return acc
  • 优点:电路/代码简单,面积与功耗低。
  • 缺点:需要 n 次迭代,延迟大(O(n))。

1.2 Booth 乘法(Radix-2 / Radix-4 / Radix-8)

减少部分积的经典方法;对补码有效。把乘数按“比特跑动”分组,一串 1 相当于一次加减而不是多次相加:

  • Radix-2 处理 ...01(+A)与 ...10(−A)边界;
  • Radix-4 一次看两位(含重复位),只需 ±A、±2A 四种;
  • Radix-8 再扩大基数,换更多编码表。

优点:显著减少部分积数量→缩短后端压缩树深度。
取舍:更高基数=更复杂的前端编码与部分积生成,但往往更快/更省功耗。

1.3 阵列乘法器(Array Multiplier)

把所有部分积(AND 阵列产生)规则排布,用逐行进位加法器或**进位保存加法器(CSA)**消去。

  • 优点:结构规则、易布局布线(FPGA/ASIC 友好)。
  • 缺点:进位传播链长,速度一般。

1.4 Wallace/Dadda 压缩树(CSA Tree)

高性能通用解法:

  1. 并行生成部分积;
  2. 3:2 压缩器(全加器)或 4:2 压缩器把多位列“压缩”为两行(和、进位),逐层减少高度;
  3. 最后交给一次**进位传播加法器(CPA,如 CLA/Brent-Kung/Kogge-Stone)**得到结果。
  • 优点:并行度高,延迟近似 O(log n);现代 CPU/GPU/FPGA DSP 块常用(配合 改进 Booth)。
  • 缺点:面积和布线复杂度较高。

1.5 位串行 / 字串行 / 流水线

  • 位串行:每拍处理 1 位,极省面积。
  • 字串行:每拍处理一小段位宽。
  • 深度流水线:把“部分积生成→压缩树→CPA”分成多级,高频高吞吐;常见于 DSP/矩阵乘 MAC 单元。

1.6 FPGA 与 DSP Slice

FPGA 里通常有硬核 DSP 乘法器(如 18×25、27×27 等),综合器会自动映射。大位宽乘法通过平铺/分块实现;可选 截断饱和 以控资源与误差。


2)浮点乘法(IEEE-754)的标准流程

单次乘法 M1 × M2:

  1. 符号S = S1 XOR S2
  2. 阶码E = E1 + E2 − Bias
  3. 尾数P = (1.M1) × (1.M2)(隐含 1)
  4. 规格化:若 P ∈ [2,4) 则右移并 E++;若 <1 则左移并 E--
  5. 舍入:最近偶、向零、向上、向下;用 Guard/ Round/ Sticky 位保证正确舍入
  6. 特殊值:NaN、±Inf、±0、非正规数(Subnormal);溢出/下溢标志
  7. FMA(融合乘加)a*b + c 一次完成,只舍入一次,精度与性能更优,是现代 CPU/GPU/AI 核心标配。

3)大整数(多精度)乘法:从小学竖式到 FFT

在密码学/任意精度库(GMP、OpenSSL)中,位数 n 很大,复杂度主导:

  • 竖式(Schoolbook / Comba):O(n²),常用在小规模或分块内核;可做缓存友好的 Comba 布局。

  • Karatsuba:分治,O(n^1.585)。当 n 超阈值时快过竖式。

  • Toom-Cook(Toom-3/4/…):进一步分治,多项式插值思想。

  • FFT/NTT 乘法:把乘法转为卷积,O(n log n)。大到极致(上万位)时采用(如 Schönhage-Strassen、Fürer、Harvey-Hoeven 变体)。

  • 模乘(密码学):

    • Montgomery 乘法:把模约简“融合”进乘法,避免显式除法,适合固定模 N 的重复乘;
    • Barrett 约减:预计算 μ≈⌊b^{2k}/N⌋ 近似除法。
    • 常数时间实现避免时序侧信道。

4)乘以“特殊数”的优化(Strength Reduction)

  • 乘以 2^k:直接算术/逻辑左移
  • 乘以常数 C:编译器会把它分解为移位+加减(如 ×10(x<<3)+(x<<1)),或使用最少加法图/加法器网络;DSP 里常做乘法器-less FIR 滤波。
  • 乘以固定小数/系数表:可用查表(LUT)或分段线性逼近,换取延迟/功耗优势。

5)有限域乘法(GF(2)/GF(2^n))

在纠错码、密码(AES、GCM)里常见:

  • 加法=按位 XOR
  • 乘法=按位与与移位的多项式卷积,然后对既定本原多项式取模约简;
  • 可用 Karuatsuba-like 分治、查表、组合逻辑或 LUT+移位器实现。

6)“乘-加”与矩阵乘:从 MAC 到张量核心

  • MAC(Multiply-Accumulate):乘法器后接累加器,是 DSP 的心脏;可做饱和/舍入
  • 向量/SIMD:一次处理多对操作数。
  • 矩阵乘/卷积阵列systolic array、张量核心(FP16/BF16/INT8/FP8),实质是大量并行的乘-加单元 + 高带宽缓存/片上网络。

7)误差、溢出与近似乘法

  • 溢出策略:补码回绕(两端对齐)、饱和(钳位到最大/最小),DSP 常用饱和。
  • 截断/舍入:为省资源可截断低位,需量化误差评估。
  • 近似乘法器:在容错类应用(ML/多媒体)里牺牲少量精度换低功耗/更高吞吐。

8)何时用哪种实现?(工程取舍)

  • 极简硬件/低成本 MCU:顺序移位-相加或小基数 Booth,可能位串行。
  • 通用高性能 CPU/GPU/FPGA改进 Booth + Wallace/Dadda + 快速 CPA,深度流水线;浮点优先 FMA
  • FPGA 项目:尽量吃DSP Slice,超大位宽分块拼接;若系数常量,探索“移位+加法”。
  • 大整数/密码:选择 Karatsuba/Toom-Cook/FFT 结合 Montgomery/Barrett,注意常数时间。
  • DSP/AI:MAC 阵列、向量化/张量核,必要时做截断/饱和/定点量化

9)两个小例子

(A)Radix-4 Booth(简化版)

对乘数B做重叠分组:b_{i+1} b_i b_{i-1} (含1位重复)
编码到 {0, ±1, ±2}:000/111→0, 001/010→+1, 011→+2, 100→-2, 101/110→-1
对每组选择 {0, A, 2A, -A, -2A},左移 2i 位后累加到 CSA 树

(B)浮点乘法(单精度骨架)

S = S1 XOR S2
E = (E1 - Bias) + (E2 - Bias) + Bias
P = (1.M1) * (1.M2)    // 24×24 位阵列或 Booth+树
规格化(P, E)
舍入(P, GRS, mode)
检查 NaN/Inf/Subnormal/溢出/下溢

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/98355.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/98355.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/98355.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu 安装 / 配置 VNC

一、基础环境准备 1. 更新 sudo apt update 2. 安装 VNC 服务器 & 轻量桌面(XFCE) # 安装 TightVNC 服务器 + XFCE 桌面(推荐轻量方案) sudo apt install tightvncserver xfce4 xfce4-goodies xterm -y二、核心配置:让 VNC 加载桌面环境 1. 初始化 VNC 密码(首次…

计算机大数据毕业设计推荐:基于Spark的新能源汽车保有量可视化分析系统

精彩专栏推荐订阅&#xff1a;在下方主页&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f496;&#x1f525;作者主页&#xff1a;计算机毕设木哥&#x1f525; &#x1f496; 文章目录 一、项目介绍二、…

Android Looper源码阅读

看下Android Looper源代码&#xff0c;有助于理解Android系统消息循环流程、handler机制。Looper注释为class used to run a message loop for a thread&#xff0c; 即用于为一个线程运行消息循环&#xff0c; 或者说循环处理一个线程的消息。 Looper源码先看下这个类里的变量…

uni-app 和 uni-app x 的区别

差异解析 uni-app 是 DCloud 推出的成熟跨平台前端框架&#xff0c;基于 Vue.js JavaScript/TypeScript。支持广泛平台&#xff1a;iOS、Android、HarmonyOS、Web、小程序等&#xff0c;用一套代码同时生成多个端应用。渲染方式主要通过 WebView 或小程序原生框架 JS 逻辑&am…

数据结构:深度优先搜索 (Depth-First Search, DFS)

目录 DFS的诞生——“不撞南墙不回头” DFS的核心机制——如何实现“回溯”&#xff1f; DFS算法流程图解&#xff08;递归版&#xff09; C/C代码实现 DFS的应用 上一节我们学习了广度优先搜索 (BFS)&#xff0c;它像水面的波纹一样&#xff0c;一层一层地向外探索。今天…

Spring Boot中策略模式结合依赖注入的实现方式

在Spring Boot项目开发中&#xff0c;常常会遇到根据不同的业务场景执行不同逻辑的需求&#xff0c;策略模式就是一种很好的设计模式来应对这种情况。同时&#xff0c;Spring Boot强大的依赖注入机制可以方便地将不同的策略类进行管理和调用。 1. 定义策略接口 定义一个策略接口…

深入剖析Spring Boot中Spring MVC的请求处理流程

对于任何使用Spring Boot进行Web开发的开发者而言&#xff0c;深入理解Spring MVC的执行流程都是至关重要的。这不仅有助于我们编写更清晰、更高效的代码&#xff0c;更是我们排查诡异问题、进行高级定制开发的知识基石。今天&#xff0c;我们将一起深入Spring Boot应用的内核&…

X448 算法签名验签流程深度解析及代码示例

一、引言&#xff1a;X448 算法的定位与价值在椭圆曲线密码学&#xff08;ECC&#xff09;体系中&#xff0c;X448 是基于蒙哥马利曲线&#xff08;Curve448&#xff09;的密钥交换算法&#xff0c;但其底层数学原理也可支撑签名验签功能&#xff08;实际工程中常与 Ed448 签名…

2025-2026单片机物联网毕业设计题目推荐(定稿付款)

51.基于单片机的非接触式防疫自动门系&#xff08;1&#xff09;人员检测&#xff1a;利用超声波模块进行人员检测&#xff0c;检测到人员靠近门体时触发相应的操作&#xff1b;&#xff08;2&#xff09;门控制&#xff1a;通过舵机实现自动门的开闭控制&#xff0c;当检测到有…

一文详解大模型强化学习(RLHF)算法:PPO、DPO、GRPO、ORPO、KTO、GSPO

一、 引言 大模型强化学习的核心目标是让模型的输出与人类目标、真实场景需求对齐。在工作和学习中&#xff0c;大模型强化学习训练经常会遇到各种算法&#xff0c;各种O&#xff0c;在强化学习训练选型过程中经常容易混淆&#xff0c;也分不清各种训练算法的使用场景和优缺点。…

C++ 常见面试题汇总

基础知识 一、C 基础语法C 和 C 的区别&#xff1f; C 支持面向对象&#xff08;封装、继承、多态&#xff09;。C 引入模板、STL、异常处理。值传递、指针传递、引用传递的区别&#xff1f; 值传递&#xff1a;拷贝一份副本。指针传递&#xff1a;传地址&#xff0c;可修改原数…

ES06-SpringData集成

ES06-SpringData集成 文章目录ES06-SpringData集成1-参考网址2-知识整理3-Spring Data Elasticsearch 9.0.0 完整示例4-知识补充1-Elasticsearch JAVA操作有三种客户端:1. TransportClient&#xff08;已废弃&#xff09;2. JestClient&#xff08;第三方 HTTP 客户端&#xff…

对于链表相关经典算法题:环形链表的约瑟夫问题的解析

开篇介绍&#xff1a; Hello 大家&#xff0c;在上一篇博客中&#xff0c;我们一同拆解了「206. 反转链表」和「876. 链表的中间结点」这两道单链表经典题目&#xff0c;通过对指针操作的细致打磨&#xff0c;相信大家对单链表的特性与算法设计思路有了更深入的理解。而在今天…

MySQL集群——主从复制

目录 一、环境搭建、部署 1. RHEL7.9、9.3的搭建 二、主从复制 1. 环境说明 2. 环境准备 1&#xff09;克隆RHEL79_mysql_master 2&#xff09;改名为 “RHEL79_mysql_slave” 并修改IP 3&#xff09;修改主机名 3. 部署MySQL主从同步 1&#xff09;主库(mysql-master) 2&…

《用 asyncio 构建异步任务队列:Python 并发编程的实战与思考》

《用 asyncio 构建异步任务队列:Python 并发编程的实战与思考》 一、引言:并发编程的新时代 在现代软件开发中,性能已不再是锦上添花,而是产品成功的基石。尤其在 I/O 密集型场景中,如网络爬虫、实时数据处理、微服务通信等,传统的同步编程模式往往力不从心。 Python …

【Linux】yum工具篇

目录一、软件包管理器1.1 什么是软件包1.2 Linux软件生态二、yum具体操作2.1 查找软件包2.2 安装软件包2.3 卸载软件配置文件所在路径个人主页<—请点击 Linux专栏<—请点击 一、软件包管理器 1.1 什么是软件包 在Linux下安装软件, 一个通常的办法是下载到程序的源代码…

撬动制造全场景增效,开利空调找到了怎样的“通关密码”?

由深圳软件协会指导、法大大和信息侠联合出品的《制造行业合同数智化升级白皮书》&#xff08;以下简称“白皮书”&#xff09;首次提出了 “电子签法律AI” 双轮驱动模型。在制造行业面临供应链协同、合规风控及全球化出海等多重挑战的当下&#xff0c;法大大依托丰富的制造企…

[Android]RecycleView的item用法

RecyclerView 是 Android 提供的一个强大的列表控件&#xff0c;用来显示大量数据。RecyclerView 的主要特点 1. 高性能的视图复用机制 Recycle就是循环的意思&#xff0c;那么recycleview的特点也很鲜明了&#xff0c;它只会创建出在屏幕内和一定缓存的itemview,当view滑出屏幕…

AI驱动的软件测试:革命性的自动化、缺陷检测与实验优化

引言在当今快节奏的软件开发生命周期&#xff08;SDLC&#xff09;中&#xff0c;传统测试方法已逐渐无法满足对速度、覆盖面和准确性的极高要求。人工智能&#xff08;AI&#xff09;和机器学习&#xff08;ML&#xff09;技术的融入&#xff0c;正在从根本上重塑软件测试的格…

继续优化基于树状数组的cuda前缀和

在之前的博客《借助树状数组的思想实现cuda版前缀和》中&#xff0c;我们用三个kernel实现了基于树状数组的cuda版前缀和&#xff0c;但是在数据量较大时速度不如传统的reduce-then-scan方法&#xff0c;主要原因在于跨block的reduce阶段没有充分利用所有的cuda核心。在本博客中…