老方法與新學科——CPU中加法是怎麼做的

關鍵詞 科普 計算機 大學生 數學 硬件設計

1. 引子

電腦玩家喜歡看CPU的主頻,主頻與計算速度到底是個啥關係呢?同一系列的CPU,主頻越大,速度越快是沒問題的。2G主頻就是每一秒運行2X109個基本週期的意思。對不同的CPU來說,執行一個基本動作是要花費至少一個基本週期的。C語言中數加1可以用i++實現,機器指令彙編的形式可以寫成:

Inc A

指的是內部寄存器A加1,如果Inc A是開機後第一條執行的機器指令,最少要花費兩個基本週期,第一個週期是把指令從外部存儲器取到CPU內部指令寄存器中,第二個週期是用算術邏輯運算器完成內部寄存器A上加1的運算。對現代CPU來說,取指令可以在CPU不向外部存儲器寫數據時,CPU存儲管理器自己先取指令進入到內部緩存(catch)中,通常意義下執行到Inc A時,這個指令已經在cpu內部了,就不用再取了。也就是說一條指令只大致需要1個基本週期。

早期的CPU並行度可沒那麼高哦,速度也不快,一個做乘法的指令

Mul A,Addr

也許要花費幾十個上百個基本週期的。即使是簡單的加法,我記得CPU說明書上也會寫要花費4-10個週期不等。早期為了讓加法在儘量少的週期內做完,也是花費不少腦筋來研究的。下面我將類比CPU做加法與人做加法,簡單說明計算機加法是如何做的,這些成果大致對應1955-1965年前後最優秀的計算機研究人員與設計師的工作,其實,用到的知識不超過現在高一學生的所學,優秀的小六學生至少可以領會50%。

2. 加法與加法器

人做加法的時候,規則是對位加,即個位與個位相加,十位與十位相加,百位與百位相加等等,且從低位開始到高位加。低年級小學生來覺得

老方法與新學科——CPU中加法是怎麼做的

簡單。原因就是後者有進位。有進位的時候,除去要把當前位置的數加起來,還要再加上右邊相鄰位加出來的進位。這就是加法的全部規則。也就是說,只要知道個位數的加法方法,再有一個進位規則我們就可以做任意位數的加法了。這當然我們需要一個十進制個位數的加法表。

老方法與新學科——CPU中加法是怎麼做的

計算機算術邏輯運算器,是執行各種算術操作,邏輯操作的基本部件,加法器是其中完成加法的子部件,加法器設計面臨的複雜性既與進制有關也與進位有關。

目前的計算機實際用電路上兩條導線間的電壓表示數,0近似為0v,1近似為2.5v,如果表示十進制數字就得十個不同的電壓代表0,1,2,3,…….,8,9。電路功耗也比只要表示0,1,要增加幾十到一百倍,如果初中同學知道電焦耳功率p=v^2/R是不難得出這個結論的。

計算機科學的先驅們,選擇2進製做為計算機中數的基本進制。為了使得人能更好地與計算機交互,輸入依然用10進制,內部將0,1,2,3,。。。。。,9用若干位二進制數編碼。二進制編碼的十進制數轉換為實際的2進制數,再進行運算,輸出結果還要轉換成十進制數。不僅數字用二進制編碼,所有的運算符號,甚至字母,漢字都是被二進制數編碼的,這個編解碼過程是用軟件完成的。下面是一個2進制個位數的算表。

+ 0 1

0 0 1

1 0 10

進位的問題,十進制要看10進制加法表中粗分割線右下的部分。對9來說,就要看相鄰低位是否有進位了,有進位都要加1,沒進位就不用加。

老方法與新學科——CPU中加法是怎麼做的

運用基本的代數辦法,將n位加n位的數如下圖形式。

老方法與新學科——CPU中加法是怎麼做的

圖1

如果學過數列,可以認為是四行數列,如果是小六學生,只需要想象0代表個位,1代表10位,等等也不難理解這個加法橫式。A是被加數,B是加數,R是和,C就代表進位了。如果當前數位i產生了進位,Ci=1,否則Ci=0;框起來的部分就是一個完整的1位加法結構,輸入變量有三個,分別是前面來的進位Ci-1,加數Ai,被加數Bi,輸出有兩個,第i位的和Ri以及第i位加產生的進位Ci。加法與加進位都按個位數算表來算,進位也可以根據個位數算表得到。為了規整,我們額外設了C0,只需簡單認為是個0就可以了。而和的最高位Rn+1=Cn。換一種形式來表達這個第i位的加法結構,也叫1位加法器。

老方法與新學科——CPU中加法是怎麼做的

圖2-1

老方法與新學科——CPU中加法是怎麼做的

圖2-2

將n個這樣相同1位加法器串聯起來,就是一個n位加法器。現在的問題就成了怎麼樣做出1位加法器的問題。

3.一位加法器的實現

老方法與新學科——CPU中加法是怎麼做的

圖3-1 圖3-2 圖3-3

我們得先對只有0,1這樣的數的算術做多點說明。第一是乘法, 二進制乘法比較好懂,算表如圖3-1.第二是模2加法,模寫成 mod,任意的自然數mod 5,就是被5除,其餘數只能取0,1,2,3,4。任意的自然數mod 2的話,結果就只能是0,1。在下面的說明中如果特別指出來,“+”號都是指mod 2加。這樣二進制個位數mod 2的加法表如圖3-2所示。第三是反碼,01010的反碼是10101,個位取反碼算符如圖3-3。用代數舉一個反碼的例子,

老方法與新學科——CPU中加法是怎麼做的

用加法器的八個不同的輸入值帶入上面的公式中,按規則計算結果,輸出是符合輸出表值的。這就是加法器依據的最基本算式了。

下面的講解就會粗一點,可能初中高中同學理解起來會有一點麻煩。我放棄嚴格性,儘可能說簡單。圖4-1是個叫MOS管的東西,可以在硅片製作出來。從電的性能上講,就像一個可控電阻,G,S兩端加上適合的電壓D,S兩端的電阻就會變得很小,很容易讓電流流過,如果G,S之間電壓接近0,D,S端電阻就會很大。

老方法與新學科——CPU中加法是怎麼做的

老方法與新學科——CPU中加法是怎麼做的

按圖4-2接好電路後,注意在D端子上串聯了一個電阻R,且加上了一個固定電壓VSS。如果G,S端輸入了一個接近於VSS的電壓,讓的D,S端電阻變小了(打開),電阻大大小於R的話,DS的輸出電壓就很小,接近於0。如果在G,S端的電壓接近於0,D,S之間的通路呈現的電阻會大大大於R,這樣DS端的電壓就接近於VSS。也就是說這個電路實現了式(1),通常叫非門電路。而圖5則用類似的辦法實現了一個相乘再取反的運算,也叫做與非運算。圖5,圖4-2,只考慮邏輯關係的話,也可以用圖6的邏輯符號表示。

老方法與新學科——CPU中加法是怎麼做的

利用 (1),(2),可以將(3)改寫成:

老方法與新學科——CPU中加法是怎麼做的

這可以用兩級與非門,外加幾個非門實現。同理也可以實現Ci+1。具體的電路我就不畫了。這裡只講講原理。我這裡的晶體管電路與實際的現代電路還是不一樣的,從數學與結構的角度沒錯就是了。

4.n位加法器快速進位鏈

至此,我們實現了任意長度的兩個二進制數的加法了。但是這個電路過於低效了,原因就在進位上。

老方法與新學科——CPU中加法是怎麼做的

圖7

考慮圖7的加法,進位的情況,除去C0=0,每個Ci都為1,共計會產生n次進位,這樣進位會傳播經過好多個與非門電路,就會產生延遲。辦法是用Ci的實際式子遞歸代替(4)中的右邊的Ci,代數式子會變得複雜,但可以不用等待前一級電路算完,就可以算高位,並行確實使得速度加快了,但電路也隨之複雜。這就是加法器設計要注意的問題了。光都會有傳播時間,電路中電流的流動也是需要時間的。如果集成電路工藝使得晶體管變小了,那麼傳播距離變短,傳播就快了。多個門串聯造成的電信號延遲也隨即減低,CPU基本週期就可以縮短。所以集成電路按28nm,14nm,10nm,7nm發生演化,這指的是集成電路中最窄圖樣的寬度。

希望高中程度較好的學生能抓住關鍵。其實這是大學計算機2年級課程的簡化版,我們就是要嘗試,將更多的新技術內容及早地傳播給孩子們,讓他們更早地進入創造階段。


分享到:


相關文章: