এই পর্বে যা শিখবেন
- von Neumann নকশা আর CPU-র ভেতরের অংশ — ALU, কন্ট্রোল ইউনিট আর প্রতিটি রেজিস্টারের দায়িত্ব
- অ্যাড্রেস, ডেটা ও কন্ট্রোল বাস, আর ৩২-bit বনাম ৬৪-bit-এর আসল মানে
- একটি খেলনা CPU-তে machine code চালিয়ে fetch-decode-execute চক্র ধাপে ধাপে দেখা
- ক্লক, GHz, IPC, pipeline, branch prediction — CPU কীভাবে একই চক্রকে দ্রুত করে
- মাল্টিকোর, thread, Hyper-Threading, CISC বনাম RISC, GPU, NPU আর মাইক্রোকন্ট্রোলার; আর CPU-র স্পেক পড়া
১ · CPU-র আসল কাজ — আনা, বোঝা, করা, আবার আনা
পর্ব ০৩-এ আপনি CPU-কে “কম্পিউটারের মস্তিষ্ক” হিসেবে চিনেছেন, আর তার তিন অংশের নাম জেনেছেন। কিন্তু মস্তিষ্ক শব্দটি একটু বিভ্রান্তিকর। CPU আমাদের মতো চিন্তা করে না। সে শুধু অল্প কয়েক রকমের সরল কাজ জানে — যোগ, তুলনা, এক জায়গা থেকে আরেক জায়গায় সংখ্যা সরানো, আর “অমুক ঠিকানার নির্দেশে লাফ দাও”।
তাহলে ভিডিও চালানো বা bKash-এ টাকা পাঠানোর মতো বড় কাজ কীভাবে হয়? উত্তর একটি চক্রে। CPU মেমরি থেকে একটি নির্দেশ আনে, সেটি কী বলছে বোঝে, কাজটি করে, ফল রাখে — তারপর পরের নির্দেশ আনতে যায়। একে বলে fetch-decode-execute চক্র (instruction cycle বা machine cycle). আজকের ল্যাপটপের CPU এই চক্র সেকেন্ডে শতকোটি বার ঘোরায়।
CPU-র মূল কাজ মাত্র চারটি: fetch → decode → execute → store, বারবার। এই পর্বের বাকি সবকিছু — pipeline, cache, branch prediction, মাল্টিকোর, Hyper-Threading — একটিই প্রশ্নের উত্তর: এই সরল চক্রটিকে আরও দ্রুত কীভাবে ঘোরানো যায়?
উপমা: একজন রাঁধুনি একটি রেসিপি-খাতা থেকে রান্না করছেন। তিনি একটি লাইন পড়েন (“২ কাপ চাল নাও”), বোঝেন কী করতে হবে, কাজটি করেন, তারপর আঙুল সরিয়ে পরের লাইনে যান। CPU-তে সেই আঙুলের নাম Program Counter. আর রেসিপিতে যদি লেখা থাকে “ভাত ফুটে না উঠলে ৫ নম্বর লাইনে ফিরে যাও” — সেটিই লাফ (jump), যা দিয়ে লুপ তৈরি হয়।
von Neumann নকশা — প্রোগ্রাম আর ডেটা একই মেমরিতে
প্রায় সব আধুনিক কম্পিউটার যে নকশায় তৈরি, তার নাম von Neumann architecture — পর্ব ০২-এ ইতিহাস হিসেবে নামটি দেখেছেন। এই নকশায় চারটি অংশ: CPU, মেমরি, ইনপুট-আউটপুট (I/O), আর এদের জোড়ার তার, অর্থাৎ বাস. সবচেয়ে গুরুত্বপূর্ণ ভাবনাটি হলো stored-program: প্রোগ্রামের নির্দেশও আসলে সংখ্যা, তাই সেগুলো ডেটার সাথে একই মেমরিতে রাখা যায়। নতুন প্রোগ্রাম চালাতে শুধু মেমরিতে অন্য সংখ্যা লিখলেই হয়।
von Neumann কম্পিউটারের মানচিত্র
CPU, memory holding both program and data, I/O, and three buses
এই নকশার একটি দুর্বলতাও আছে। নির্দেশ আর ডেটা দুটোকেই একই সরু রাস্তা (বাস) দিয়ে আসতে হয়, আর মেমরি CPU-র তুলনায় অনেক ধীর। ফলে CPU-কে প্রায়ই অপেক্ষা করতে হয়। একে বলে von Neumann bottleneck — ব্যস্ত সেতুর মুখের জটের মতো — গাড়ি যত দ্রুতই হোক। এর বড় সমাধান cache — পর্ব ২৫-এ আসছে।
২ · CPU-র ভেতরের দল — ALU, কন্ট্রোল ইউনিট আর রেজিস্টার
এবার তিনটি অংশ ঠিক কী করে, একটু গভীরে দেখা যাক।
- ALU (Arithmetic Logic Unit): হিসাবের যন্ত্র। পর্ব ২১-এর full adder দিয়ে বানানো যোগের সার্কিট, তুলনার সার্কিট (comparator), আর AND, OR, XOR-এর গেট — সব এখানে। ALU নিজে কিছু মনে রাখে না; দুটি ইনপুট পায়, কন্ট্রোল ইউনিট বলে দেয় কোন কাজ, আর সে ফল দেয়।
- কন্ট্রোল ইউনিট (CU): পরিচালক। নির্দেশের কোড পড়ে (পর্ব ২১-এর decoder দিয়ে) বোঝে কোন কাজ, তারপর ঠিক সময়ে ঠিক তারে সংকেত পাঠায় — “মেমরি, এখন পড়ো”, “ALU, যোগ করো”, “ফলটি ACC-তে রাখো”। নিজে কোনো হিসাব করে না, কিন্তু সবাইকে তালে তালে চালায়।
- রেজিস্টার: CPU-র ভেতরের হাতে-গোনা কয়েকটি অতি দ্রুত ঘর। পর্ব ২২-এ দেখেছেন, রেজিস্টার আসলে কয়েকটি flip-flop পাশাপাশি — প্রতিটি ক্লক-টিকে নতুন মান নিতে পারে। রেজিস্টার পড়তে সময় লাগে মাত্র একটি ক্লক চক্র বা তারও কম, যেখানে RAM থেকে আনতে লাগতে পারে কয়েকশো চক্র।
বিশেষ দায়িত্বের রেজিস্টারগুলো
পরীক্ষায় সবচেয়ে বেশি প্রশ্ন আসে এই রেজিস্টারগুলো নিয়ে:
| রেজিস্টার | কী রাখে | রাঁধুনির উপমায় |
|---|---|---|
| PC — Program Counter | পরের নির্দেশের মেমরি-ঠিকানা; প্রতিটি fetch-এর পর নিজে থেকে এক বাড়ে, আর jump হলে নতুন ঠিকানা পায় | রেসিপির যে লাইনে আঙুল আছে |
| IR — Instruction Register | এই মুহূর্তে যে নির্দেশটি চলছে, তার পুরো কোড | এখন যে লাইনটি পড়ছেন |
| MAR — Memory Address Register | মেমরির যে ঘরে পড়তে বা লিখতে যাচ্ছি, তার ঠিকানা; অ্যাড্রেস বাসে এটিই যায় | ভাঁড়ারের কোন তাকে হাত বাড়াচ্ছেন |
| MDR — Memory Data Register | মেমরি থেকে সদ্য আসা বা মেমরিতে লিখতে যাওয়া তথ্য; ডেটা বাসের মুখ | তাক থেকে নামানো কৌটা, হাতে ধরা |
| ACC — Accumulator | হিসাবের চলতি ফল; ALU-র একটি ইনপুট সাধারণত এখান থেকে আসে, ফলও এখানেই ফেরে | হাঁড়ি, যেখানে সব জমছে |
| সাধারণ রেজিস্টার (R0–R15, RAX, RBX…) | প্রোগ্রাম যা খুশি রাখতে পারে — চলতি সংখ্যা, ঠিকানা, গণনা | রান্নাঘরের কয়েকটি বাটি |
| Flag রেজিস্টার | শেষ হিসাবের খবর — Zero (ফল শূন্য?), Carry, Overflow, Sign | “হাঁড়ি খালি” লেখা ছোট্ট চিরকুট |
Flag-গুলোর কথা পর্ব ১৭-এ বাইনারি যোগ-বিয়োগের সময় দেখেছেন: carry বা overflow হলো কি না, ফল শূন্য কি না। এখানে তাদের আসল কাজটি স্পষ্ট হয়। CPU “যদি… তাহলে…” সিদ্ধান্ত নেয় ঠিক এভাবে: প্রথমে একটি তুলনা বা বিয়োগ করে flag সেট করে, তারপর একটি শর্তযুক্ত লাফ-নির্দেশ (যেমন “Zero flag 1 হলে লাফ দাও”) flag দেখে ঠিক করে PC-তে নতুন ঠিকানা বসবে কি না। প্রতিটি if আর লুপ শেষে এই দুই ধাপে ভাঙে।
৩ · বাস — ঠিকানা, তথ্য আর সংকেতের রাস্তা; ৩২-bit বনাম ৬৪-bit
পর্ব ০৩-এ বাসকে শহরের রাস্তার সাথে তুলনা করেছিলাম। এবার প্রশ্ন: রাস্তা কত চওড়া? বাসের প্রতিটি তার একসাথে একটি bit বহন করে। তাই বাসে যতটি তার, একবারে তত bit যায় — একে বলে বাসের প্রস্থ (width).
- অ্যাড্রেস বাস: CPU থেকে মেমরির দিকে, একমুখী। n টি তার থাকলে আলাদা ঠিকানা হয় 2n টি। তাই অ্যাড্রেস বাসের প্রস্থই ঠিক করে CPU সর্বোচ্চ কত মেমরি চিনতে পারবে।
- ডেটা বাস: দুই দিকে চলে। এর প্রস্থ ঠিক করে একবারে কত bit তথ্য আসা-যাওয়া করবে — ৮-bit বাসে একবারে ১ byte, ৬৪-bit বাসে একবারে ৮ byte.
- কন্ট্রোল বাস: আলাদা আলাদা সংকেতের তার — “পড়ো” (read), “লেখো” (write), ক্লক, “কাজ শেষ”, interrupt ইত্যাদি।
| অ্যাড্রেস বাস | আলাদা ঠিকানা | সর্বোচ্চ মেমরি (প্রতি ঘরে ১ byte) | কোথায় দেখা গেছে |
|---|---|---|---|
| ১৬ bit | 216 = 65,536 | ৬৪ KB | ১৯৭০–৮০-র দশকের ৮-bit হোম কম্পিউটার |
| ২০ bit | 220 | ১ MB | Intel 8086 (১৯৭৮) — প্রথম IBM PC-র পরিবার |
| ৩২ bit | 232 ≈ ৪৩০ কোটি | ৪ GB | ৩২-bit Windows আর পুরোনো ফোন |
| ৬৪ bit (তাত্ত্বিক) | 264 | প্রায় ১ কোটি ৮০ লাখ TB | আজকের প্রায় সব কম্পিউটার আর ফোন |
এ কারণেই একসময় ৩২-bit Windows-এ ৮ GB RAM লাগালেও প্রায় ৩–৪ GB-ই ব্যবহার হতো — ঠিকানার নম্বর ফুরিয়ে যেত। ৬৪-bit CPU-তে এই সীমা কার্যত উঠে গেছে। বাস্তবে আজকের চিপ পুরো ৬৪টি ঠিকানা-bit ব্যবহারও করে না, সাধারণত ৪৮ বা ৫৭ bit — তাতেই কয়েকশো TB থেকে আরও অনেক বেশি পর্যন্ত চেনা যায়, যা যেকোনো ল্যাপটপের প্রয়োজনের বহু গুণ।
সাধারণ ভুল ধারণা: “৬৪-bit CPU ৩২-bit-এর চেয়ে দ্বিগুণ দ্রুত।” না। “৬৪-bit” মানে CPU-র সাধারণ রেজিস্টার আর ঠিকানা ৬৪ bit চওড়া — বড় সংখ্যা একবারে ধরা যায়, আর ৪ GB-র বেশি মেমরি সহজে ব্যবহার করা যায়। কিছু কাজ এতে দ্রুত হয়, কিন্তু সাধারণ কাজে গতি দ্বিগুণ হয় না। CPU একবারে স্বাভাবিকভাবে যত bit নিয়ে কাজ করে, তাকে বলে তার word size.
৪ · নির্দেশ-চক্র ধাপে ধাপে — একটি খেলনা CPU-তে প্রোগ্রাম চালানো
আসল CPU-র নির্দেশ-ভাষা (instruction set বা ISA) হাজারখানেক নির্দেশের, শেখার জন্য বড্ড জটিল। তাই শিক্ষকেরা বহু বছর ধরে খেলনা CPU ব্যবহার করেন — সবচেয়ে বিখ্যাত “Little Man Computer”, যা ১৯৬০-এর দশকে MIT-তে Stuart Madnick শেখানোর জন্য তৈরি করেন। আমরাও একটি খেলনা CPU বানাব: মেমরিতে মাত্র ১৬টি ঘর (ঠিকানা 0 থেকে 15), একটি accumulator, আর ৮টি নির্দেশ।
প্রতিটি নির্দেশ ৮ bit, অর্থাৎ ১ byte. ওপরের ৪ bit হলো opcode — কোন কাজ; নিচের ৪ bit হলো operand — কোন ঘরের সংখ্যা নিয়ে কাজ। ৪ bit দিয়ে 0 থেকে 15 পর্যন্ত ঠিকানা লেখা যায় — ঠিক ১৬টি ঘর।
| নির্দেশ (mnemonic) | opcode (বাইনারি) | hex | কী করে |
|---|---|---|---|
HALT | 0000 | 0 | থামে |
LOAD a | 0001 | 1 | ACC ← ঘর a-র সংখ্যা |
ADD a | 0010 | 2 | ACC ← ACC + ঘর a |
SUB a | 0011 | 3 | ACC ← ACC − ঘর a |
STORE a | 0100 | 4 | ঘর a ← ACC |
JUMP a | 0101 | 5 | PC ← a (সবসময় লাফ) |
JZ a | 0110 | 6 | ACC = 0 হলে PC ← a (শর্তযুক্ত লাফ) |
OUT | 0111 | 7 | ACC-র মান আউটপুটে দেখায় |
এখন একটি ছোট প্রোগ্রাম: “5 আর 3 যোগ করে ফলটি ঘর 6-এ রাখা”। Assembly-তে চার লাইন, আর প্রতিটি লাইনের machine code বানানো হয় opcode আর ঠিকানা পাশাপাশি বসিয়ে:
| ঘর | Assembly | machine code (বাইনারি) | hex |
|---|---|---|---|
| 0 | LOAD 4 | 0001 0100 | 14 |
| 1 | ADD 5 | 0010 0101 | 25 |
| 2 | STORE 6 | 0100 0110 | 46 |
| 3 | HALT | 0000 0000 | 00 |
| 4 | (ডেটা) | 0000 0101 | 05 |
| 5 | (ডেটা) | 0000 0011 | 03 |
| 6 | (ফলের জায়গা) | 0000 0000 | 00 |
লক্ষ করুন, ঘর 0–3-এ নির্দেশ আর ঘর 4–6-এ ডেটা — একই মেমরিতে, একই চেহারায়, শুধু 0 আর 1. মেমরি নিজে জানে না কোনটি নির্দেশ আর কোনটি সংখ্যা; PC যে ঘরে নিয়ে যায়, CPU সেটিকেই নির্দেশ হিসেবে পড়ে। এবার প্রোগ্রামটি চালান — প্রতিটি ধাপে রেজিস্টারগুলোর মান খেয়াল করুন:
014 LOAD 4125 ADD 5246 STORE 6300 HALT405 (ডেটা: 5)503 (ডেটা: 3)6-- (ফলের ঘর)
| পর্যায় | |
| PC | |
| MAR | |
| MDR | |
| IR | |
| ACC | |
| ঘর 6 |
- শুরু। প্রোগ্রাম মেমরিতে বসানো, PC = 0 — অর্থাৎ প্রথম নির্দেশ আছে ঘর 0-তে। ACC খালি (0). এখনো কোনো নির্দেশ আনা হয়নি, তাই IR, MAR, MDR ফাঁকা।
- FETCH — প্রথম নির্দেশ আনা। PC-র মান যায় MAR-এ (0). কন্ট্রোল বাসে “পড়ো” সংকেত, মেমরি ঘর 0-র byte 14 ডেটা বাস দিয়ে পাঠায় MDR-এ, সেখান থেকে IR-এ। সাথে সাথে PC এক বেড়ে 1 — CPU আগেভাগেই পরের নির্দেশের দিকে আঙুল সরিয়ে রাখে।
- DECODE আর EXECUTE — LOAD 4. কন্ট্রোল ইউনিট IR ভাঙে: ওপরের ৪ bit 0001 = LOAD, নিচের ৪ bit 0100 = ঘর 4. তারপর MAR-এ 4 বসিয়ে মেমরি থেকে পড়ে, MDR-এ আসে 05, আর সেটি যায় ACC-তে। ACC = 5. একটি নির্দেশে মেমরিতে দুবার যাওয়া — নির্দেশ আনতে, ডেটা আনতে।
- FETCH — দ্বিতীয় নির্দেশ। একই নিয়ম: MAR ← PC (1), মেমরি থেকে 25 এসে IR-এ, PC হলো 2. Fetch ধাপ প্রতিটি নির্দেশে হুবহু এক।
- EXECUTE — ADD 5. Decode: 0010 = ADD, ঠিকানা 5. ঘর 5 থেকে 03 আসে MDR-এ। এবার কন্ট্রোল ইউনিট ALU-কে বলে “যোগ করো”: এক ইনপুট ACC (5), অন্যটি MDR (3). ALU-র ফল 8 ফেরে ACC-তে।
- FETCH — তৃতীয় নির্দেশ। MAR ← 2, IR ← 46 (STORE 6), PC হলো 3. এখনো ফল শুধু CPU-র ভেতরে, ACC-তে — মেমরিতে লেখা হয়নি।
- EXECUTE — STORE 6 (write back). এবার উল্টো দিকে: MAR-এ ঠিকানা 6, MDR-এ ACC-র মান 8, আর কন্ট্রোল বাসে “লেখো” সংকেত। মেমরির ঘর 6 এখন 08. ফল রাখার এই ধাপকে বলে store বা write back.
- FETCH + DECODE — HALT. ঘর 3 থেকে 00 এল, PC হলো 4. Decode করে দেখা গেল opcode 0000 = থামা। CPU থামল; ঘর 6-এ উত্তর 8. মোট ৪টি নির্দেশ, প্রতিটিতে একই চক্র — fetch, decode, execute, (store).
লুপ বানানো — লাফ আর শর্ত দিয়ে
লুপের জন্য দরকার দুটি নির্দেশ: JUMP (PC-তে নতুন ঠিকানা বসিয়ে পেছনে ফিরে যাওয়া) আর JZ (শর্ত সত্য হলে তবেই লাফ)। নিচের প্রোগ্রামটি ১ থেকে ৫ পর্যন্ত যোগ করে (৫ + ৪ + ৩ + ২ + ১), আর প্রতিটি নির্দেশের পর PC, IR আর ACC ছাপে:
const NAMES = ['HALT', 'LOAD', 'ADD', 'SUB', 'STORE', 'JUMP', 'JZ', 'OUT'];
const mem = [0x1C, 0x2B, 0x4C, 0x1B, 0x3D, 0x4B, 0x68, 0x50, // 0-7: লুপ
0x1C, 0x70, 0x00, 5, 0, 1, 0, 0]; // 11 = N, 12 = SUM, 13 = ONE
let pc = 0, acc = 0, ir = 0, count = 0, running = true;
const hex = (v) => v.toString(16).toUpperCase().padStart(2, '0');
while (running) {
ir = mem[pc]; // FETCH: PC যে ঘর দেখায়, সেখান থেকে IR-এ
const at = pc;
pc = pc + 1; // PC এগিয়ে গেল পরের ঘরে
const op = ir >> 4, addr = ir & 15; // DECODE: উপরের ৪ bit = কাজ, নিচের ৪ bit = ঠিকানা
if (op === 0) running = false; // EXECUTE: opcode অনুযায়ী একটি কাজ
if (op === 1) acc = mem[addr];
if (op === 2) acc = acc + mem[addr];
if (op === 3) acc = acc - mem[addr];
if (op === 4) mem[addr] = acc;
if (op === 5) pc = addr;
if (op === 6 && acc === 0) pc = addr;
count++;
console.log(`PC=${hex(at)} IR=${hex(ir)} ${NAMES[op].padEnd(5)} ${String(addr).padStart(2)} | ACC=${acc}`);
if (op === 7) console.log(` >>> OUTPUT: ${acc}`);
}
console.log(`HALT after ${count} instructions. SUM (cell 12) = ${mem[12]}`);মেমরির ঘর 0–7 হলো লুপ: LOAD 12 (SUM আনা), ADD 11 (N যোগ), STORE 12, LOAD 11, SUB 13 (N থেকে 1 বাদ), STORE 11, JZ 8 (N শূন্য হলে লুপ থেকে বেরোনো), JUMP 0 (নইলে আবার শুরু)। ঘর 11, 12, 13-এ ডেটা: N = 5, SUM = 0, ONE = 1. আউটপুট শুরু হয় PC=00 IR=1C LOAD 12 | ACC=0, PC=01 IR=2B ADD 11 | ACC=5 দিয়ে; প্রতি পাকে ACC-তে SUM বাড়ে: 5, 9, 12, 14, 15. শেষ পাকে PC=06 IR=68 JZ 8 | ACC=0 — এবার শর্ত সত্য, তাই পরের লাইন PC=08, ঘর 7-এর JUMP বাদ পড়ল। তারপর >>> OUTPUT: 15 আর শেষ লাইন HALT after 42 instructions. SUM (cell 12) = 15. মাত্র ৫টি সংখ্যা যোগ করতে ৪২টি নির্দেশ — তাই সেকেন্ডে শতকোটি নির্দেশের ক্ষমতা দরকার। কোডে ir >> 4 ওপরের ৪ bit আর ir & 15 নিচের ৪ bit আলাদা করে — এটুকুই decoder-এর কাজ।
৫ · ক্লক, GHz আর IPC — গতি আসলে কোথা থেকে আসে
খেলনা CPU-র প্রতিটি ধাপ কখন হবে, সেটি ঠিক করে দেয় ক্লক সিগন্যাল — পর্ব ২২-এ দেখা সেই নিয়মিত টিক-টিক, যার প্রতিটি ধারে সব রেজিস্টার একসাথে নতুন মান নেয়। দুই টিকের মাঝের সময়কে বলে একটি clock cycle. এই সময়ের মধ্যে সংকেতকে গেটের পর গেট পেরিয়ে (পর্ব ২০-এর propagation delay) পরের রেজিস্টারে পৌঁছাতে হয়।
ক্লক স্পিড মাপা হয় হার্টজে (Hz) — প্রতি সেকেন্ডে কতটি চক্র। ১ MHz = ১০ লাখ, ১ GHz = ১০০ কোটি চক্র প্রতি সেকেন্ডে। ৩ GHz CPU-তে প্রতিটি চক্র প্রায় ০.৩৩ ন্যানোসেকেন্ড। কিন্তু চক্র আর নির্দেশ এক জিনিস নয় — একটি নির্দেশ কয়েক চক্র নিতে পারে, আবার আধুনিক CPU এক চক্রে কয়েকটি নির্দেশও শেষ করতে পারে। গড়ে প্রতি চক্রে কতটি নির্দেশ শেষ হয়, তাকে বলে IPC (Instructions Per Cycle).
সূত্রটি মোটামুটি, নিখুঁত নয়; তবু এটি দেখায়: শুধু GHz দেখে দুটি CPU তুলনা করা যায় না। একটি CPU ৪ GHz-এ গড়ে ২টি নির্দেশ/চক্র চালালে সেকেন্ডে ৮০০ কোটি; আরেকটি ৩ GHz-এ ৪টি চালালে ১,২০০ কোটি — কম GHz, তবু দেড় গুণ দ্রুত। প্রতি প্রজন্মে নির্মাতারা মূলত IPC বাড়ান।
তাহলে GHz বাড়ালেই তো হয় — কেন বাড়ানো হয় না?
২০০৫-এর দিকে GHz-এর দৌড় থেমে যায় (পর্ব ২২-এর ভাবনার প্রশ্নে যার গল্প শুরু; ভাবনার প্রশ্ন ৩-এ আরও)। কারণ মূলত তাপ। চিপের বিদ্যুৎ-খরচ মোটামুটি ক্লক-গতি আর ভোল্টেজের বর্গের গুণফলের সাথে বাড়ে, আর বেশি গতিতে চালাতে ভোল্টেজও বাড়াতে হয়। ফলে গতি একটু বাড়ালে তাপ বাড়ে অনেক বেশি। আগে ট্রানজিস্টর ছোট করলে বিদ্যুৎ-খরচও কমত (Dennard scaling), কিন্তু ২০০৫-এর আশপাশে সেই সুবিধা ফুরিয়ে যায়।
আজকের CPU-তে তাই দুটি ক্লক লেখা থাকে: base clock — যে গতিতে দীর্ঘ সময় নিরাপদে চলতে পারে, আর boost clock — ঠান্ডা থাকলে আর অল্প কোর ব্যস্ত থাকলে কিছুক্ষণের জন্য যে সর্বোচ্চ গতিতে ওঠে। গরম হয়ে গেলে CPU নিজেই গতি কমায় (thermal throttling, পর্ব ০৮)। কাজ না থাকলে ক্লক নামিয়ে বিদ্যুৎ বাঁচায়।
৬ · Pipeline আর branch prediction — একসাথে অনেক নির্দেশ
GHz বাড়ানো বন্ধ হলে IPC বাড়াতে হবে। প্রথম কৌশলটি পরিচিত এক দৃশ্য থেকে বোঝা যায়। ধরুন একটি লন্ড্রিতে চার বস্তা কাপড়: প্রতিটি বস্তাকে ধোয়া, শুকানো, ইস্তিরি আর ভাঁজ — চার ধাপ, প্রতিটি ৩০ মিনিট। এক বস্তা পুরো শেষ করে তবেই পরেরটি ধরলে লাগে ৮ ঘণ্টা। কিন্তু প্রথম বস্তা ওয়াশিং মেশিন থেকে ড্রায়ারে গেলেই দ্বিতীয় বস্তা মেশিনে ঢুকতে পারে! এভাবে সব যন্ত্র একসাথে ব্যস্ত রাখলে চার বস্তা শেষ হয় ৩ ঘণ্টা ৩০ মিনিটে। একে বলে pipelining — garments কারখানার production line-এর মতো।
CPU-তেও নির্দেশ চক্রের ধাপগুলো আলাদা আলাদা সার্কিটে হয়। আমাদের উদাহরণে চার ধাপ: F (fetch), D (decode), E (execute), W (write back). নিচে চারটি নির্দেশ I1–I4 আগে pipeline ছাড়া, তারপর pipeline দিয়ে চালান:
| নির্দেশ \ চক্র | ১ | ২ | ৩ | ৪ | ৫ | ৬ | ৭ | ৮ |
|---|---|---|---|---|---|---|---|---|
| I1 | ||||||||
| I2 | ||||||||
| I3 | ||||||||
| I4 |
F = fetch · D = decode · E = execute · W = write back · ধূসর বিন্দু = সেই চক্রে কাজ নেই
| পদ্ধতি | |
| ব্যস্ত ধাপ | |
| শেষ হওয়া নির্দেশ | |
| মোট চক্র (৪ নির্দেশ) |
- Pipeline ছাড়া। I1 চার ধাপ শেষ করে তবেই I2 শুরু হয়। এক সময়ে একটি ধাপই ব্যস্ত, বাকি তিনটির সার্কিট বসে আছে। চারটি নির্দেশে লাগবে ৪ × ৪ = ১৬ চক্র — চার্টে প্রথম ৮টি দেখা যাচ্ছে।
- Pipeline — চক্র ১. এবার নতুন নিয়ম: প্রতিটি ধাপ শেষ হলেই নির্দেশটি পরের ধাপে সরে যায়, আর খালি হওয়া ধাপে পরের নির্দেশ ঢোকে। শুরুতে শুধু I1 fetch হচ্ছে।
- চক্র ২. I1 চলে গেল decode-এ, আর fetch-এর সার্কিট খালি হতেই I2 আনা শুরু। দুটি নির্দেশ একসাথে, আলাদা ধাপে।
- চক্র ৪ — pipeline পূর্ণ। চারটি ধাপই এখন ব্যস্ত: I1 লিখছে (W), I2 চালাচ্ছে (E), I3 বুঝছে (D), I4 আসছে (F). এই মুহূর্ত থেকে প্রতিটি চক্রে একটি করে নির্দেশ শেষ হবে।
- চক্র ৭ — সব শেষ। I1 শেষ চক্র ৪-এ, I2 চক্র ৫-এ, I3 চক্র ৬-এ, I4 চক্র ৭-এ। মোট ৭ চক্র, আগের ১৬-র জায়গায়। সাধারণ সূত্র: ধাপ + নির্দেশ − ১ = ৪ + ৪ − ১ = ৭.
- বড় ছবিতে। ১০০টি নির্দেশ হলে pipeline ছাড়া ৪০০ চক্র, pipeline দিয়ে ৪ + ১০০ − ১ = ১০৩ চক্র — প্রায় ৪ গুণ দ্রুত। তবে বাস্তবে বাধাও আছে — নিচে দেখুন।
খেয়াল করুন, pipeline একটি নির্দেশকে দ্রুত করে না — প্রতিটি নির্দেশ এখনো ৪ চক্র নেয়। কিন্তু প্রতি চক্রে একটি করে নির্দেশ শেষ হয়, তাই মোট কাজ প্রায় ৪ গুণ দ্রুত। আসল CPU-র pipeline-এ ধাপ আরও বেশি — শিক্ষার ক্লাসিক নকশায় ৫টি, আর আধুনিক চিপে সাধারণত ১০–২০টি; Pentium 4-এর কোনো কোনো সংস্করণে ৩০-এর বেশি ছিল।
বাধা — hazard, আর লাফ দিলে কী হয়
Pipeline সবসময় মসৃণ চলে না। এমন বাধাকে বলে hazard. যেমন, I2 যদি I1-এর ফলের ওপর নির্ভর করে, আর সেই ফল এখনো লেখা না হয়ে থাকে — তাহলে I2-কে এক-দুই চক্র অপেক্ষা করতে হয় (data hazard). সবচেয়ে বড় ঝামেলা লাফ-নির্দেশে: JZ চালিয়ে না দেখা পর্যন্ত CPU জানে না পরের নির্দেশ কোনটি। কিন্তু ততক্ষণে pipeline-এ পরের নির্দেশ ঢোকানোর সময় পেরিয়ে যাচ্ছে! অপেক্ষা করলে সময় নষ্ট। তাই CPU অনুমান করে — একে বলে branch prediction. অনুমান করে আগেভাগে নির্দেশ চালানোকে বলে speculative execution. অনুমান ভুল হলে কী হয়, দেখুন:
| নির্দেশ \ চক্র | ১ | ২ | ৩ | ৪ | ৫ | ৬ | ৭ | ৮ |
|---|---|---|---|---|---|---|---|---|
| I1 · SUB | ||||||||
| I2 · JZ | ||||||||
| I3 · ADD | ||||||||
| I4 · STORE | ||||||||
| T · OUT |
F? / D? = অনুমানের ভিত্তিতে আনা · ✗ = বাতিল (flush) · T = লাফের গন্তব্য
| অবস্থা | |
| ACC | |
| predictor-এর অনুমান | |
| নষ্ট চক্র |
- চক্র ২. একটি লুপের শেষ অংশ: I1 (
SUB) ACC থেকে 1 বাদ দিচ্ছে, আর পেছনে I2 (JZ T) আনা হয়েছে — “ACC শূন্য হলে T ঠিকানায় লাফ দাও”। - চক্র ৩ — অনুমানের মুহূর্ত। JZ এখনো decode-এ; ACC শূন্য কি না, তা জানা যাবে execute-এ। কিন্তু fetch-এর সার্কিট এখনই কিছু আনতে চায়। Branch predictor অনুমান করে “লাফ দেবে না” (লুপ সাধারণত চলতেই থাকে), তাই পরের নির্দেশ I3 আনা হয় — “?” মানে অনুমানের ভিত্তিতে, speculative.
- চক্র ৪ — সত্য প্রকাশ। JZ execute হলো: ACC সত্যিই 0, তাই লাফ দিতে হবে — অনুমান ভুল! ইতিমধ্যে I3 decode-এ আর I4 fetch-এ ঢুকে গেছে, কিন্তু এদের চলার কথাই ছিল না।
- Flush — ভুল পথ মুছে ফেলা। CPU I3 আর I4-কে বাতিল করে (✗)। এরা কোনো ফল লেখেনি, তাই ক্ষতি নেই — শুধু দুটি চক্র নষ্ট। PC-তে বসে লাফের ঠিকানা T.
- চক্র ৫–৮. এবার সঠিক নির্দেশ T (
OUT) আনা হলো চক্র ৫-এ, শেষ হলো চক্র ৮-এ। অনুমান ঠিক হলে T চক্র ৩-এই আনা যেত, আর সব শেষ হতো চক্র ৬-এ। ভুল অনুমানের দাম: ২ চক্র। - হিসাব। আমাদের ছোট pipeline-এ ভুলের দাম ২ চক্র; আধুনিক CPU-র গভীর pipeline-এ ১৫–২০ চক্র। তাই predictor-এর নির্ভুলতা গতির জন্য খুব জরুরি — আর অনুমানে চালানো নির্দেশ যে cache-এ চিহ্ন রেখে যায়, সেটিই পরে Spectre-এর মতো নিরাপত্তা-সমস্যার জন্ম দেয় (ভাবনার প্রশ্ন ৪)।
আধুনিক branch predictor আগের লাফগুলোর ইতিহাস মনে রেখে অনুমান করে — যেমন “এই লুপ গত ৯৯ বার লাফ দিয়েছে, এবারও দেবে”। অনেক প্রোগ্রামে এদের অনুমান ৯৫ শতাংশেরও বেশি সময় ঠিক হয়। ভুল হলে খরচ অবশ্য বড় — গভীর pipeline-এ একবারে ১৫–২০ চক্র নষ্ট হতে পারে।
আরও দুটি কৌশল, এক লাইনে: Superscalar CPU-তে একাধিক ALU আর একাধিক pipeline থাকে, তাই এক চক্রে কয়েকটি নির্দেশ একসাথে শুরু হয় — IPC ১-এর বেশি হয় এভাবেই। আর out-of-order execution-এ CPU নির্দেশের তালিকায় সামনে তাকিয়ে, যে নির্দেশের ইনপুট তৈরি সেটি আগে চালিয়ে নেয় — যদিও ফল প্রোগ্রামের মূল ক্রমেই প্রকাশ করে, যাতে প্রোগ্রামার কিছু টের না পান।
৭ · মাল্টিকোর, thread আর Hyper-Threading
এক কোরকে আর দ্রুত করা কঠিন হয়ে যাওয়ায় নির্মাতারা অন্য পথ ধরলেন: এক চিপে কয়েকটি সম্পূর্ণ core বসানো (multicore). প্রতিটি কোরের নিজস্ব ALU, কন্ট্রোল ইউনিট, রেজিস্টার আর pipeline — যেন এক রান্নাঘরে কয়েকজন রাঁধুনি।
কিন্তু কোর থাকলেই কাজ ভাগ হয় না। প্রোগ্রামকে নিজের কাজ কয়েকটি স্বাধীন “ধারায়” ভাগ করতে হয় — প্রতিটি ধারাকে বলে thread. অপারেটিং সিস্টেম (পর্ব ২৬) এই thread-গুলোকে আলাদা কোরে বসায়। যে প্রোগ্রাম একটিমাত্র thread-এ লেখা (single-threaded), সে ১৬ কোরের CPU-তেও একটি কোরই ব্যবহার করে — বাকি ১৫টি তার জন্য বসে থাকে। আর যে ধাপ আগের ধাপের ফলের ওপর নির্ভর করে, সেটি ভাগ করাই যায় না।
১৯৬৭ সালে IBM-এর প্রকৌশলী Gene Amdahl এই সীমাটি একটি সহজ হিসাবে দেখান, যা আজ Amdahl’s law নামে পরিচিত: প্রোগ্রামের যে অংশ ভাগ করা যায় না, কোর যত বাড়ান, সেই অংশের সময় কমে না। একটি উদাহরণে দেখুন:
- ১ কোর
১০০ সেকেন্ডশুরুর অবস্থা - ২ কোর
৬০ সেকেন্ড≈ ১.৭ গুণ - ৪ কোর
৪০ সেকেন্ড২.৫ গুণ - ৮ কোর
৩০ সেকেন্ড≈ ৩.৩ গুণ - অসীম কোর
২০ সেকেন্ডসর্বোচ্চ ৫ গুণ
| সিরিয়াল অংশ | |
| ভাগযোগ্য অংশ | |
| মোট সময় | |
| গতি (speedup) |
- এক কোর, ১০০ সেকেন্ড। ধরুন একটি কাজের ২০ সেকেন্ড অংশ ভাগ করা যায় না — যেমন ফাইল খোলা, সেটিংস পড়া, শেষে সব জুড়ে একটি ফাইল লেখা। বাকি ৮০ সেকেন্ডের কাজ (ভিডিওর আলাদা আলাদা অংশ প্রসেস করা) ভাগ করা যায়।
- দুই কোর। ভাগযোগ্য ৮০ সেকেন্ড দুজনে ভাগ করে ৪০ সেকেন্ডে শেষ। কিন্তু সিরিয়াল ২০ সেকেন্ড আগের মতোই। মোট ৬০ সেকেন্ড — কোর দ্বিগুণ, গতি দ্বিগুণ নয়, প্রায় ১.৭ গুণ।
- চার কোর। ভাগযোগ্য অংশ ২০ সেকেন্ডে নামল, মোট ৪০. লক্ষ করুন, এখন সময়ের অর্ধেকই সিরিয়াল অংশ — সেটিই এখন মূল বাধা।
- আট কোর। ভাগযোগ্য অংশ ১০ সেকেন্ড, মোট ৩০. চার থেকে আট কোরে যেতে কোর দ্বিগুণ হলো, কিন্তু সময় কমল মাত্র ১০ সেকেন্ড। প্রতিটি নতুন কোরের লাভ ক্রমশ কমছে।
- অসীম কোর। ভাগযোগ্য অংশ প্রায় শূন্যে নামলেও সিরিয়াল ২০ সেকেন্ড থেকেই যায়। তাই এই কাজে কোনো CPU-ই ৫ গুণের বেশি গতি দিতে পারবে না। সাধারণ নিয়ম: সিরিয়াল অংশ s হলে সর্বোচ্চ গতি 1 ÷ s. প্রোগ্রামাররা তাই সিরিয়াল অংশ ছোট করার চেষ্টা করেন — শুধু কোর বাড়িয়ে লাভ নেই।
Hyper-Threading — এক কোর, দুই thread
একটি কোর প্রায়ই মেমরির অপেক্ষায় অলস বসে থাকে। এই ফাঁকা সময় কাজে লাগাতে একটি কোরে দুই সেট রেজিস্টার (PC, flag ইত্যাদি) রাখা হয়, যাতে দুটি thread একই ALU-গুলো ভাগ করে চলতে পারে। এর সাধারণ নাম SMT (simultaneous multithreading); Intel একে বলে Hyper-Threading, যা ২০০২ সালে তাদের CPU-তে আসে। AMD-র Ryzen-এও SMT আছে। তাই “৮ কোর, ১৬ থ্রেড” CPU-তে Windows ১৬টি “logical processor” দেখায় — কিন্তু আসলে ALU-র দল ৮টিই। এতে কাজভেদে কিছুটা বাড়তি গতি আসে, দ্বিগুণ কখনোই নয়। Intel ২০২৪ সালের কিছু নতুন চিপে Hyper-Threading বাদও দিয়েছে।
আরেকটি নতুন ধারা hybrid CPU: এক চিপে দুই রকম কোর — শক্তিশালী “performance” কোর (P-core) আর কম বিদ্যুতের “efficiency” কোর (E-core). ফোনের ARM চিপে এটি বহু বছর ধরে চলছে (big.LITTLE), আর এখন ল্যাপটপেও সাধারণ — হালকা কাজ E-core-এ, ভারী কাজ P-core-এ।
৮ · CISC বনাম RISC, আর GPU, NPU ও মাইক্রোকন্ট্রোলার
প্রতিটি CPU পরিবারের নিজস্ব instruction set আছে — x86-এর machine code ARM চিপে চলে না, যেমন বাংলা বই চীনা পাঠকের কাছে অর্থহীন। ISA নকশার দুটি বড় দর্শন:
🧱 CISC — বড় বড় নির্দেশ
CISC (Complex Instruction Set Computer): একটি নির্দেশ অনেক কাজ করতে পারে — যেমন মেমরি থেকে পড়ে, যোগ করে, আবার মেমরিতে লেখে। নির্দেশের দৈর্ঘ্যও আলাদা আলাদা (x86-এ ১ থেকে ১৫ byte). প্রোগ্রাম ছোট হয়, কিন্তু decode জটিল। উদাহরণ: x86 (Intel, AMD).
Windows PC, সার্ভার⚡ RISC — ছোট, সরল নির্দেশ
RISC (Reduced Instruction Set Computer): প্রতিটি নির্দেশ একটি সরল কাজ করে, দৈর্ঘ্য সমান (সাধারণত ৪ byte), আর মেমরি ছোঁয় শুধু LOAD ও STORE — আমাদের খেলনা CPU-র মতো। Decode সহজ, pipeline মসৃণ, বিদ্যুৎ কম। উদাহরণ: ARM, RISC-V.
ফোন, Apple M-সিরিজবাস্তবে সীমারেখা এখন ঝাপসা — আধুনিক x86 CPU ভেতরে জটিল নির্দেশকে ছোট RISC-ধাঁচের অংশে (micro-op) ভেঙে চালায়। তবু বিদ্যুৎ-সাশ্রয়ে ARM-এর সুনাম ঐতিহাসিক: প্রায় সব স্মার্টফোনের চিপ ARM নকশায় তৈরি, ২০২০ সাল থেকে Apple-এর Mac চলে নিজস্ব ARM চিপ (M-সিরিজ) দিয়ে, আর Windows-এর কিছু ল্যাপটপেও এখন ARM চিপ।
CPU ছাড়াও প্রসেসর — কে কোন কাজের ওস্তাদ
| প্রসেসর | নকশার ধরন | সেরা কাজ |
|---|---|---|
| CPU | কয়েকটি শক্তিশালী কোর, বড় cache, চতুর branch prediction | সাধারণ যেকোনো কাজ, বিশেষ করে সিদ্ধান্তে ভরা কাজ — অপারেটিং সিস্টেম, ব্রাউজার, Excel |
| GPU | হাজার হাজার সরল কোর, একই নির্দেশ অনেক ডেটায় একসাথে | ছবি আঁকা, গেম, ভিডিও, আর AI মডেল প্রশিক্ষণ — যেখানে একই হিসাব কোটি সংখ্যায় |
| NPU / AI accelerator | ম্যাট্রিক্স গুণের জন্য বিশেষ সার্কিট, কম নির্ভুলতার সংখ্যায় দ্রুত | ফোনে ছবি চেনা, ভয়েস টাইপিং, ব্যাকগ্রাউন্ড ঝাপসা করা — কম বিদ্যুতে |
| মাইক্রোকন্ট্রোলার | এক চিপে ছোট CPU, অল্প RAM, flash আর I/O পিন | ওয়াশিং মেশিন, মাইক্রোওভেন, রিমোট, Arduino প্রজেক্ট — এমবেডেড সিস্টেম |
একটি তুলনা মজার। জনপ্রিয় Arduino Uno বোর্ডের ATmega328P মাইক্রোকন্ট্রোলার চলে ১৬ MHz-এ, RAM মাত্র ২ KB, প্রোগ্রাম রাখার flash ৩২ KB — একটি ল্যাপটপের তুলনায় হাস্যকর রকম ছোট। অথচ সেচ-পাম্প বা ফ্যান স্বয়ংক্রিয়ভাবে চালাতে এটুকুই যথেষ্ট। এর ভেতরে নির্দেশ আর ডেটার জন্য আলাদা মেমরি — একে বলে Harvard architecture, যা von Neumann bottleneck এড়ানোর একটি পুরোনো কৌশল। ফোনে অবশ্য CPU, GPU, NPU সব একটি চিপেই থাকে — SoC, পর্ব ০৩-এ যার কথা পড়েছেন।
৯ · CPU-র স্পেক পড়া আর Task Manager-এ CPU দেখা
এবার এই পর্বের জ্ঞান দিয়ে একটি ল্যাপটপের CPU স্পেক পড়া যাক (পর্ব ০৮-এ কেনার সময় কোন CPU বেছে নেবেন, তা দেখেছেন)। একটি কাল্পনিক উদাহরণ:
| স্পেকে যা লেখা | মানে কী |
|---|---|
| Cores: 12 (4 P + 8 E) | ১২টি সম্পূর্ণ কোর — ৪টি শক্তিশালী, ৮টি সাশ্রয়ী |
| Threads: 16 | P-core-গুলোতে Hyper-Threading আছে (৪ × ২ = ৮) + ৮টি E-core = ১৬টি logical processor |
| Base clock 2.0 GHz · Max boost 4.8 GHz | দীর্ঘ ভারী কাজে প্রায় base-এর কাছে; অল্প সময়ের জন্য, এক-দুই কোরে, boost পর্যন্ত |
| Cache: 12 MB (L3) | CPU-র ভেতরের দ্রুত মেমরি; বড় হলে RAM-এর জন্য অপেক্ষা কম (পর্ব ২৫) |
| TDP / Base power: 28 W | সাধারণ ভারী কাজে কত ওয়াট তাপ ছাড়ে — ঠান্ডা রাখার ব্যবস্থা আর ব্যাটারির ইঙ্গিত (TDP) |
| Architecture: x86-64 | কোন নির্দেশ-ভাষা — কোন সফটওয়্যার সরাসরি চলবে |
Windows-এ নিজের CPU দেখতে Ctrl + Shift + Esc চেপে Task Manager খুলুন, তারপর Performance ট্যাবে CPU. সেখানে পাবেন: Utilization (কত শতাংশ ব্যস্ত), Speed (এই মুহূর্তের ক্লক — base-এর চেয়ে বেশিও দেখাতে পারে), Base speed, Cores, Logical processors, আর L1, L2, L3 cache-এর মাপ। গ্রাফে ডান-ক্লিক করে Change graph to → Logical processors বেছে নিলে প্রতিটি logical processor-এর আলাদা গ্রাফ দেখবেন। single-threaded ভারী কাজে প্রায়ই মোট Utilization কম, অথচ একটি-দুটি গ্রাফ উঁচু।
কমান্ড দিয়েও দেখা যায়। Windows PowerShell-এ (পর্ব ২৯-এ কমান্ড লাইন বিস্তারিত আসবে):
Get-CimInstance Win32_Processor | Select-Object Name, NumberOfCores, NumberOfLogicalProcessors, MaxClockSpeedপ্রত্যাশিত আউটপুট (আপনার যন্ত্রে নাম আর সংখ্যা আলাদা হবে): CPU-র পুরো নাম, কোরের সংখ্যা, logical processor-এর সংখ্যা, আর MHz-এ একটি ক্লক-মান। Linux-এ একই তথ্য দেয় lscpu, আর শুধু logical processor গুনতে nproc.
পরীক্ষা ও ইন্টারভিউতে — এ ধরনের প্রশ্ন প্রায়ই আসে:
- Program Counter (PC)-এর কাজ কী? পরবর্তী যে নির্দেশ চালানো হবে, মেমরিতে তার ঠিকানা ধরে রাখা; প্রতিটি fetch-এর পর এটি বাড়ে।
- Machine cycle-এর ধাপগুলো কী কী? Fetch (নির্দেশ আনা), Decode (মানে বোঝা), Execute (কাজ করা), Store বা write back (ফল রাখা)।
- ALU আর CU-র পার্থক্য? ALU গাণিতিক ও যৌক্তিক হিসাব করে; CU নির্দেশ বুঝে সব অংশকে নিয়ন্ত্রণ ও সমন্বয় করে, নিজে হিসাব করে না।
- CPU-র ক্লক স্পিডের একক? হার্টজ (Hz) — আজকের CPU-তে সাধারণত GHz; ১ GHz = প্রতি সেকেন্ডে ১০০ কোটি চক্র।
- “৬৪-bit প্রসেসর” মানে কী? CPU একবারে ৬৪ bit তথ্য ও ঠিকানা নিয়ে কাজ করে (word size ৬৪ bit); তাই ৪ GB-র অনেক বেশি মেমরি ব্যবহার করতে পারে।
আরও গভীরে: এই পর্বে CPU-কে বাইরে থেকে ধাপে ধাপে দেখেছি। ভেতরের datapath কীভাবে তারে তারে জোড়া, কন্ট্রোল ইউনিট hardwired না microprogrammed, pipeline-এর data hazard কীভাবে forwarding দিয়ে সারানো হয় — সব আছে আমাদের Computer Architecture & Digital Logic কোর্সে। শুরু করতে পারেন pipelining-এর পর্বটি দিয়ে, আর নিজে পুরো একটি CPU সিমুলেটর বানাতে চাইলে দেখুন ক্যাপস্টোন পর্বটি।
১০ · AI-এর যুগে — CPU-র ব্যাখ্যা আর মার্কেটিং-দাবি যাচাই
“CPU কীভাবে কাজ করে” জিজ্ঞেস করলে AI চ্যাটবট সুন্দর, গোছানো উত্তর দেয়। কিন্তু AI শেখে ইন্টারনেটের অতি-সরল আর বিজ্ঞাপনী লেখা থেকেও। তাই তার উত্তরে প্রায়ই core আর thread গুলিয়ে যায়, GHz-কে গতির একমাত্র মাপ ধরা হয়, বা নির্দিষ্ট মডেলের ভুল স্পেক আত্মবিশ্বাসের সাথে বলা হয় — যাকে বলে AI hallucination.
| AI বা বিজ্ঞাপনের সাধারণ দাবি | আসল কথা |
|---|---|
| “৮ কোর মানে ৮ গুণ দ্রুত” | শুধু পুরোপুরি ভাগযোগ্য কাজে কাছাকাছি; সিরিয়াল অংশ গতি আটকায় (Amdahl) |
| “১৬ থ্রেড = ১৬ কোর” | Hyper-Threading-এ এক কোরে দুই thread; ALU-র দল কোরের সমানই |
| “বেশি GHz মানেই দ্রুত CPU” | IPC আর প্রজন্ম আলাদা হলে তুলনা অর্থহীন; benchmark দেখুন |
| “Boost clock-এ সবসময় চলে” | অল্প সময়, অল্প কোরে, ঠান্ডা থাকলে; ল্যাপটপে দীর্ঘ কাজে কম |
| নির্দিষ্ট মডেলের কোর, cache বা TDP-র সংখ্যা | প্রায়ই ভুল বা অন্য মডেলের; নির্মাতার অফিশিয়াল স্পেক পাতায় মিলিয়ে নিন |
নিচের prompt-টি কপি করে নিজের প্রশ্ন বা CPU-র নাম বসিয়ে ব্যবহার করুন। খেয়াল করুন, AI-কে উৎস আর অনিশ্চয়তা আলাদা করে বলতে বলা হয়েছে:
AI-এর উত্তর হাতে পেলে — যাচাইয়ের চেকলিস্ট
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিয়ে নিজে কিছুক্ষণ ভাবুন — তারপর “→ উত্তর” চাপুন। CPU-র ইতিহাসের এই বাঁকগুলো বোঝায়, আজকের চিপ কেন এমন।
প্র ০১১৯৪৫ সালের একটি অসমাপ্ত প্রতিবেদন কীভাবে প্রায় সব কম্পিউটারের নকশা ঠিক করে দিল — আর সেই নকশার “bottleneck” কী?
দ্বিতীয় বিশ্বযুদ্ধের সময় যুক্তরাষ্ট্রের University of Pennsylvania-তে J. Presper Eckert আর John Mauchly-র দল ENIAC বানাচ্ছিলেন। ENIAC-এ প্রোগ্রাম বদলাতে তার খুলে নতুন করে জুড়তে হতো, কখনো কয়েক দিন লেগে যেত। দলটি তখনই পরের যন্ত্র EDVAC-এর কথা ভাবছিল, যেখানে প্রোগ্রাম মেমরিতে রাখা যাবে। গণিতবিদ John von Neumann এই আলোচনায় যোগ দেন, আর ১৯৪৫ সালের জুনে “First Draft of a Report on the EDVAC” নামে একটি প্রতিবেদন লেখেন। প্রতিবেদনটি শুধু তাঁর নামে ছড়ায় — Eckert আর Mauchly পরে আপত্তি করেন, কারণ ধারণাগুলো দলের যৌথ আলোচনা থেকে এসেছিল। তবু নকশাটি পরিচিত হয় “von Neumann architecture” নামে।
প্রতিবেদনটির শক্তি ছিল এর সরলতা: একটি গণনা-অংশ, একটি নিয়ন্ত্রণ-অংশ, একটি মেমরি যেখানে নির্দেশ আর ডেটা একসাথে থাকে, আর ইনপুট-আউটপুট। এই পর্বের খেলনা CPU হুবহু সেই নকশা। ১৯৪৮ সালে ইংল্যান্ডের Manchester-এ ছোট্ট “Baby” যন্ত্র প্রথম মেমরিতে রাখা প্রোগ্রাম চালায়, আর ১৯৪৯ সালে Cambridge-এর EDSAC নিয়মিত কাজ শুরু করে। তারপর থেকে আপনার ফোন পর্যন্ত — মূল কাঠামো একই।
কিন্তু ১৯৭৭ সালে Turing Award গ্রহণের বক্তৃতায় (প্রকাশ ১৯৭৮) FORTRAN ভাষার স্রষ্টা John Backus এই নকশার একটি দুর্বলতাকে নাম দেন “von Neumann bottleneck”. তাঁর যুক্তি: CPU আর মেমরির মাঝের একটিমাত্র সংযোগ দিয়ে একবারে একটি করে শব্দ আসা-যাওয়া করে, আর প্রোগ্রামের বেশিরভাগ সময় যায় হিসাবে নয়, এই আসা-যাওয়ায়।
সময়ের সাথে সমস্যা আরও বেড়েছে: CPU-র গতি যত দ্রুত বেড়েছে, মেমরির গতি তত বাড়েনি। আজকের CPU RAM থেকে একটি তথ্য আনতে যে সময় নেয়, তাতে কয়েকশো নির্দেশ চালাতে পারত। তাই আধুনিক চিপের বড় অংশ জুড়ে থাকে cache (পর্ব ২৫), আর CPU-র ভেতরে নির্দেশ আর ডেটার জন্য আলাদা L1 cache রাখা হয় — von Neumann আর Harvard নকশার একটি মিশ্রণ।
মূল উপলব্ধি: একটি নকশার সবচেয়ে বড় শক্তি — প্রোগ্রাম আর ডেটা একই মেমরিতে, একই পথে — সেটিই তার সবচেয়ে বড় দুর্বলতা। কম্পিউটার স্থাপত্যের গত ৮০ বছরের বড় অংশ এই এক সেতুর জট কমানোর গল্প।
প্র ০২১৯৭১ সালের Intel 4004 আর আজকের একটি CPU — ভেতরের চক্র কি সত্যিই একই? পার্থক্যটা তাহলে কোথায়?
Intel 4004 ছিল প্রথম বাণিজ্যিক মাইক্রোপ্রসেসর — পুরো CPU একটি চিপে। জাপানের Busicom কোম্পানির ক্যালকুলেটরের জন্য Federico Faggin, Ted Hoff, Stanley Mazor আর Busicom-এর Masatoshi Shima মিলে এটি তৈরি করেন। এতে ছিল প্রায় ২,৩০০টি ট্রানজিস্টর, ক্লক সর্বোচ্চ প্রায় ৭৪০ kHz, আর এটি ছিল ৪-bit — একবারে মাত্র ৪ bit নিয়ে কাজ। একটি নির্দেশ শেষ করতে কয়েকটি ক্লক-চক্র লাগত, তাই সেকেন্ডে বড়জোর প্রায় এক লাখ নির্দেশ।
আজকের একটি ল্যাপটপ বা ফোনের চিপে ট্রানজিস্টর থাকে হাজার কোটির বেশি — উদাহরণ হিসেবে, ২০২০ সালের Apple M1-এ প্রায় ১,৬০০ কোটি। ক্লক ৭৪০ kHz থেকে কয়েক GHz — হাজার গুণের বেশি। ৪-bit থেকে ৬৪-bit. কিন্তু আসল লাফটি ক্লকে নয়। প্রতিটি কোর এক চক্রে কয়েকটি নির্দেশ শেষ করে, আর এমন কোর আছে কয়েকটি। সব মিলিয়ে মোট নির্দেশ-ক্ষমতা লাখ থেকে বেড়ে প্রতি সেকেন্ডে কয়েক হাজার কোটি, আর GPU আর NPU যোগ করলে আরও বহু গুণ।
তবু মূল চক্র বদলায়নি। 4004-ও PC থেকে ঠিকানা নিয়ে নির্দেশ আনত, decode করত, চালাত। তাহলে এত ট্রানজিস্টর গেল কোথায়? হিসাবের ALU-তে তার সামান্য অংশ। বেশিরভাগ গেছে চক্রটি দ্রুত করার যন্ত্রপাতিতে: বিশাল cache (চিপের বড় একটি এলাকা), branch predictor, out-of-order execution-এর জন্য শত শত নির্দেশ মনে রাখার টেবিল, একাধিক ALU, আর ভেক্টর ইউনিট — যা এক নির্দেশে একসাথে অনেকগুলো সংখ্যা যোগ করে। অর্থাৎ আধুনিক CPU-র বেশিরভাগ অংশ “কাজ” করে না, কাজের অপেক্ষা কমায়।
Moore’s law (পর্ব ০২) ট্রানজিস্টর দিয়েছে; কী কাজে লাগাবেন, তার উত্তর ধাপে ধাপে এসেছে — pipeline আর cache, superscalar, মাল্টিকোর, আর এখন GPU ও NPU.
মূল উপলব্ধি: ৫০ বছরে CPU-র “কী করে” প্রায় একই আছে; বদলেছে “কত দ্রুত আর কতগুলো একসাথে”। একটি সরল ধারণাকে বারবার নতুন কৌশলে দ্রুত করা — প্রকৌশলের এটি একটি চমৎকার উদাহরণ।
প্র ০৩২০০৫ সালের আশপাশে CPU-র GHz বাড়া হঠাৎ থেমে গেল কেন — আর তাতে প্রোগ্রামারদের জীবন কীভাবে বদলাল?
১৯৯০-এর দশকে আর ২০০০-এর শুরুতে প্রতি বছর-দুই বছরে CPU-র ক্লক প্রায় দ্বিগুণ হচ্ছিল। ২০০০ সালে AMD আর Intel দুজনেই ১ GHz ছুঁয়ে ফেলে, আর ২০০০ সালে আসা Intel-এর Pentium 4 নকশাটিই বানানো হয়েছিল খুব উঁচু ক্লকের জন্য — পরে খুব গভীর pipeline (কোনো সংস্করণে ৩০-এর বেশি ধাপ) দিয়ে। পরিকল্পনা ছিল ১০ GHz পর্যন্ত যাওয়া। কিন্তু ৩.৮ GHz-এর আশপাশে গিয়ে দৌড় থেমে যায়। চিপগুলো এত গরম হচ্ছিল যে সাধারণ কম্পিউটারে ঠান্ডা রাখা কঠিন হয়ে পড়ে। ২০০৪ সালে Intel পরের উঁচু-ক্লকের নকশা বাতিল করে, আর দিক বদলায়।
কারণটি পদার্থবিদ্যার। Dennard scaling-এর যুগে ট্রানজিস্টর ছোট করলে ভোল্টেজও কমানো যেত, তাই প্রতি বর্গ মিলিমিটারে তাপ প্রায় একই থাকত। কিন্তু ভোল্টেজ একটি সীমার নিচে নামালে ট্রানজিস্টর বন্ধ অবস্থাতেও বিদ্যুৎ চুইয়ে যায় (leakage). ভোল্টেজ আর কমানো গেল না, অথচ ট্রানজিস্টর ঘন হতেই থাকল — ফলে তাপের ঘনত্ব বাড়তে লাগল। ক্লক বাড়ালে তাপ বাড়ে আরও দ্রুত, তাই ক্লক থেমে গেল কয়েক GHz-এর ঘরে। আজও সাধারণ CPU-র boost ক্লক মোটামুটি ৪–৬ GHz-এর মধ্যেই।
২০০৫ সালে AMD আর Intel দুজনেই ডেস্কটপের জন্য দুই-কোরের CPU বাজারে আনে। সেই বছরই সফটওয়্যার বিশেষজ্ঞ Herb Sutter একটি বিখ্যাত প্রবন্ধ লেখেন — “The Free Lunch Is Over”. তাঁর কথা: এতদিন প্রোগ্রামাররা কিছু না করেই প্রতি বছর দ্রুত প্রোগ্রাম পেতেন, কারণ নতুন CPU নিজেই দ্রুত। এখন থেকে গতি চাইলে প্রোগ্রামকে নিজে কাজ ভাগ করে অনেক কোরে চালাতে হবে — যা কঠিন, আর ভুল-প্রবণ: দুটি thread একই ডেটা একসাথে বদলালে অদ্ভুত, মাঝে মাঝে ঘটা bug হয় (race condition, পর্ব ২৬-এ আরও)।
এর ফল আজ চারপাশে: ভিডিও এডিটর আর গেম কাজ ভাগ করে, প্রোগ্রামিং ভাষায় parallel লেখার সহজ পথ এসেছে, আর GPU-তে হাজার কোরে কাজ চালানোর যে শিল্প দাঁড়িয়েছে, তার ওপরই আজকের AI.
মূল উপলব্ধি: হার্ডওয়্যারের একটি পদার্থবৈজ্ঞানিক সীমা পুরো সফটওয়্যার শিল্পের চিন্তা বদলে দিয়েছে। “আরও দ্রুত” এখন আর বিনা মূল্যে আসে না — আসে কাজ ভাগ করার দক্ষতা থেকে।
প্র ০৪Spectre আর Meltdown (২০১৮) — গতি বাড়ানোর একটি কৌশল কীভাবে নিরাপত্তার সমস্যা হয়ে দাঁড়াল?
২০১৮ সালের জানুয়ারিতে নিরাপত্তা গবেষকেরা CPU-র দুটি বড় দুর্বলতা প্রকাশ করেন — Meltdown আর Spectre. Google-এর Project Zero দল আর কয়েকটি বিশ্ববিদ্যালয়ের গবেষকেরা (যেমন অস্ট্রিয়ার Graz University of Technology) প্রায় একই সময়ে আলাদাভাবে এগুলো খুঁজে পান। চমকের বিষয়: এগুলো কোনো সফটওয়্যারের ভুল ছিল না, ছিল CPU-র নকশার একটি গুণের পার্শ্বপ্রতিক্রিয়া — এই পর্বেই যে speculative execution দেখেছেন।
মূল ধারণাটি ধারণাগতভাবে বুঝুন। CPU অনুমান করে আগেভাগে নির্দেশ চালায়; অনুমান ভুল হলে ফলগুলো ফেলে দেয় — রেজিস্টারে কোনো চিহ্ন থাকে না। কিন্তু সেই “ভুল পথে” চলার সময় CPU যে তথ্য মেমরি থেকে এনেছিল, তা cache-এ থেকে যেতে পারে। কোনো তথ্য cache-এ আছে কি না, তা পড়ার সময় মেপে বোঝা যায় (cache থেকে দ্রুত, RAM থেকে ধীর)। এভাবে পরোক্ষ সংকেত থেকে গোপন তথ্য আন্দাজ করাকে বলে side-channel. ফলে একটি প্রোগ্রাম নীতিগতভাবে অন্য প্রোগ্রাম বা অপারেটিং সিস্টেমের তথ্যের আভাস পেতে পারত। Meltdown মূলত Intel-এর অনেক CPU-কে (আর কিছু ARM নকশাকে) প্রভাবিত করেছিল; Spectre আরও ব্যাপক — speculative execution আছে এমন প্রায় সব আধুনিক CPU.
সমাধান এসেছে কয়েক স্তরে: অপারেটিং সিস্টেমের আপডেট (যেমন kernel-এর মেমরিকে সাধারণ প্রোগ্রাম থেকে আরও কড়াভাবে আলাদা রাখা), CPU-র microcode আপডেট, compiler-এর নতুন কৌশল, আর ব্রাউজারে সময় মাপার টাইমারকে কম নিখুঁত করা। কিছু কাজে, বিশেষ করে সার্ভারে, এসব প্রতিরক্ষার কারণে গতি কিছুটা কমেছিল। পরের প্রজন্মের CPU-তে নকশা-স্তরেই কিছু সুরক্ষা যোগ হয়েছে। সাধারণ ব্যবহারকারীর জন্য শিক্ষা সরল: অপারেটিং সিস্টেম, ব্রাউজার আর BIOS/UEFI নিয়মিত আপডেট রাখা (পর্ব ৪৩-এ নিরাপত্তার অভ্যাস বিস্তারিত)।
এই ঘটনা দেখাল, গতির জন্য চোখের আড়ালে চলা কৌশলগুলোও তথ্য ফাঁস করতে পারে।
মূল উপলব্ধি: প্রকৌশলে প্রতিটি অপ্টিমাইজেশনের একটি মূল্য আছে। গতি আর নিরাপত্তা অনেক সময় বিপরীত দিকে টানে, আর নকশাকারীকে দুটোর মধ্যে ভারসাম্য খুঁজতে হয়।
প্র ০৫RISC-এর ধারণা একসময় “তত্ত্বের খেলা” মনে হয়েছিল। আজ প্রায় প্রতিটি পকেটে ARM চিপ কেন?
১৯৭০-এর দশকে CPU-নকশার প্রচলিত ভাবনা ছিল: নির্দেশ যত শক্তিশালী, তত ভালো। মেমরি তখন দামি, তাই এক নির্দেশে অনেক কাজ হলে প্রোগ্রাম ছোট হতো। কিন্তু IBM-এর গবেষক John Cocke-র দল (IBM 801 প্রকল্প) লক্ষ করেন, compiler আসলে জটিল নির্দেশগুলো খুব কমই ব্যবহার করে — বেশিরভাগ সময় চলে সরল LOAD, ADD, STORE, লাফ। তাহলে সরল নির্দেশগুলোকেই অতি দ্রুত করলে কেমন হয়?
১৯৮০-র দশকের শুরুতে এই ধারণা নিয়ে দুটি বিশ্ববিদ্যালয়ে কাজ শুরু হয়: University of California, Berkeley-তে David Patterson-এর RISC প্রকল্প (নামটি এখান থেকেই), আর Stanford-এ John Hennessy-র MIPS প্রকল্প। তাঁরা দেখান, সমান দৈর্ঘ্যের সরল নির্দেশ pipeline-এ মসৃণ চলে, decode সহজ, আর বাঁচা ট্রানজিস্টর দিয়ে বেশি রেজিস্টার বা cache বসানো যায়। দুজনে মিলে কম্পিউটার স্থাপত্যের যে পাঠ্যবই লেখেন, তা আজও বিশ্বজুড়ে পড়ানো হয় — এই পর্বের লন্ড্রির উপমাটিও সেখান থেকে বিখ্যাত। এই অবদানের জন্য Patterson ও Hennessy ২০১৭ সালের ACM Turing Award পান।
প্রায় একই সময়ে ইংল্যান্ডের Cambridge-এ Acorn Computers নামের একটি ছোট কোম্পানি নিজেদের কম্পিউটারের জন্য RISC চিপ বানায় — Sophie Wilson আর Steve Furber-এর নকশায় প্রথম ARM চিপ চলে ১৯৮৫ সালে। এর একটি অপ্রত্যাশিত গুণ ছিল: খুবই কম বিদ্যুৎ খরচ। ১৯৯০ সালে ARM আলাদা কোম্পানি হয়, আর একটি নতুন ব্যবসা-ধারা নেয় — নিজে চিপ না বানিয়ে নকশার লাইসেন্স বিক্রি করা। ফলে Apple, Qualcomm, Samsung, MediaTek সবাই ARM নকশায় নিজেদের চিপ বানাতে পারে।
মোবাইল ফোনের যুগে কম বিদ্যুতে বেশি কাজের এই গুণটিই সোনা হয়ে দাঁড়াল। আজ প্রায় সব স্মার্টফোনে ARM-ভিত্তিক চিপ, ২০২০ থেকে Mac-এ Apple-এর M-সিরিজ, আর বড় ক্লাউড কোম্পানিগুলোর সার্ভারেও ARM চিপ বাড়ছে। ২০১০ সালে Berkeley থেকেই এসেছে RISC-V — একটি উন্মুক্ত ISA, যা যে কেউ বিনা লাইসেন্স-ফিতে ব্যবহার করতে পারে।
মূল উপলব্ধি: “কম কিন্তু দ্রুত” — মাপজোক করে প্রমাণ করা একটি নকশা-দর্শন প্রথমে গবেষণাগারে জিতেছে, আর পরে বাজারের চাহিদা (ব্যাটারি) বদলাতেই সারা পৃথিবীতে ছড়িয়েছে। ভালো ধারণার জয়ের জন্য কখনো সঠিক সময়েরও অপেক্ষা করতে হয়।
অনুশীলন
খাতা-কলম নিন — প্রথম দুটি হাতে-কলমে হিসাব, তৃতীয়টি নিজের কম্পিউটারে পর্যবেক্ষণ, আর শেষটিতে ওপরের খেলনা CPU-র কোড একটু বদলাতে হবে।
-
হাতে চালান: খেলনা CPU-র মেমরিতে আছে — ঘর 0:
LOAD 5, ঘর 1:SUB 6, ঘর 2:STORE 7, ঘর 3:HALT, ঘর 5: 9, ঘর 6: 4. প্রোগ্রাম শেষে ঘর 7-এ কী থাকবে? মোট কয়বার fetch হবে, আর শেষে PC কত? ঘর 1-এর machine code hex-এ কী?LOAD 5: ACC = 9. SUB 6: ACC = 9 − 4 = 5. STORE 7: ঘর 7 = 5. HALT-এ থামা। মোট ৪ বার fetch (প্রতিটি নির্দেশে একবার), আর HALT আনার পর PC এক বেড়ে 4 হয়। ঘর 1: SUB-এর opcode 0011, ঠিকানা 6 = 0110, তাই 0011 0110 = hex 36.
-
কোন CPU দ্রুত? CPU A: ৪ GHz, গড় IPC ২, ৪ কোর। CPU B: ৩ GHz, গড় IPC ৩, ২ কোর। (ক) একটি single-threaded কাজে কে দ্রুত? (খ) পুরোপুরি ভাগযোগ্য কাজে কে দ্রুত? (গ) যে কাজের ৫০% সিরিয়াল, তাতে চার কোরের A-র সর্বোচ্চ লাভ এক কোরের তুলনায় কত?
(ক) এক কোরে: A = ৪ × ২ = সেকেন্ডে ৮০০ কোটি নির্দেশ, B = ৩ × ৩ = ৯০০ কোটি। B দ্রুত — কম GHz সত্ত্বেও। (খ) সব কোরে: A = ৮০০ কোটি × ৪ = ৩,২০০ কোটি, B = ৯০০ কোটি × ২ = ১,৮০০ কোটি — A দ্রুত। (গ) ১০০ সেকেন্ডের কাজ ধরলে: ৫০ সেকেন্ড সিরিয়াল + ৫০ ÷ ৪ = ১২.৫ সেকেন্ড = ৬২.৫ সেকেন্ড, অর্থাৎ মাত্র ১.৬ গুণ। অসীম কোরেও ২ গুণের বেশি নয়। শিক্ষা: “কোন CPU ভালো” প্রশ্নের উত্তর নির্ভর করে কোন কাজে।
-
নিজের CPU পর্যবেক্ষণ: Task Manager-এর Performance → CPU খুলে লিখুন — কোর কয়টি, logical processor কয়টি, base speed কত, আর এই মুহূর্তের Speed কত। তারপর গ্রাফকে Logical processors-এ বদলে একটি ভারী কাজ (যেমন একটি বড় ভিডিও চালানো বা কয়েকটি ভারী ওয়েবসাইট একসাথে খোলা) চালিয়ে দেখুন, কোন গ্রাফ ওঠে। Hyper-Threading আছে কি না কীভাবে বুঝবেন?
Logical processor-এর সংখ্যা কোরের দ্বিগুণ হলে সব কোরে SMT/Hyper-Threading আছে; সমান হলে নেই; মাঝামাঝি হলে (যেমন ১২ কোর, ১৬ logical) hybrid CPU — শুধু P-core-এ Hyper-Threading. কাজ না থাকলে Speed প্রায়ই base-এর নিচে থাকে, আর ভারী কাজ শুরু হলে base ছাড়িয়ে boost-এর দিকে ওঠে। ব্যস্ত কাজে কয়েকটি গ্রাফ উঁচু আর বাকিগুলো নিচু থাকলে বুঝবেন কাজটি সব কোরে ভাগ হয়নি। মনে রাখুন, চার logical processor-এর একটি পুরো ব্যস্ত থাকলেও মোট Utilization ২৫% দেখায়।
-
খেলনা CPU বদলান: ওপরের কোডে N-এর মান (ঘর 11) 5 থেকে 10 করে চালান। SUM কত আর মোট কয়টি নির্দেশ চলল? নির্দেশ-সংখ্যার একটি সূত্র বের করুন। তারপর ভাবুন (চালাবেন না!): N = 0 দিলে কী হবে?
শুধু
mem-এর দ্বিতীয় লাইনে5-কে10করুন। আউটপুট:OUTPUT: 55আরHALT after 82 instructions. SUM (cell 12) = 55. প্রতি পাকে ৮টি নির্দেশ, শুধু শেষ পাকে JUMP বাদ পড়ে ৭টি, তারপর LOAD, OUT, HALT — মোট (N − 1) × ৮ + ৭ + ৩ = ৮N + ২ (N = 5-এ ৪২ ✓, N = 10-এ ৮২ ✓)। N = 0 দিলে প্রথম পাকেই SUB-এর পর ACC = −1, শূন্য নয় — JZ আর কখনো লাফ দেবে না, N −2, −3… হতে থাকবে: অসীম লুপ, ব্রাউজার আটকে যাবে। আসল প্রোগ্রামে তাই শর্ত “N ≤ 0 হলে থামো” লেখা হয় — আর এমন ভুলই অনেক “হ্যাং” হওয়া প্রোগ্রামের কারণ।
নিজেকে যাচাই করুন
ভুল হলে কারণসহ ব্যাখ্যা পাবেন, আবার চেষ্টাও করতে পারবেন।
ক্রমএকটি নির্দেশ চালানোর ধাপগুলো সঠিক ক্রমে সাজান (▲▼ চেপে সরান)
- 📍 PC-র ঠিকানা MAR-এ যায়
- 📥 মেমরি থেকে নির্দেশ MDR হয়ে IR-এ আসে, PC এক বাড়ে
- 🔍 কন্ট্রোল ইউনিট IR-এর opcode decode করে
- 🧮 ALU হিসাব করে (execute)
- 💾 ফল রেজিস্টার বা মেমরিতে লেখা হয় (write back)
CPU-র কোন রেজিস্টার পরবর্তী যে নির্দেশ চালানো হবে, তার মেমরি-ঠিকানা ধরে রাখে?
- Instruction Register (IR)
- Program Counter (PC)
- Accumulator (ACC)
- Memory Data Register (MDR)
৩২-bit অ্যাড্রেস বাস (প্রতি ঠিকানায় ১ byte) দিয়ে সর্বোচ্চ কত মেমরি চেনা যায়?
- ৬৪ KB
- ১ MB
- ৪ GB
- ৩২ GB
একটি CPU-র ক্লক স্পিড ৩ GHz হলে এর মানে কী?
- প্রতি সেকেন্ডে ৩০০ কোটি ক্লক-চক্র
- প্রতি সেকেন্ডে ঠিক ৩০০ কোটি নির্দেশ
- CPU-তে ৩টি কোর আছে
- CPU ৩ GB মেমরি ব্যবহার করতে পারে
৪ ধাপের একটি আদর্শ pipeline-এ (কোনো বাধা নেই, প্রতি ধাপে ১ চক্র) ৪টি নির্দেশ শেষ করতে মোট কয়টি চক্র লাগে?
- ৪টি
- ১৬টি
- ৮টি
- ৭টি
একটি প্রোগ্রামের ৫০% অংশ কোনোভাবেই ভাগ করে চালানো যায় না। যত খুশি কোর দিলেও এর সর্বোচ্চ গতিবৃদ্ধি কত?
- অসীম গুণ
- ২ গুণ
- ৫০ গুণ
- কোর যত, তত গুণ
প্রায় সব স্মার্টফোনের প্রসেসর কোন নির্দেশ-স্থাপত্যের (ISA) ওপর তৈরি?
- x86 (CISC)
- Intel 4004
- ARM (RISC)
- GPU
শব্দকোষ
লেখার মধ্যে ডটেড দাগ দেওয়া শব্দে মাউস রাখুন বা চাপুন — অর্থ দেখাবে। এই পর্বের সব নতুন শব্দ এখানে একসাথে:
মনে রাখুন
- CPU-র মূল চক্র: fetch → decode → execute → store, বারবার; von Neumann নকশায় নির্দেশ আর ডেটা একই মেমরিতে।
- রেজিস্টার: PC = পরের নির্দেশের ঠিকানা, IR = চলমান নির্দেশ, MAR = মেমরির ঠিকানা, MDR = মেমরির তথ্য, ACC = চলতি ফল, flag = শেষ হিসাবের খবর।
- বাস: n-bit অ্যাড্রেস বাসে 2n ঠিকানা — ৩২-bit-এ ৪ GB. ৬৪-bit মানে বড় word আর বড় ঠিকানা, দ্বিগুণ গতি নয়।
- গতি ≈ IPC × ক্লক × কোর: তাপের কারণে GHz থেমেছে; pipeline, branch prediction, superscalar আর মাল্টিকোর দিয়ে চক্র দ্রুত হয়।
- সীমা আর যাচাই: সিরিয়াল অংশ গতি আটকায় (Amdahl); thread ≠ কোর; RISC (ARM) ফোনে, CISC (x86) PC-তে — সব দাবি স্পেক শিট আর benchmark দিয়ে যাচাই করুন।
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- পর্ব ২৫ · মেমরি হায়ারার্কি, cache আর virtual memoryপরবর্তী পর্বCPU-র অপেক্ষা কমানোর স্তরে স্তরে সাজানো মেমরি।
- পর্ব ২৩ · ট্রানজিস্টর থেকে অ্যাপ — বিমূর্ততার স্তরআগের পর্বCPU-র নির্দেশ-ভাষা কোন স্তরে বসে।
- কম্পিউটার ফান্ডামেন্টালস ও ICT · কোর্স হোম৫৫টি পর্বপুরো কোর্সের রোডম্যাপ — কোন পর্ব কখন।
- Computer Architecture & Digital Logicগভীরে যানdatapath, কন্ট্রোল ইউনিট, pipeline hazard আর নিজের CPU সিমুলেটর।
- অপারেটিং সিস্টেমপাশের ট্র্যাকthread, process আর scheduling — কোরগুলোতে কাজ কে কীভাবে ভাগ করে।