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