題:
為什麼硬件除法比乘法要花更長的時間?
Marko Gulin
2017-01-17 00:45:42 UTC
view on stackexchange narkive permalink

為什麼在微控制器上硬件除法比乘法要花更長的時間?例如,在dsPIC上,除法需要19個週期,而乘法僅需要一個時鐘週期。

我瀏覽了一些教程,包括Wikipedia上的 除法算法 乘法算法 。這是我的理由。

除法算法(類似於Wikipedia上的具有恢復功能的慢除法)是一種遞歸算法。這意味著將步驟 k 的(中間)結果用作步驟 k + 1 的輸入,這意味著這些算法無法並行化。因此,至少需要 n 個週期才能完成除法,而 n 是除數中的許多位。對於16位分紅,至少等於16個週期。

乘法算法不需要遞歸,這意味著可以並行化它。但是,有許多不同的乘法算法,我不知道微控制器可以使用哪種算法。乘法如何在硬件/微控制器上工作?

我找到了 Dadda乘法器算法,該算法只需要一個時鐘週期即可完成。但是,我沒有得到的是Dadda的算法分三步進行,而步驟1的結果用於步驟2,依此類推。因此,這至少需要三個時鐘週期才能完成。

算法並沒有真正定義時鐘週期數。您的特定CPU可能有一個硬件乘法器/除法器以一個週期或20個週期工作,而與內部實現無關。
OP,您能否提供一個鏈接,以提供您所談論的19對1週期的更多信息?有關您的DSP的一些特定說明。
感謝您的回答。這是我的微控制器的數據表:http://ww1.microchip.com/downloads/en/DeviceDoc/70005127c.pdf。請參閱指令集概述,從第292頁開始。它說所有DIV指令都需要18個週期,而所有MUL指令只需要1個週期。但是,不僅對於這種MCU來說並不常見,我已經在許多其他MCU中看到了這一點。
如果**您**進行紙和鉛筆的乘法和除法,那需要更長的時間?為什麼?
@Curd,很好,它們差不多,不是嗎。是給我的。我認為這沒有您想像的那麼好。
我在我心目中的紙筆除法算法@TonyM固有地在每一步中應用了一系列除數-乘以×1位數的乘法,並取模運算和減法,因此使用* that *方法在我腦海中進行除法運算時,我認為除乘法運算外需要更多的努力。您的觀點仍然是正確的,因為沒有盡力嘗試除數適合剩餘數的次數,而是一種很好的啟發式方法
另一個因素是經濟和使用方式。大多數用法調用乘除的次數遠多於除法。將大面積的矽專用於較不頻繁使用的更快的硬件除法功能,在經濟上很差。最好製造出更小,更便宜的芯片,或者以更有效率的方式使用額外的邏輯。順便說一句,當我開始使用小型計算機時,劃分並不總是一條指令。在某些計算機上,這是一個軟件庫調用,例如平方根。
-1
順便說一句,是否有機器在硬件上進行了十分之一的優化?
@nigel222 puuuh;我可以想像某些袖珍計算器MCU可能具有BCD轉換單元/指令,而這在軟件中實現起來很簡單(只是忽略最低位數)。
@MarkoGulin可能還會補充說,當頻繁執行除法運算時,您實際上可能需要浮點數,這些天在許多CPU上都可用,而除法運算又是另一種問題(它確實包含至少一個定點除法,但輸入範圍有限)
從歷史上看,甚至大型機都實現了BCD字符串指令。在財務編程中,二進製到十進制轉換的成本被認為太高了。如今,在通用計算機的CPU中幾乎所有要註冊的寄存器都是“免費的”,並且正在訪問RAM,這會減慢速度。從那時到現在,為整數到小數的轉換優化除以十?我只是想知道-從來沒有聽說過。
值得注意的是浮點數除法。Cray-1沒有一個,只有一個倒數逼近指令,然後又使用一個乘法和另外兩個指令來完成全精度除法。英特爾浮點單元還具有倒數逼近指令。我不知道用了什麼。同樣,x = y / const乘以const的倒數進行乘法運算。fdiv僅在除以變量時才需要。
[為什麼除法比乘法更昂貴?](http://stackoverflow.com/q/15745819/995714),[為什麼除法比其他算術運算複雜得多?](http://scicomp.stackexchange.com/ q / 187/22956)
@TonyM:我懷疑兩者都花在同一時間。當然,您必須查看不止1個2位數字的計算。只需嘗試:將兩個隨機的6位數字相乘即可得到12個結果,然後將一個隨機的12位數字除以一個隨機的6位數字即可得到一個6位的結果,並查看需要多長時間。
六 答案:
Marcus Müller
2017-01-17 02:27:19 UTC
view on stackexchange narkive permalink

分頻器不太優雅地映射到典型硬件。以萊迪思ICE40 FPGA為例。

讓我們比較一下兩種情況:這個8x8位與16位乘數:

 模塊乘法(clk,a,b,結果);
   輸入clk;
   輸入[7:0] a;
   輸入[7:0] b;
   輸出[15:0]結果;
   總是@(posedge clk)
     結果= a * b;
endmodule //乘法
 

這個除法器將8位和8位操作數減少為8位結果:

 模塊除法(clk,a,b,result);
   輸入clk;
   輸入[7:0] a;
   輸入[7:0] b;
   輸出[7:0]結果;
   總是@(posedge clk)
     結果= a / b;
結束模塊//除
 

(是的,我知道,時鐘什麼都沒有

multiplier映射到ICE40 FPGA時生成的原理圖的概述可以在此處divider 此處中找到。

Yosys的綜合統計數據是:

相乘

  • 線數:155
  • 線位數:214
  • 公共線路數量:4
  • 公共電匯位數:33
  • 內存數量:0
  • 內存位數:0
  • 進程數:0
  • 單元數:191
    • SB_CARRY 10
    • SB_DFF 16
    • SB_LUT4 165

  • 線數:145
  • 線位數:320
  • 公共線路數量:4
  • 公共電匯位數:25
  • 內存數量:0
  • 內存位數:0
  • 進程數:0
  • 單元數:219
    • SB_CARRY 85
    • SB_DFF 8
    • SB_LUT4 126

值得注意的是,為全角乘法器和最大除法器生成的Verilog的大小不是那麼極端。但是,如果您看下面的圖片,您會注意到乘法器的深度可能為15,而除法器的深度更像是50左右。關鍵路徑(即在操作過程中可能出現的最長路徑)決定了速度!


無論如何,您將無法閱讀該內容,以獲得視覺印象。我認為可能會發現複雜性上的差異。這些是單週期乘法器/除法器!

相乘

在ICE40上相乘(警告:〜100 Mpixel圖像)

Scaled image of the multiplier

劃分

在ICE40上劃分)(警告:〜100 Mpixel圖像)

Scaled image of the divider

親愛的馬庫斯,非常感謝您的回答!現在,我將嘗試簡化您的回答,如果我錯了,請糾正我:除法和乘法運算都需要多次迭代,而這些迭代可以在“單個時鐘週期”中完成。但是,單週期除法運算所需的專用門數比單週期乘法運算所需的門數高得多。這是硬件複雜度和速度之間的折衷。我說對了嗎?
不,您可以非迭代地實現它們。但是,要使有效結果通過邏輯“波動”,將只需要花費一些時間。上面的實現是非迭代的。
您可以分享這些圖片的圖形規格嗎?我想通過我自己的渲染算法來運行它們。
我想要分隔線的牆貼。
-1
@QED我想指出的是Yosys適用於上面的verilog:我所做的只是`yosys`,`read_verilogmultiply.v`,`synth_ice40`,`show -format svg -prefix multiple_ice40`。但是待命,我將使用`show -viewer / bin / true -prefixplicate_ice40`重複該操作,以獲取.dot文件:)
@QED可以看到我上面的兩個Github gist鏈接[1](https://gist.github.com/marcusmueller/edcf41d7a96b32405c0c0a08ff5f1a4a)和[divide](https://gist.github.com/marcusmueller/3182ccae22a3e714c351c7768a11075
[multiply](https://gist.github.com/marcusmueller/edcf41d7a96b32405c0c0a08ff5f1a4a)要點中現在有一個PDF。它的尺寸為3378×3177毫米,因此,在將其放在臥室天花板上之前,請與您的另一半進行討論。
@MarcusMüller您可以從所有答案中查看我的簡短摘要。
您的100兆像素圖像令人印象深刻,但是對於您要提出的觀點來說卻有些過分,對於試圖在內存有限的設備(例如手機或平板電腦)上查看此頁面的任何人,它們都會造成巨大的問題。如果要內嵌顯示圖像,請找到一種產生較低分辨率預覽的方法。
喲,那些graphviz圖表脫穎而出,喲!
@SpencerWilliams喲,這就是我的自由和開源FPGA綜合流程,伙計![Yosys](http://www.clifford.at/yosys/)為我做了所有這些;還有更多!
Peter Green
2017-01-17 03:55:47 UTC
view on stackexchange narkive permalink

每個時鐘週期我們可以有多個邏輯層,但是有一個限制,取決於我們的時鐘速度和我們的半導體工藝,究竟可以有多少個邏輯層以及這些邏輯層有多複雜。

但是,有很多不同的乘法算法,我不知道微控制器可以使用哪種算法

大多數計算機中的乘法都使用二進制長乘法的變體。二進制長乘法涉及

  • 將一個操作數移動各種不同的量
  • 根據第二個操作數計算移位數字
  • 將掩蔽的結果加在一起。

因此,讓我們看一下如何在硬件中實現它。

  • 轉移只是我們如何連接事物的問題,因此它是免費的。
  • 屏蔽需要AND門。這意味著一層邏輯,因此從時間的角度來看很便宜。
  • 由於需要進位鏈,因此添加相對昂貴。幸運的是,我們可以使用一個技巧。對於大多數加法階段,我們可以將三個數字相加產生兩個,而不是將兩個數字相加產生一個。

因此,讓我們估算一個16位結果的8x8乘法器需要多少邏輯級。為簡單起見,假設我們不嘗試針對並非所有中間結果在所有位置上都有位的事實進行優化。

讓我們假設一個完整的加法器是在兩個“門級”中實現的。

  • 1個遮罩可產生8個中間結果。
  • 2添加三個數字的組,以將8個中間結果減少到6
  • 2添加三個數字的組,以將6個中間結果減少到4
  • 2將三個數字相加,以將4個中間結果減少為3
  • 2將三個數字相加,以將3個中間結果減少為2
  • 32將最後兩個結果相加。

因此,總共約有41個邏輯階段。其中大部分是用於將最後兩個中間結果相加。

通過在最後一步中使用進位超前加法器,可以利用並非所有中間結果都存在所有位的事實(這基本上是dada乘法器的作用)來進一步改善這一點。通過將7個數字相加產生3個而不是3個產生2個(以更多的門和更寬的門為代價減少階段數)等。

雖然這只是所有次要細節,但重要的是,將兩個n位數字相乘並產生2n位結果所需的級數與n大致成比例。


另一方面,如果我們查看除法算法,則會發現它們都在哪裡有一個迭代過程。

  1. 一次迭代完成的工作很大程度上取決於前一次迭代的結果。
  2. 實施迭代所需的邏輯階段數大致與n成正比(減法和比較的複雜度與加法非常相似)
  3. 迭代次數也大致與n成正比。
  4. ol>

    因此實現除法所需的邏輯級數大致與n平方成正比。

謝謝您的回答。我在Wiki上讀到,在硬件上實現此算法所需的門數方面,Dadda的算法非常有效。儘管如此,大多數硬件還是使用“二進制長乘法”?
看起來dada的算法是二進制長乘法的優化版本。
我燒了8個循環以做1 / x除法。然後,我將其用於8週期乘法,固定成本為16週期。
這很好地證明了乘法畢竟並不比加法差很多。
迭代需要減法,這可以使用O(NlgN)硬件在O(lgN)階段完成,或使用O(N)硬件在O(sqrt(N))階段完成。但要點是,乘法需要O(lgN)個階段,而除法則需要O(NlgN)個階段。不是O(N \ * N),而是大於乘以O(N)的倍數,除非人們以近似倒數開始,以便允許每個步驟完成更多的工作。
為什麼將最後兩個結果相加需要32個階段?提前進位加法器在這裡沒有幫助嗎?
Spehro Pefhany
2017-01-17 01:00:41 UTC
view on stackexchange narkive permalink

慢除法本質上是迭代的,因此往往需要更長的時間。使用查找表,慢速分割算法比簡單算法更快。SRT算法每個週期產生兩位。此類表中的錯誤是臭名昭著的 Pentium FDIV錯誤(大約1994年)的原因。然後是所謂的快速劃分算法。

當然,原則上,您可以簡單地使用一個巨大的查找表來計算兩個數字的乘積或商,從而在一個週期內獲得結果,但是隨著每個數字位數的增加,這往往會很快變得不切實際。增加。

但最重要的是-除法算法不能像乘法算法那樣並行化,這就是為什麼它們這麼慢的原因?
@MarkoGulin“不能”是一個非常有力的主張。當然不是那麼簡單。
我認為您可以將其從“除法算法無法並行化”削弱到“我們發現對除法進行並行化的方式比對並行化乘法更不利於實現除法的硬件。”Sphero給出了一個示例,該示例如何使用O(2 ^ n)門進行n位數相乘來進行單週期除法...但這並不實際。
長除法可以通過計算近似倒數來利用並行性到任何期望的程度,將其乘以除數可得出形式為1000 ... xxxx的結果。當使用具有N個Leadig零的這種除數時,這很容易每步計算N位結果。
user4574
2017-01-17 01:17:02 UTC
view on stackexchange narkive permalink

可以在一個時鐘週期內完成除法算法(實際上是任何算法)。如果您願意為額外的晶體管付費並降低允許的時鐘速率。

假設您有一組門,這些門實現了現有多周期除法算法的一個時鐘週期。要使算法為單週期,請使用多級硬件(類似於多周期算法的一個階段中使用的硬件),其中一個階段的輸出將饋送到下一個階段。

當然不這樣做的原因是它使用了很多晶體管。例如,對於16位劃分,它可能會使用多出近16倍的晶體管。同時具有更多級的門會降低最大允許時鐘頻率(因為存在更多級的傳播延遲)。

TEMLIB
2017-01-17 03:30:25 UTC
view on stackexchange narkive permalink

實用除法算法全部基於收斂到商的數值套件。

  • 有加法,例如不可恢復或SRT,其方法是在商中添加或刪除2 ^ N並相應地在部分餘數上添加或刪除2 ^ N *除數,直到其收斂到零為止。

  • 有乘法方法,例如Newton-Raphson或Goldshmidth,它們是求根方法,其中除法是通過求逆來計算的。

加法在每個循環中提供一位或幾位。乘法方法將每個週期的位數加倍,但需要一些初始近似值,通常是通過常數表獲得的。

“慢速”和“快速”兩種面額具有誤導性,因為實際速度取決於位數,功能專用的硬件數量(並且快速乘法器非常大)...

除法比乘法要慢,因為沒有直接的並行方法來計算它:要么進行迭代,要么複製硬件以級聯(或流水線)的塊形式實現迭代。

Nick Gammon
2017-01-18 12:37:43 UTC
view on stackexchange narkive permalink

為什麼在微控制器上硬件的劃分要比乘法的時間長得多?

這不是電子問題。充其量是一個計算機問題,可以更好地解決堆棧溢出問題。

例如參見:乘法比浮點除法快嗎?

實際上,這是一個現實生活中的問題:為什麼除法要比乘法花費那麼長的時間?

您希望在紙上算什麼?

  51 * 82
 

  4182/51
 

除法比乘法花時間更長,因為它很難做到。



該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 3.0許可。
Loading...