計算機實現乘法運算的方式---ChatGPT 5 thinking作答

計算機如何實現“乘法”

下面分層次把乘法在數據表示 → 整數硬件/軟件 → 大整數 → 浮點數 → 特殊場景里的主流實現方式講清楚,并給出取舍建議與簡單偽代碼。


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(n2),常用在小規模或分塊內核;可做緩存友好的 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核心。在本博客中…