算術(shù)邏輯單元(arithmetic and logic unit) 是能實現(xiàn)多組算術(shù)運算和邏輯運算的組合邏輯電路,簡稱ALU。
算術(shù)邏輯單元(arithmetic logic unit,縮寫ALU)是進行整數(shù)運算的結(jié)構(gòu)?,F(xiàn)階段是用電路來實現(xiàn),應(yīng)用在電腦芯片中。在計算機中,算術(shù)邏輯單元(ALU)是專門執(zhí)行算術(shù)和邏輯運算的數(shù)字電路。ALU是計算機中央處理器的最重要組成部分,甚至連最小的微處理器也包含ALU作計數(shù)功能。在現(xiàn)代CPU和GPU處理器中已含有功能強大和復(fù)雜的ALU;一個單一的元件也可能含有ALU。1945年數(shù)學家馮諾伊曼在一篇介紹被稱為EDVAC的一種新型電腦的基礎(chǔ)構(gòu)成的報告中提出ALU的概念。
早期發(fā)展1946年,馮諾伊曼與同事合作為普林斯頓高等學習學院(IAS)設(shè)計計算機。隨后IAS計算機成為后來計算機的原形。在論文中,馮諾伊曼提到他所相信的計算機中所需的部件,而其中包括ALU。 馮諾伊曼寫到,ALU是計算機的必備組成部分,因為已確定計算機一定要完成基本的數(shù)學運算,包括加減乘除。于是他相信「(計算機)應(yīng)該含有專門完成此類運算的部件?!?
數(shù)字系統(tǒng)ALU必須與數(shù)字電路的其他部分使用同樣的格式來進行數(shù)字處理。對現(xiàn)代處理器而言,數(shù)值一律使用二進制補碼表示。早期的計算機曾使用過很多種數(shù)字系統(tǒng),包括反碼、符號數(shù)值碼,甚至是十進制碼,每一位用十個管子。 以上這每一種數(shù)字系統(tǒng)所對應(yīng)的ALU都有不同的設(shè)計,而這也影響了當前對二進制補碼的優(yōu)先選擇,因為二進制補碼能簡化ALU加法和減法的運算。 一個簡單的能進行與或非和加運算的2位ALU。
可行性分析絕大部分計算機指令都是由ALU執(zhí)行的。ALU從寄存器中取出數(shù)據(jù)。數(shù)據(jù)經(jīng)過處理將運算結(jié)果存入ALU輸出寄存器中。其他部件負責在寄存器與內(nèi)存間傳送數(shù)據(jù)。 控制單元控制著ALU,通過控制電路來告訴ALU該執(zhí)行什么操作。 [1]
簡單運算大部分ALU都可以完成以下運算∶整數(shù)算術(shù)運算(加、減,有時還包括乘和除,不過成本較高)位邏輯運算(與、或、非、異或)移位運算(將一個字向左或向右移位或浮動特定位,而無符號延伸),移位可被認為是乘以2或除以2。
復(fù)雜運算工程師可設(shè)計能完成任何運算的ALU,不論運算有多復(fù)雜;問題在于運算越復(fù)雜,ALU成本越高,在處理器中占用的空間越大,消耗的電能越多。 于是,工程師們經(jīng)常計算一個折中的方案,提供給處理器(或其他電路)一個能使其運算高速的ALU,但同時又避免ALU設(shè)計的太復(fù)雜而價格昂貴。設(shè)想你需要計算一個數(shù)的平方根,數(shù)字工程師將評估以下的選項來完成此操作∶設(shè)計一個極度復(fù)雜的ALU,它能夠一步完成對任意數(shù)字的平方根運算。這被稱為單時鐘脈沖計算。設(shè)計一個非常復(fù)雜的ALU,它能夠分幾步完成一個數(shù)字的平方根運算。不過,這里有個訣竅,中間結(jié)果經(jīng)過一連串電路,就像是工廠里的生產(chǎn)線。這甚至使得ALU能夠在完成前一次運算前就接受新的數(shù)字。這使得ALU能夠以與單時鐘脈沖同樣的速度產(chǎn)生數(shù)字,雖然從ALU輸出的結(jié)果有一個初始延遲。這被稱為計算流水線。設(shè)計一個復(fù)雜的ALU,它能夠計算分幾步計算一個數(shù)字的平方根。這被稱為互動計算,經(jīng)常依賴于帶有嵌入式微碼的復(fù)雜控制單元。在處理器中設(shè)計一個簡單的ALU,去掉一個昂貴的專門用于此運算的處理器,再選擇以上三個選項之一。這被稱為協(xié)處理器。告訴編程人員沒有協(xié)處理器和仿真設(shè)備,于是他們必須自己寫出算法來用軟件計算平方根。這是由軟件庫完成的。對協(xié)處理器進行仿真,也就是說,只要一個程序想要進行平方根的計算,就讓處理器檢查當前有沒有協(xié)處理器。如果有的話就使用其進行計算,如果沒有的話,中斷程序進程并調(diào)用操作系統(tǒng)通過軟件算法來完成平方根的計算。這被稱為軟件仿真。以上給出的選項按最快和最貴到最慢和最經(jīng)濟排列。于是,雖然甚至是最簡單的計算機也能計算最復(fù)雜的公式,但是最簡單的計算機經(jīng)常需要耗費大量時間,通過若干步才能完成。 強大的處理器,比如英特爾酷睿和AMD64系列對一些簡單的運算采用1號選項,對最常見的復(fù)雜運算采用2號選項,對極為復(fù)雜的運算采用3號選項。這是具有在處理器中構(gòu)造非常復(fù)雜的ALU的能力為前提的。
輸入和輸出ALU的輸入是要進行操作的數(shù)據(jù)(稱為操作數(shù))以及來自控制單元的指令代碼,用來指示進行哪種運算。它的輸出即為運算結(jié)果。 在許多設(shè)計中ALU也接收或發(fā)出輸入或輸出條件代碼到(或來自)狀態(tài)寄存器。這些代碼用來指示一些情況,比如進位或借位、溢出、除數(shù)為零等。
ALU與FPU浮點單元也對兩個數(shù)值進行算術(shù)運算,但是這種運算已浮點數(shù)表示,比在ALU中一般使用的補碼表示方式復(fù)雜的多。為了完成此類運算,F(xiàn)PU里嵌入了多個復(fù)雜電路,包括一些內(nèi)部ALU。 工程師一般認為ALU是處理整數(shù)型(比如補碼和BCD碼)算術(shù)運算的的電路,而對更為復(fù)雜的格式(比如浮點型、復(fù)數(shù)型)進行計算的電路則擁有一個更加匹配的稱謂。