LEVEL 3
CPU আর্কিটেকচার
CPU Architecture
এই মডিউল যে প্রশ্নের উত্তর দেয়`a = b + c` লিখলে সিলিকনের ভেতর ঠিক কী কী ঘটে?
CPU একটা instruction কীভাবে চালায়? ISA কী এবং কেন এটা hardware আর software-এর মধ্যকার contract? Pipeline, cache, branch prediction — এগুলো performance-এর জন্য যে সব চালাকি, সেগুলো কীভাবে কাজ করে এবং কখন ভেঙে পড়ে।
লেসন
- 01ISA — Hardware আর Software-এর মধ্যেকার চুক্তিISA হলো একটা নির্দিষ্ট, লিখিত vocabulary — instruction, register, আচরণ — যেটা মেনে চললে যেকোনো compiler-লেখা প্রোগ্রাম, আর যেকোনো সঠিকভাবে বানানো CPU, একে অপরকে বোঝে; ভেতরের circuit যা-ই হোক না কেন। আজ থেকে Level 2-এর গেট-লেভেল জগৎ ছেড়ে আমরা সেই চুক্তির স্তরে উঠছি।
- 02RISC বনাম CISC — Instruction Set ডিজাইনের দুই প্রতিদ্বন্দ্বী দর্শনCISC আর RISC দুইটা প্রতিদ্বন্দ্বী উত্তর একই প্রশ্নের — একটা instruction-এ কতটা কাজ গুঁজে দেওয়া উচিত? ইতিহাস (VAX থেকে Berkeley RISC), hardware trade-off (fixed বনাম variable length), আর সবচেয়ে চমকপ্রদ মোড় — আধুনিক 'CISC' x86-64 ভেতরে আসলে RISC-সদৃশ micro-op-এ চলে — মিলিয়ে দেখব এই বিভাজনটা আজও কেন প্রাসঙ্গিক, অথচ শুদ্ধ কৃষ্ণ-শুভ্র না।
- 03Register, Program Counter, আর Flags — CPU-র নিজের 'ভেরিয়েবল'Level 2-এর register file হার্ডওয়্যারটাই এখন ISA-স্তরে ফিরে আসছে — কতগুলো general-purpose register, প্রতিটা কত চওড়া, আর দুইটা বিশেষ-উদ্দেশ্য register (PC, SP) কীভাবে fetch-decode-execute আর function call সম্ভব করে। সাথে flags register — Level 2-র subtractor/comparator লেসনের ZF/CF/OF/SF সার্কিট এবার conditional branch-এর ভিত্তি হিসেবে কাজে লাগবে, আর RISC-V-র flags-বিহীন design দেখাবে এটাও একটা choice, বাধ্যতা না।
- 04Instruction Encoding — একটা instruction কীভাবে বিটে পরিণত হয়একটা instruction আসলে একটা নির্দিষ্ট প্যাটার্নে সাজানো বিট মাত্র — opcode কোন কাজ, funct3/funct7 কোন variant, rd/rs1/rs2 কোন register, immediate কোন constant, সব ফিক্সড বিট-পজিশনে। RV32I-তে এই প্যাটার্ন সবসময় ৩২ বিট, ছয়টা format-এর একটায় পড়ে; x86-64-তে এই প্যাটার্ন ১ থেকে ১৫ byte পর্যন্ত বদলাতে পারে — আর এই একটা পার্থক্যই pipelining-কে সহজ বা কঠিন করে দেয়।
- 05Addressing Modes — অপারেন্ড আসলে কোথায় থাকেএকটা instruction-এর operand field-এ যা লেখা থাকে তা প্রায়ই মান নিজেই না — বরং মান কোথায় খুঁজতে হবে তার একটা রেসিপি। Immediate সরাসরি মান দেয়, register direct একটা রেজিস্টারের মান দেয়, বাকি সব mode আসলে একটা effective address গণনা করে — register indirect, base+displacement, PC-relative, indexed — প্রতিটাই এক-একটা ভিন্ন গণনা। RISC ইচ্ছাকৃতভাবে এই তালিকা ছোট রাখে যাতে সেই গণনা সবসময় একটাই সরল ADD হয়, hardware-এ একটাই পথ লাগে।
- 06Fetch-Decode-Execute Cycle — a = b + c সিলিকনে ঠিক কী ঘটায়`a = b + c` লিখলে compiler চারটা RV32I instruction বানায় (দুইটা lw, একটা add, একটা sw)। প্রতিটা instruction CPU-তে একই পাঁচ ধাপ পার হয় — FETCH (PC থেকে instruction memory-তে পড়া, PC+4), DECODE (opcode থেকে control signal, register file read), EXECUTE (ALU-তে গণনা — ঠিকানা অথবা প্রকৃত যোগফল), MEMORY (load/store হলে data memory), WRITEBACK (register file-এ ফলাফল)। এই চক্র প্রতি clock cycle-এ পুনরাবৃত্ত হয় — এটাই Level ২-র toy CPU-র হুবহু সেই datapath+control, শুধু এবার একটা real ISA চালাচ্ছে।
- 07Memory Hierarchy — দ্রুত, বড়, সস্তা: তিনটার মধ্যে দুটো বাছুনএকটা একক memory প্রযুক্তি দ্রুত, বড়, সস্তা — তিনটাই দিতে পারে না। তাই CPU একটা সিঁড়ি বানায় — register থেকে HDD পর্যন্ত, প্রতি ধাপে ধীর কিন্তু বড়। এই সিঁড়িটা কাজ করে শুধু একটা কারণে: locality of reference — প্রোগ্রাম যা এইমাত্র access করেছে বা যা কাছাকাছি, সেটাই আবার লাগবে।
- 08Cache Organization — বিশাল ঠিকানাকে ছোট array-তে গুঁজে দেওয়াএকটা cache বিশাল address space-কে ছোট array-তে map করে address-কে tag+index+offset-এ ভেঙে — direct-mapped (এক ঠিকানা = এক line, সস্তা কিন্তু conflict-prone), fully-associative (যেকোনো line, conflict নেই কিন্তু ব্যয়বহুল parallel search), আর মাঝামাঝি, বাস্তবে সবচেয়ে ব্যবহৃত set-associative।
- 09Cache Policies — কাকে বিদায় করব, কখন লিখব, আর গড়ে কত সময় লাগেSet পূর্ণ হলে কে যাবে (LRU/FIFO/random — সত্যিকারের LRU ব্যয়বহুল, তাই pseudo-LRU tree), আর write কখন memory পর্যন্ত পৌঁছাবে (write-through সরল কিন্তু bandwidth-ভারী, write-back দ্রুত কিন্তু dirty bit ও consistency জটিলতা আনে) — এই দুই সিদ্ধান্তই AMAT = hit_time + miss_rate × miss_penalty সূত্রে মিলে সিস্টেমের গড় গতি নির্ধারণ করে।
- 10Pipelining ও Hazard — Assembly Line নীতি সিলিকনেSingle-cycle CPU-তে instruction একটার পর একটা সম্পূর্ণ শেষ হয়; pipelining-এ সেগুলো ওভারল্যাপ করে চলে — কিন্তু সেই ওভারল্যাপই structural, data, আর control hazard নামের তিনটা নতুন সমস্যা তৈরি করে।
- 11Forwarding ও Stalling — Data Hazard-এর দুইটা সমাধানএকই data hazard-এর দুইটা সমাধান — stalling (নিরাপদ, ধীর) আর forwarding (দ্রুত, কিন্তু load-use hazard-এ এক cycle stall এখনো অনিবার্য)।
- 12Branch Prediction — না জেনেই সঠিক অনুমান করাBranch-এর ফলাফল না জেনেই CPU-কে fetch চালিয়ে যেতে হয় — তাই এটা একটা শিক্ষিত অনুমান করে, আর ভুল হলে পুরো speculatively-করা কাজ ফেলে দেয়; একটা 2-bit saturating counter এই অনুমানকে আশ্চর্যজনকভাবে নির্ভুল করে তোলে।
- 13Superscalar ও Out-of-Order Execution — যখন ক্রম নিজেই আলোচনার বিষয়Superscalar একসাথে একাধিক instruction execute করার হার্ডওয়্যার ক্ষমতা দেয়; out-of-order execution সেই ক্ষমতা পুরোপুরি কাজে লাগায় — program-এর লেখা ক্রম না মেনে, যেই instruction প্রস্তুত সেটাই আগে চালিয়ে, তবু ফলাফল যেন মূল ক্রমেই ঘটেছে এমন দেখানো।
- 14Register Renaming ও Reorder Buffer — মিথ্যা নির্ভরতা ভাঙাWAR/WAW হলো নকল dependency — একই register-নাম পুনর্ব্যবহারের কাকতাল, সত্যিকারের data flow নয়। Register renaming সেটা ভাঙে, আর reorder buffer এলোমেলো execution-কে সাজানো commit-এ ফেরায়।
- 15SIMD — একটা Instruction, বহু Dataএকটা instruction একসাথে বহু data element-এ কাজ করে — parallelism-এর সম্পূর্ণ ভিন্ন একটা অক্ষ, যা multimedia থেকে আজকের machine learning পর্যন্ত সবখানে লুকিয়ে আছে।
- 16Interrupt, Exception, Trap — যখন CPU স্বাভাবিক ক্রম ভাঙেতিনটা ভিন্ন কারণে CPU হঠাৎ তার স্বাভাবিক sequential পথ ছেড়ে দেয় — বাইরের ঘটনা (interrupt), নিজের ভুল (exception), আর ইচ্ছাকৃত অনুরোধ (trap) — কিন্তু ভেতরের mechanism-টা তিনটাতেই এক।
- 17DMA আর I/O — CPU-কে কপি করা থেকে মুক্তিএকটা device থেকে memory-তে ডেটা আনতে CPU-কে প্রতিটা byte নিজে কপি করতে হলে তার পুরো সময় সেখানেই যেত। DMA একটা dedicated controller-কে সেই কাজ দিয়ে CPU-কে মুক্ত করে — আর কাজ শেষে জানায় ঠিক আগের লেসনের সেই interrupt দিয়ে।
যা যা থাকছে
- ISA — hardware/software contract
- RISC vs CISC, x86-64 vs ARM64 vs RISC-V
- Register file, PC, stack pointer, flags
- Instruction encoding ও decoding
- Fetch-decode-execute cycle বিস্তারিত
- Addressing modes
- Memory hierarchy introduction
- Cache — direct mapped, set associative, fully associative
- Cache lines, tags, replacement policy, write policy
- Pipelining ও hazards (structural, data, control)
- Forwarding ও stalling
- Branch prediction
- Superscalar ও out-of-order execution
- Register renaming, reorder buffer
- SIMD — SSE, AVX, NEON
- Interrupts, exceptions, traps
- DMA ও I/O
প্রজেক্ট
CPU Emulator
●●●●○RISC-V RV32I emulator — fetch/decode/execute loop নিজে লেখা।
Cache Simulator
●●●○○Memory trace খেয়ে hit/miss rate বের করা, associativity নিয়ে experiment।
Pipeline Visualizer
●●●●○Hazard ও stall সহ 5-stage pipeline animate করা।