軟體乘法和硬體乘法哪個效率高?為什麼?

最近在學習編程,發現一個問題,大家都說軟體乘法會慢與硬體乘法,不知道大家可否了解,能不能具體說一下為什麼。


若果硬體不支持乘法指令,那軟體實現時必須要從現有的硬體指令中採取合適的方法,如加法指令等。

8051的乘法需要8個周期,還是8*8;cortex m3的乘法只要一個周期。採用疊加計算乘法需要進行若干次加法,一次一個周期,還不包括定址。當然如果將乘數分解,綜合移位和加法會更快。

至於長乘法,可以參照《hacker"s delight》


理想情況下處理器通過乘法器執行乘法指令(應該是題主說的硬體乘法)是單時鐘周期(可以理解為處理器的心跳,處理器每時鐘周期進行一次操作)的,而軟體乘法會轉化為非乘法指令由處理器串列執行,最低效的比如逐位求出部分和再依次相加最少需要(以8bit的乘法為例):8(求出每一位部分和) 7(對部分和求和)=15個時鐘周期;常用的將乘法轉變為移位和加法,比如 a * 17 變為 a左移4位(a*(2^4)) 加 a ,也要2個周期(移位 加法)。所以說硬體乘法會比軟體乘法快。


即使cpu支持乘法指令,考慮到軟體運行乘法之前大部分還需要花一個周期從存儲器讀數據,做完乘法還要花一個周期把數據存回存儲器。這樣算下來怎麼也需要三個周期。

如果是比較簡單的架構,在調取或者存儲數據的時候很多時間其實是被浪費的。

而硬體實現沒有這些浪費的時間,因此怎麼看硬體實現的時間都小於等於軟體實現的時間。


推薦閱讀:

對於學生黨什麼編程語言比較適合?
如何評價"Null reference - my billion-dollar mistake"?
位運算有什麼奇技淫巧?
非同步可重入函數與線程安全函數等價嗎?
大括弧不換行的壞處有什麼?為什麼有人不換行?

TAG:硬體 | C編程語言 | 計算機科學 | 數值分析 |