Architetture dei processori/Arithmetic Logic Unit
L'Arithmetic Logic Unit (ALU) è un'unità dedita allo svolgimento di operazioni matematiche ed è formata da un insieme di porte logiche opportunamente collegate. Queste porte logiche nel loro complesso provvedono ad eseguire tutte le operazioni aritmetiche e logiche gestite dal microprocessore.
Le prime ALU erano in grado di eseguire nativamente solo le operazioni più semplici (addizione, sottrazione e shifting di bit ecc.) e le operazioni logiche booleane (AND, OR, XOR e NOT). Le operazioni più complesse come le operazioni di moltiplicazioni o divisione venivano emulate utilizzando ripetutamente somme o sottrazioni. Con l'evolvere dell'elettronica si è riuscito a integrare nelle ALU anche le operazioni di divisione e moltiplicazione. Le ALU non sono in grado di svolgere tutte le operazioni supportate dai microprocessori moderni, infatti le operazioni in virgola mobile o le operazioni multimediali (tipo AltiVec o MMX) sono svolte da unità specializzate che non risiedono nell'ALU. Le ALU utilizzate dai primi processori erano unità composte da sottounità base. Queste sottounità venivano utilizzate congiuntamente per svolgere le operazioni aritmetiche ma essendo ogni unità in grado di svolgere una parte delle operazioni aritmetica servivano più cicli di clock per completare un'operazione. La richiesta di prestazioni migliori portò alla realizzazioni di ALU più efficienti (che richiedevano un maggior numero di transistor) e alla loro inclusione in strutture come le pipeline.
Per esempio nei primi processori per realizzare le divisioni veniva utilizzata l'unità di sottrazione per emulare la divisione. Questa soluzione pur essendo molto semplice ed economica da implementare era molto lenta. Nei primi processori le somme e le moltiplicazioni venivano realizzate con semplice reti logiche formate da porte AND o OR. Queste reti erano veloci da realizzare ma fornivano i risultati lentamente dato che i riporti dovevano propagarsi e nelle implementazioni più semplici i riporti per propagarsi in modo completo lungo tutta la rete impiegavano un tempo pari al numero di bit da processare. Le implementazioni successive invece utilizzano reti logiche più complesse che effettuano una serie di precalcoli sui dati e sui riporti in modo da parallelizzare le operazioni ed rendere le ALU più veloci. Ovviamente questi circuiti sono più complessi e quindi più costosi da realizzare.