ALU — protsessor ichida arifmetik va mantiqiy amallarni bajaradigan qurilma. Uning to‘liq nomi Arithmetic Logic Unit hisoblanadi.
ALU registerlardan operandlarni oladi, addition, subtraction, bitwise operation va comparison kabi amallarni bajaradi, natijani register yoki boshqa ichki blokka uzatadi.
Zamonaviy protsessorda bitta emas, bir nechta ALU va boshqa maxsus execution unitlar bo‘lishi mumkin.
Arifmetik amallar
ALU quyidagi amallarni bajarishi mumkin:
- qo‘shish;
- ayirish;
- increment;
- decrement;
- taqqoslash;
- negation;
- ayrim arxitekturada ko‘paytirish va bo‘lish.
Ko‘paytirish va bo‘lish ko‘pincha alohida execution unitda bajariladi, chunki ular murakkabroq va ko‘proq cycle talab qiladi.
Mantiqiy amallar
ALU bitlar ustida:
- AND;
- OR;
- XOR;
- NOT;
- bit clear;
- bit set
amallarini bajaradi.
Misol:
1010 AND 1100 = 1000
1010 OR 1100 = 1110
1010 XOR 1100 = 0110
Bitwise operation mask, flag va low-level protocol parsingda ishlatiladi.
Shift va rotate
Bitlarni chapga yoki o‘ngga surish:
- logical shift;
- arithmetic shift;
- rotate.
Chapga shift ayrim holatda 2ga ko‘paytirishga o‘xshaydi.
Arithmetic right shift signed sonning sign bitini saqlaydi.
Rotate chiqib ketgan bitni qarama-qarshi tomonga qaytaradi.
Shift unit ALU tarkibida yoki alohida barrel shifter sifatida bo‘lishi mumkin.
Operand
Operand ALU amali qo‘llanadigan qiymat.
Manbalar:
- register;
- immediate constant;
- memorydan yuklangan qiymat;
- oldingi instruction natijasi;
- forwarding network.
Instruction ikki yoki undan ko‘p operandni ko‘rsatishi mumkin.
Natija
ALU natijasi:
- registerga yoziladi;
- memory address hisobida ishlatiladi;
- branch shartini belgilaydi;
- flags registerini yangilaydi;
- boshqa execution unitga uzatiladi.
Status flag
Arithmetic amal natijasida flaglar o‘zgarishi mumkin.
Zero flag
Natija 0 bo‘lsa yoqiladi.
Carry flag
Unsigned qo‘shishda yuqori bitdan carry chiqsa yoki ayrim ayirish holatida borrow bilan bog‘liq qiymat.
Sign flag
Natijaning eng yuqori biti.
Overflow flag
Signed arithmetic natija diapazondan chiqsa yoqiladi.
Parity flag
Ayrim arxitekturada pastki baytdagi bitlar paritysini bildiradi.
Carry va overflow farqi
Carry unsigned arithmetic uchun muhim.
Overflow signed arithmetic uchun.
Misol, 8-bit:
255 + 1 = 0
Unsigned hisobda carry yuz beradi.
Signed misol:
127 + 1 = -128
bit natija o‘raladi va overflow yuz beradi.
Comparison
Comparison ko‘pincha subtractionga o‘xshash amal bajaradi, lekin natijani saqlamaydi. Faqat flaglar yangilanadi.
Keyingi branch:
- equal;
- not equal;
- greater;
- less;
- carry;
- zero
shartlariga qarab bajariladi.
Address calculation
Load va store instructionlar uchun effective address hisoblash kerak.
Misol:
base + index * scale + offset
Zamonaviy CPUda bu vazifa uchun alohida Address Generation Unit bo‘lishi mumkin.
Integer ALU
Integer ALU butun sonlar va pointerlar ustida ishlaydi.
Floating-point sonlar uchun FPU yoki vector unit ishlatiladi.
Integer ALU ko‘p control va general-purpose kodning asosiy execution blokidir.
FPU bilan farqi
Floating-Point Unit IEEE 754 floating-point amallarni bajaradi.
ALU esa odatda integer va logical amallarni bajaradi.
Zamonaviy CPUda FPU vector execution pipeline bilan birlashtirilishi mumkin.
Pipeline
Instruction bajarilishi bir necha bosqichga bo‘linadi:
- fetch;
- decode;
- operand read;
- execute;
- memory;
- write-back.
ALU execute bosqichida ishlaydi.
Pipeline bir vaqtning o‘zida turli instructionlarning turli bosqichlarini bajaradi.
Latency va throughput
ALU instructionning latencysi natija tayyor bo‘lishigacha cycle soni.
Throughput — unit bir cycle’da nechta instruction qabul qila olishi.
Oddiy integer addition ko‘pincha past latencyga ega. Division ko‘proq cycle talab qiladi.
Superscalar processor
Zamonaviy CPU bir cycle’da bir nechta instruction chiqarishi mumkin.
Buning uchun:
mavjud.
Instructionlar dependency bo‘lmasa parallel bajariladi.
Data dependency
Misol:
R1 = R2 + R3
R4 = R1 + R5
Ikkinchi instruction birinchi natijani kutadi.
CPU forwarding orqali natijani register filega yozilishini kutmasdan keyingi ALUga berishi mumkin.
Out-of-order execution
CPU tayyor operandga ega instructionlarni dastur tartibidan tashqari bajarishi mumkin.
Natijalar architectural tartibda commit qilinadi.
Bu ALUlarning bo‘sh turishini kamaytiradi.
Branch prediction
Comparison natijasi branch yo‘lini belgilaydi.
Branch natijasi tayyor bo‘lguncha CPU taxminiy yo‘l bo‘yicha instructionlarni bajarishi mumkin.
Taxmin noto‘g‘ri bo‘lsa pipeline tozalanadi.
Bit width
ALU 8, 16, 32, 64 yoki boshqa width bilan ishlashi mumkin.
64-bit CPU ichida kichik width operationlar ham mavjud.
Ba’zi instruction yuqori bitlarni zero yoki sign extension bilan to‘ldiradi.
Saturating arithmetic
Oddiy integer arithmetic overflowda wrap qiladi.
Saturating arithmetic maksimal yoki minimal qiymatda to‘xtaydi.
Misol, 8-bit unsigned:
250 + 20 = 255
Multimedia va signal processingda foydali.
ALU dizayni
ALU ichida:
- adder;
- logic gate;
- shifter;
- multiplexer;
- carry propagation;
- control signal
mavjud.
Adder dizaynlari:
- ripple-carry;
- carry-lookahead;
- carry-select;
- prefix adder.
Tezlik, chip maydoni va energiya o‘rtasida muvozanat tanlanadi.
Energiya sarfi
Ko‘p ALU va yuqori frequency throughputni oshiradi, ammo quvvat va issiqlikni ko‘paytiradi.
CPU dynamic power taxminan switching activity, capacitance, voltage va frequencyga bog‘liq.
Mobile protsessor energiya samaradorligi uchun ayrim unitlarni o‘chirishi mumkin.
Diagnostika
ALU odatda application darajasida alohida diagnostika qilinmaydi.
Hardware xatolar:
- noto‘g‘ri hisob;
- machine check;
- stress test failure;
- overclock instability
ko‘rinishida chiqishi mumkin.
Compiler bug, undefined behavior va hardware xatosi bir-biridan test va boshqa tizim bilan solishtirish orqali ajratiladi.
Bog‘liq tushunchalar
CPU, Register, Arithmetic, Logic gate, Flags register, FPU, Pipeline, Superscalar, Out-of-order execution, Instruction