Jednostka arytmetyczno-logiczna

Z Wikipedii, wolnej encyklopedii
Skocz do: nawigacji, wyszukiwania
Typowy symbol ALU: A i B - operandy; R - wyjście; F - wejście z jednostki kontrolnej; D - status wyjścia

Jednostka arytmetyczno-logiczna (z ang. Arithmetic and Logical Unit lub Arithmetic Logic Unit, ALU) to jedna z głównych części procesora, prowadząca proste operacje na liczbach całkowitych.

ALU jest układem cyfrowym, służącym do wykonywania operacji arytmetycznych (takich jak dodawanie, odejmowanie itp.), operacji logicznych (np. Ex-Or) pomiędzy dwiema liczbami oraz operacje jednoargumentowe takie jak przesunięcie bitów, negacja. ALU jest podstawowym blokiem centralnej jednostki obliczeniowej komputera.

Typowe ALU ma dwa wejścia odpowiadające parze argumentów i jedno wyjście na wynik. Operacje jakie prowadzi to:

Przyczyną dla której operacje te grupuje się w ALU jest to, że bramek logicznych potrzebnych do zaimplementowania wszystkich operacji z zestawu: dodawanie (z przeniesieniem i bez), odejmowanie (z przeniesieniem i bez), negacja liczby, zwiększanie i zmniejszanie o 1, AND, OR, NOT, XOR jest niewiele więcej od zaimplementowania samego dodawania. Szybkie mnożenie wymaga znacznie więcej, a dzielenie jeszcze więcej bramek w porównaniu do tych operacji.

Klasyczne procesory zawierały jedno ALU. Procesory o architekturze superskalarnej zawierają kilka ALU i mogą ich używać jednocześnie. Często ALU te są nieidentyczne ─ np. z trzech ALU wszystkie potrafią wykonywać podstawowe operacje (dodawanie, odejmowanie i logiczne), a jedynie jedno potrafi mnożyć i dzielić. Taki procesor w jednym cyklu może wykonać np. 1 mnożenie i 2 dodawania, nie może natomiast wykonać 2 mnożeń. Jest to uzasadnione, ponieważ typowy program wykonuje o wiele więcej dodawań niż mnożeń, przy czym operacje dodawania są często niejawne dla programisty, bo są np. wykonywane przy wyliczaniu adresu pola obiektu na podstawie adresu obiektu czy zmiennej, której położenie jest określone względem rejestru adresowania.

Funkcje ALU[edytuj | edytuj kod]

Dotychczas najbardziej złożonymi obwodami elektronicznymi są obwody wbudowane wewnątrz układów współczesnych mikroprocesorów. Dlatego też takie procesory zawierają w sobie potężne i bardzo złożone ALU. W rzeczywistości nowoczesny mikroprocesor (bądź komputer główny) może posiadać wielokrotne rdzenie, każdy rdzeń z wielokrotnymi jednostkami wykonawczymi, każda jednostka wykonawcza z wielokrotnymi ALU.

Wiele innych układów może mieścić w sobie ALU: GPU (jednostka przetwarzania graficznego) jak ta w kartach graficznych nVidia czy ATI, FPU (jednostka obliczeń zmiennoprzecinkowych) w znanym koprocesorze 80387 oraz procesor przetwarzania sygnałów cyfrowych w karcie dźwiękowej Sound Blaster, odtwarzacze CD i odbiorniki telewizyjne HD. Wszystkie z nich posiadają kilka potężnych i złożonych jednostek arytmetyczno-logicznych.

Historia: Architektura von Neumanna[edytuj | edytuj kod]

Information icon.svg Osobny artykuł: Architektura von Neumanna.

Matematyk John von Neumann zaproponował model ALU w 1945 roku, kiedy to sporządził spis założeń dla nowego komputera EDVAC (z ang. Electronic Discrete Variable Automatic Computer, czyli elektroniczny komputer maszynowy o zmiennych nieciągłych). Później w 1946 r. pracował ze swoimi kolegami nad stworzeniem komputera dla Princeton Institute of Advanced Studies (IAS). Komputer IAS stał się prototypem dla wielu późniejszych komputerów. W swoim projekcie von Neumann nakreślił, co według niego będzie niezbędne w komputerze uwzględniając ALU.

Von Neumann oświadczył, iż ALU jest niezbędna dla komputera, ponieważ pewnym jest, że komputer będzie musiał wykonywać podstawowe operacje matematyczne obejmujące dodawanie, odejmowanie, mnożenie oraz dzielenie. Dlatego też twierdził, że „rozsądnym jest, aby komputer mieścił w sobie wyspecjalizowane organy dla tych operacji”.

Systemy numeryczne[edytuj | edytuj kod]

ALU musi wykonywać działania na liczbach używając tego samego formatu co reszta układu cyfrowego. Dla współczesnych procesorów liczby są prezentowane w kodzie binarnym jako liczby nieujemne, a liczby całkowite (ujemne) są przedstawiane w kodzie uzupełnień do dwóch. Wcześniejsze komputery używały szerokiej gamy systemów numerycznych, włącznie z dopełnieniem jedynki, BCD, formatem ze znaczeniem znaku, a nawet rzeczywistymi systemami dziesiętnymi, z dziesięcioma miejscami po przecinku.

Jednostki ALU dla każdego z tych systemów numerycznych były różnie projektowane i to przyczyniło się do wprowadzenia systemu dopełnienia do dwóch, jako że ten sposób ułatwia ALU wykonywanie operacji dodawania i odejmowania na liczbach ujemnych.

Przegląd praktyczny[edytuj | edytuj kod]

Prosta 2-bitowa jednostka arytmetyczno-logiczna, wykonująca operacje AND, OR, XOR oraz dodawania

Większość operacji komputera jest wykonywana przez ALU. Jednostka ALU pobiera dane z rejestrów procesora. Dane te są przetwarzane a wyniki operacji są przechowywane w rejestrach wyjściowych ALU. Inne układy przesyłają dane pomiędzy tymi rejestrami a pamięcią. Jednostka kontrolna zarządza jednostką ALU poprzez ustawianie układów, które informują ALU jaką operację należy wykonać.

Proste operacje[edytuj | edytuj kod]

Większość ALU potrafi dokonać następujących operacji:

  • operacje arytmetyczne na liczbach całkowitych (dodawanie, odejmowanie i czasami mnożenie oraz dzielenie, jednak te są bardziej kosztowne)
  • bitowe operacje logiczne (AND, NOT, OR, XOR)
  • operacje przesuwania bitowego (przesuwanie lub obracanie słowa o określoną liczbę bitów w lewo lub prawo, ze znakiem lub bez). Przesuwanie może być rozumiane jako mnożenie przez 2 oraz dzielenie przez 2.

Operacje złożone[edytuj | edytuj kod]

Inżynier potrafi zaprojektować ALU do wykonywania każdej operacji niezależnie jak jest skomplikowana, jednak problemem jest to, że im bardziej operacja jest skomplikowana, tym jednostka ALU jest droższa, zajmuje więcej miejsca w procesorze oraz zużywa więcej energii.

Dlatego też inżynierowie zawsze szukają kompromisu, aby wyposażyć procesor (lub inne układy) w jednostkę ALU, która będzie wystarczająco wydajna, aby zapewnić odpowiednio szybką pracę procesora, ale nie tak skomplikowana, by była nieprzystępna cenowo. Wyobraźmy sobie, że musimy obliczyć pierwiastek kwadratowy z danej liczby. Projektant rozpatrzy następujące sposoby zaimplementowania takiej operacji:

  1. Zaprojektowanie bardzo złożonej ALU, która oblicza pierwiastek kwadratowy dowolnej liczby w jednym kroku. Taki sposób nazywany jest obliczaniem w jednym cyklu.
  2. Zaprojektowanie złożonej ALU, która oblicza pierwiastek kwadratowy w kilku krokach. Ten sposób nazywany jest obliczaniem interaktywnym i zazwyczaj jest kontrolowany przez złożoną jednostkę kontrolną z wbudowanym mikrokodem.
  3. Zaprojektowanie prostej ALU w procesorze i osobna sprzedaż wyspecjalizowanego i kosztownego procesora, który użytkownik może zamontować obok już istniejącego oraz zaimplementować jedną z powyższych opcji. Taki układ nazywany jest koprocesorem.
  4. Emulację istnienia koprocesora, co polega na rozkazaniu procesorowi sprawdzenia czy istnieje koprocesor i użyciu go, za każdym razem kiedy program usiłuje obliczyć pierwiastek kwadratowy. Jeśli koprocesor nie istnieje, występuje przerwanie wykonywania programu i wywołanie systemu operacyjnego do przeprowadzenia obliczenia pierwiastka kwadratowego za pomocą algorytmu programowego. Taki sposób nazywany jest emulacją programową.
  5. Poinformowanie programistów o tym, że nie istnieje koprocesor ani nie ma emulacji, więc będą musieli napisać własny algorytm, żeby obliczyć pierwiastek kwadratowy programowo. Dokonuje się tego za pomocą bibliotek programowych.

Sposoby podane powyżej uporządkowane są od najszybszego i najbardziej kosztownego do najwolniejszego i najtańszego. Dlatego też, nawet najprostszy komputer potrafi wykonać najbardziej złożony algorytm, jednak będzie potrzebował do tego dużo czasu, ponieważ poszczególne kroki do wykonania obliczenia zawierać będą opcje 3, 4 i 5 opisane powyżej.

Procesory o dużej mocy obliczeniowej jak np. Pentium IV czy AMD64 wykorzystują opcję 1 dla większości złożonych operacji oraz opcję 2 dla bardzo złożonych operacji. Jest to możliwe dzięki możliwości budowania bardzo złożonych jednostek ALU w tych procesorach.

Wejścia i wyjścia[edytuj | edytuj kod]

Wejściami ALU są dane na których się operuje (operandy) oraz algorytm z jednostki sterującej, który wskazuje którą operację należy wykonać. Wyjściem jest wynik obliczenia. W wielu modelach, ALU generuje jako wejścia lub wyjścia zbiór kodów warunkowych z lub do rejestru statusowego. Kody te używane są do wskazywania takich procesów jak przeniesienie, przepełnienie, dzielenie przez 0 itp.

ALU vs. FPU[edytuj | edytuj kod]

Jednostka zmiennoprzecinkowa (z ang. Floating Point Unit) również wykonuje operacje arytmetyczne na dwóch wartościach, jednak są to liczby w reprezentacji zmiennoprzecinkowej, co jest znacznie bardziej skomplikowane niż wykonywanie operacji na liczbach w kodzie uzupełnienia do dwóch ZU2 używanej w typowej ALU. W celu wykonania takich kalkulacji, FPU posiada kilka wbudowanych, złożonych układów, takich jak wewnętrzne ALU. Zazwyczaj projektanci nazywają jednostkę ALU układem, który wykonuje operacje arytmetyczne w różnych formatach liczb całkowitych (np. ZU2 i BCD), podczas gdy układy dokonujące obliczeń na bardziej złożonych formatach np. zmiennoprzecinkowych, liczbach zespolonych itp. zwykle otrzymują bardziej szczegółowe nazwy.

Zobacz też[edytuj | edytuj kod]

Bibliografia[edytuj | edytuj kod]

Powyższe informacje zostały przetłumaczone na język polski z http://en.wikipedia.org/wiki/Arithmetic_logic_unit przez Leszka Olejnika