~/writing/cpu-blueprint $
    03/08
    intro ⏻
    LEVEL 2 — THE MACHINERYপর্ব ০৩/০৮~১২ মিনিট

    CPU-র blueprint

    একটা processor-এর ভেতরে আসলে কী কী থাকে?

    আগের আর্টিকেলে দেখেছিলাম বাস্তব জগতের তথ্য — সংখ্যা, text, image, sound — কীভাবে ০ আর ১-এ রূপ নেয় এবং memory-তে voltage হিসেবে জমা হয়। এবার সেই voltage-এর কী হয়।

    ধরা যাক, ২ এবং ৩ সংখ্যা দুটি এখন RAM-এর কোথাও voltage হিসেবে চুপচাপ বসে আছে। তারা নিজে থেকে কিছুই করতে পারে না। কিন্তু আপনি যখন কোডে লিখলেন:

    result = 2 + 3

    ঠিক কয়েক ন্যানোসেকেন্ডের মধ্যে memory-তে ৫ তৈরি হয়ে গেল।

    প্রশ্ন হলো, সিলিকনের একটা জড় টুকরো কীভাবে হিসাব করল যে ২ আর ৩ যোগ করলে ৫ হয়? তার তো কোনো মানুষের মতো বুদ্ধি নেই। এই আর্টিকেলে আমরা এই দুটি সংখ্যার ট্র্যাক ফলো করে সরাসরি CPU-র হার্ডওয়্যার লেভেলে ঢুকে যাবো — দেখবো কোনো অপারেটিং সিস্টেম বা সফটওয়্যারের সাহায্য ছাড়াই, শুধু পিওর ইলেকট্রনিক্স দিয়ে কীভাবে একটি হিসাব সম্পন্ন হয়।

    আমরা মূলত processor-এর ৪টি মূল কম্পোনেন্টের ওপর ফোকাস করবো:

    • ALU (Arithmetic Logic Unit): যেখানে মূল গাণিতিক হিসাবগুলো হয়।
    • Register: CPU-র ভেতরের অতি দ্রুতগতির লোকাল memory।
    • Data Bus: কম্পোনেন্টগুলোর মধ্যে ডেটা আদান-প্রদানের হাইওয়ে।
    • Clock: পুরো processor-এর timing ও synchronization নিশ্চিত করার oscillator।
    একটি জরুরি পার্থক্য: অনেকেই CPU আর ALU-কে একই জিনিস মনে করে গুলিয়ে ফেলেন। আসলে ALU হলো CPU-র ভেতরের একটি নির্দিষ্ট department মাত্র। একটা বাড়ির রান্নাঘর যেমন পুরো বাড়ির প্রতিনিধি নয়, কিন্তু রান্নার কাজটা সেখানেই হয় — ঠিক তেমনি ALU পুরো processor নয়, কিন্তু গাণিতিক হিসাবের মূল দায়িত্বটা তারই।
    01

    ALU: logic gate থেকে গণিত

    CPU-র ভেতরে যেখানে গণিতের হিসাব হয়, সেটাই ALU — Arithmetic Logic Unit। যোগ, বিয়োগ, তুলনা এবং bitwise logic operation (যেমন AND, OR, XOR) — সবকিছুই এখানে ঘটে।

    কিন্তু ALU-র ভেতরে কোনো রহস্যময় বুদ্ধিমত্তা নেই। এটা তৈরি হয়েছে আগের আর্টিকেলে দেখা সেই logic gate-গুলো নিখুঁত বিন্যাসে জোড়া লাগিয়ে। দুইটা ১-bit binary সংখ্যা (ধরুন A আর B) যোগ করার circuit কীভাবে বানানো যায় সেটা দেখা যাক।

    Binary যোগের নিয়মগুলো সরল:

    0 + 0 = 00
    0 + 1 = 01
    1 + 0 = 01
    1 + 1 = 10  (decimal 2)

    খেয়াল করুন:

    • ডানপাশের bit (Sum) কেবল তখনই ১ হয় যখন A অথবা B-এর যেকোনো একটার মান ১, কিন্তু দুইটাই ১ হলে ০ — ঠিক একটা XOR gate এর মতো।
    • বাঁপাশের bit (Carry) কেবল তখনই ১ হয় যখন A এবং B — দুইটাই ১ — এটা ঠিক AND gate এর মতো।

    XOR আর AND gate পাশাপাশি জোড়া দিলে তৈরি হয় একটা Half Adder। কিন্তু এখানে একটা সমস্যা আছে।

    Half Adder শুধু দুটি একক bit যোগ করতে পারে — মানুষ যেমন হাতে একটা "carry" মনে রাখে বড় সংখ্যা যোগ করার সময়, Half Adder সেটা পারে না। তাহলে এটি 1111 + 0001 যোগ করবে কীভাবে?

    এই সমস্যার সমাধান হলো Full Adder। একই কাঠামোর সাথে "Carry In" নামে একটা অতিরিক্ত input যোগ করা হয়, যাতে আগের bit-এর carry পরের bit-এ এসে ঢুকতে পারে।

    এখন processor-এ ৬৪-bit-এর দুইটা সংখ্যা যোগ করতে চাইলে কী করতে হবে? সহজ বুদ্ধি হলো — এমন ৬৪টি Full Adder একের পর এক সিরিজে জোড়া দেওয়া। একটা ট্রেনের কথা কল্পনা করুন: প্রতিটা বগি একটা Full Adder। প্রথম বগি carry পাঠায় দ্বিতীয় বগিতে, দ্বিতীয়টা তৃতীয়তে — এভাবে ৬৪ নম্বর বগি পর্যন্ত সেই ছোট্ট carry signal দৌড়াতে থাকে। এই নকশাকে বলা হয় Ripple Carry Adder।

    half adder — XOR + AND দিয়ে ১-bit যোগ
    ABXORANDSumCarry01
    Sum = 1 XOR 1 = 0 · Carry = 1 AND 1 = 1
    Half Adder: XOR আর AND gate জোড়া দিলে binary যোগের প্রথম ধাপ। button চেপে input বদলান।
    থিওরি বনাম বাস্তব: এই ট্রেনের analogy শেখানোর জন্য চমৎকার হলেও, আধুনিক processor-এ এই পদ্ধতি ব্যবহার করা হয় না। কারণ ৬৪টি বগি পার হতে হতে signal-এ যে সামান্য সময়ের বিলম্ব ঘটে — যাকে বলে propagation delay — তা ৩-৫ GHz clock speed-এর জন্য বড্ড ধীরগতির। তাই আধুনিক processor-এ Carry-Lookahead Adder বা Prefix Adder ব্যবহার করা হয়, যা একটি বিশেষ গাণিতিক কৌশলে ৬৪টি bit-এর carry মান একসাথে (parallel-এ) হিসাব করে ফেলে।

    তাহলে যোগফল তৈরি হলো। কিন্তু এই যোগফলটা রাখা হবে কোথায়? CPU কি সরাসরি RAM-এ পাঠিয়ে দেবে? না — RAM processor-এর কেন্দ্র থেকে অনেক দূরে। processor-এর একদম নিজের কাছেই অত্যন্ত দ্রুতগতির কিছু memory cell থাকা দরকার। এই cell-গুলোই হলো Register।

    02

    Register: CPU-র নিজের ডেস্ক

    CPU যখন হিসাব করে, তখন RAM থেকে বারবার ডেটা আনা-নেওয়া করা বেশ ঝামেলার কাজ — RAM CPU থেকে বেশ দূরে এবং তুলনামূলকভাবে ধীরগতির। তাই CPU-র ঠিক ভেতরেই ডেটা ধরে রাখার জন্য একদল অত্যন্ত দ্রুত memory cell থাকে — এদের বলে register।

    একটি register আসলে কী? আগের আর্টিকেলে দেখা সেই flip-flop-এর কথা মনে আছে? একটি register হলো কতগুলো flip-flop-কে পাশাপাশি লাইনে দাঁড় করিয়ে রাখা — যেন এক সারি বসার সিট। একটি ৬৪-bit register মানে হলো পাশাপাশি ৬৪টি flip-flop, যার প্রতিটা একেকটি ১ bit (০ বা ১) ধরে রাখে।

    বিশ্ববিদ্যালয়ে microprocessor course-এ AX, BX বা PC-এর মতো নাম শুনে register-কে কোনো রহস্যময় যন্ত্র মনে হতে পারে। কিন্তু আসল সত্য হলো, register কোনো জাদুর বাক্স নয় — এটা শুধু CPU-র নিজের খাতা, যেখানে সে এই মুহূর্তে যে ডেটা নিয়ে কাজ করছে, তা লিখে রাখে।

    CPU-র কাছে এখন হিসাবের জন্য ALU আছে, আর ডেটা রাখার জন্য register-ও আছে। কিন্তু এই ডেটা এক জায়গা থেকে আরেক জায়গায় যাবে কীভাবে?

    03

    Data bus, decoder, multiplexer: তথ্যের হাইওয়ে

    ব্যাখ্যা সহজ রাখার জন্য এখানে তিনটা কাল্পনিক register-এর নাম ধরা যাক — Register A, Register B, আর Register C। বাস্তব processor-এ এদের নাম অন্যরকম হয়, কিন্তু কাজের ধরন একই।

    CPU-র ভেতরের component-গুলোর মধ্যে ডেটা আদান-প্রদান করার জন্য একগুচ্ছ সংযোগ লাইন থাকে, যেগুলোকে একসাথে বলে data bus। সহজভাবে বললে, এটা CPU-র ভেতরের ডেটা চলাচলের হাইওয়ে। একটা ৬৪-bit CPU-তে data bus-এর width সাধারণত ৬৪ — মানে একই সময়ে ৬৪টা bit parallel-এ যাতায়াত করতে পারে।

    কিন্তু হাইওয়েতে যদি traffic control না থাকে, তবে কি বিশৃঙ্খলা হবে না? ধরুন CPU-র কাছে ৫টা register আছে, কিন্তু এই মুহূর্তে ALU-তে শুধু Register A আর Register B-র ডেটা পাঠানো দরকার — বাকি ৩টা register-এর ডেটা যেন ভুলবশত ALU-তে গিয়ে ঢুকে না পড়ে। এই নিয়ন্ত্রণের জন্য দুইটা বিশেষ circuit ব্যবহার করা হয়।

    Multiplexer (Mux) — এটি একটা traffic signal বা switch। এটি এমন একটা logic circuit যা একাধিক input line-এর মধ্যে যেকোনো একটাকে select করে সেটার ডেটা output-এ পাঠায়। একটা railway station-এর কথা ভাবুন: অনেকগুলো platform-এ ট্রেন দাঁড়িয়ে আছে। signal ছাড়া সবগুলো একসাথে ছেড়ে দিতে পারবে না — MUX হলো সেই signal, যা বলে দেয় এই মুহূর্তে শুধু Register A-এর ট্রেনটিই চলবে।

    Decoder — এটা বিল্ডিংয়ের security guard-এর মতো। এটা একটা binary address নেয় এবং ঠিক করে কোন দরজাটি খুলতে হবে। হিসাব শেষে ফলাফলটি যেন ভুল কোনো register-এ না গিয়ে কেবল Register C-তেই জমা হয়, তা এই decoder নিশ্চিত করে।

    CPU datapath — step 1/4
    step 1/4
    Register A2 · 0010Register B3 · 0011MUXALUbusRegister C?Decoderclock
    Register A-তে ২ (0010) আর Register B-তে ৩ (0011) voltage হিসেবে জমা আছে।
    CPU-র ভেতরের ডেটা ফ্লো: register → MUX → ALU → decoder → register। clock সব synchronize করে।

    Decoder আর multiplexer মিলে CPU ঠিক করে দেয় — এই মুহূর্তে কোন register থেকে ডেটা read হবে, আর ALU-র হিসাব শেষে ফলাফল কোন register-এ গিয়ে জমা হবে।

    কিন্তু এই পুরো circuit-এ কখন কোন ডেটা কোথায় যাবে, কখন ALU যোগ করবে, কখন register save করবে — সবার timing এক সুতোয় গাঁথবে কে?

    04

    Clock: CPU-র হার্টবিট

    CPU-র ভেতরে ডেটা চলাচলকে synchronize করার জন্য একটা oscillator থাকে, যা নির্দিষ্ট তালের ওপর ভিত্তি করে electrical pulse পাঠায় — এটাই clock। CPU-র সব component এই pulse-এর সাথে তাল মিলিয়ে কাজ করে।

    Clock-এর speed মাপা হয় GHz (gigahertz) এককে। আপনার processor-এর speed যদি ৩.০ GHz হয়, তার মানে clock প্রতি সেকেন্ডে ৩০০ কোটি বার pulse দিচ্ছে।

    একটা orchestra-র কথা ভাবুন। যদি প্রতিটা musician নিজের ইচ্ছামতো বাজানো শুরু করে, তবে সেটা music হবে না — বিশৃঙ্খলা হবে। কিন্তু conductor যখন হাত নাড়েন, সবাই একই মুহূর্তে বাজানো শুরু করে। Clock হলো সেই conductor। প্রতিটি tick-এর সাথে CPU-র flip-flop-গুলো নতুন value save করে, আর ডেটা পরের ধাপে এগিয়ে যায়।

    clock oscillator
    স্থিতিশীল — 3 GHz
    3.0 GHz
    প্রতি সেকেন্ডে ৩,০০,০০,০০,০০০ বার pulse — প্রতিটা flip-flop এই তালে নতুন value save করে।
    slider দিয়ে clock speed বাড়ান। ৫ GHz-এর উপরে circuit অস্থির হয়ে পড়ে।

    তাহলে clock speed যত বাড়াই, কম্পিউটার তত super-fast হয়ে যাবে? না। খুব বেশি speed দিলে transistor-গুলো অতিরিক্ত তাপ তৈরি করে, power খরচ বেড়ে যায়, আর শেষে circuit স্থিতিশীলভাবে কাজ করতে পারে না। আপাতত এটুকু জানলেই চলবে — clock হলো CPU-র সেই conductor, যার তালে তালে পুরো chip-এর কোটি কোটি transistor একসাথে march করে।

    ২ + ৩ = ৫: processor-এর ভেতরের সেই কয়েক ন্যানোসেকেন্ড

    এবার আমাদের জানা component-গুলো দিয়ে result = 2 + 3 হিসাবের পুরো যাত্রা একবার দেখে নেওয়া যাক:

    1. Register State: ২ এবং ৩ আগে থেকেই Register A আর Register B-তে voltage হিসেবে বসে আছে।
    2. Clock Tick ১: clock টিক দিল। সঙ্গে সঙ্গে Multiplexer সিগন্যাল দিলো — "Register A আর B, ALU-তে যেতে পারো।" Data Bus-এর মধ্য দিয়ে ২ আর ৩ চলে গেলো ALU-র input-এ।
    3. ALU-র কারসাজি: ALU-র ভেতর logic gate আর adder-গুলো মুহূর্তের মধ্যে ২ আর ৩-কে যোগ করে ৫ (0101) তৈরি করে ফেলল।
    4. Clock Tick ২: clock আবার টিক দিল। এইবার Decoder Register C-এর কানেকশন ওপেন করে দিল। ALU থেকে আসা ৫ voltage হিসেবে Register C-র flip-flop-এ গিয়ে স্থায়ীভাবে বসে পড়ল।

    কয়েক nanosecond-এর পুরো বিষয়টা। কোনো magic নেই — শুধু voltage-এর pattern, logic gate-এর arrangement, আর clock-এর tick।

    05

    সবকিছু এত সরল নয়

    এই আর্টিকেলে CPU-কে ইচ্ছাকৃতভাবে অনেক সহজ করে দেখানো হয়েছে।

    বাস্তব processor-এ pipeline, cache, branch prediction, out-of-order execution — এরকম আরও অনেক জটিল mechanism থাকে। একটা modern CPU একই সময়ে একাধিক instruction-এর বিভিন্ন stage handle করে, ভবিষ্যতে কী দরকার হবে সেটা আগেই অনুমান করে ডেটা load করে রাখে।

    কিন্তু সেই সব complexity এই মৌলিক কাঠামোর উপরই দাঁড়িয়ে। ALU, register, bus, clock — এই চারজন সবকিছুর মূল ভিত্তি।

    // এই আর্টিকেলে কী শিখলাম
    • CPU কখনো "গণিত বোঝে" না — logic gate-এর arrangement-ই তাকে যোগ-বিয়োগ করতে বাধ্য করে।
    • Register হলো CPU-র নিজের ডেস্ক — যা নিয়ে এই মুহূর্তে কাজ হচ্ছে, সেটা এখানেই থাকে। RAM অনেক দূরে।
    • Clock তাল ঠিক করে, গতি না — সবাই কখন কাজ শুরু করবে সেটা clock ঠিক করে দেয়। তালহীন CPU মানে corrupt CPU।
    • Bus হলো CPU-র হাইওয়ে; Mux আর decoder ট্রাফিক কন্ট্রোল — ঠিক ডেটা ঠিক জায়গায় পৌঁছানোর দায়িত্ব এদের।
    এই পাতা খোলার পর থেকে আপনার device-এ আনুমানিক ৬০০.৪ কোটি বার transistor switch হয়েছে।
    cd ~  # back to terminal