পাঠ ৩২ · ৫৭-এর মধ্যে · মডিউল ৭
Home / Courses / Computer Architecture & Digital Logic / পাইপলাইনিং বেসিকস

পাইপলাইনিং বেসিকস — কনসেপ্ট ও স্পিডআপ

Pipelining basics — concept & speedup
৮ মিনিট পড়া মধ্যম · Intermediate Python কোডসহ সম্পূর্ণ বাংলায়

এই পাঠে যা শিখবেন

  • পাইপলাইনিং কী, এবং এটি ঠিক কীভাবে M6/L31-এর মাল্টি-সাইকেল স্টেজ ডিজাইনকে নতুনভাবে ব্যবহার করে
  • K+N-1 বনাম K×N সম্পন্ন-হওয়ার-সময় সূত্র এবং এই পার্থক্যের প্রকৃত তাৎপর্য
  • স্পিডআপ সূত্র এবং N বাড়ালে তা কীভাবে K-এর কাছাকাছি যায় (কিন্তু কখনও পৌঁছায় না) — কোড দিয়ে যাচাই
  • কেন বাস্তবে এই আদর্শ স্পিডআপ সবসময় অর্জিত হয় না — M7-এর বাকি পাঠগুলোর একটি প্রিভিউ

১ · পাইপলাইনিং কী

M6/L31-এ দেখেছেন কীভাবে একটি ইনস্ট্রাকশনের এক্সিকিউশনকে কয়েকটি ছোট স্টেজে ভাগ করা যায় — Fetch (IF), Decode (ID), Execute (EX), Memory (MEM), Write-back (WB)। মাল্টি-সাইকেল ডিজাইনে একটি ইনস্ট্রাকশন এই স্টেজগুলো একটার পর একটা পার হয়, তারপরই পরের ইনস্ট্রাকশন শুরু হয়। পাইপলাইনিংPipeliningএকই স্টেজ ব্রেকডাউন ব্যবহার করে, কিন্তু প্রতিটি স্টেজ প্রতি সাইকেলে ভিন্ন একটি ইনস্ট্রাকশন নিয়ে কাজ করে — একাধিক ইনস্ট্রাকশন একসাথে "ইন-ফ্লাইট" থাকে। এই ধারণাটি বদলে দেয় — একটি ইনস্ট্রাকশন EX স্টেজে থাকা অবস্থাতেই পরের ইনস্ট্রাকশন ID স্টেজে, আর তার পরেরটা IF স্টেজে থাকতে পারে, সব একই সাইকেলে।

সরাসরি বাস্তব-জীবনের উপমা: একটি কারখানার অ্যাসেম্বলি লাইন। একটি গাড়ি সম্পূর্ণভাবে তৈরি হওয়ার আগে পরের গাড়ির কাজ শুরু হওয়ার জন্য অপেক্ষা করা হয় না — একই সময়ে ভিন্ন গাড়ি ভিন্ন স্টেশনে (পেইন্টিং, ইঞ্জিন বসানো, চাকা লাগানো) কাজ চলতে থাকে। প্রতিটি স্টেশন সবসময় ব্যস্ত থাকে, শুধু ভিন্ন গাড়ি নিয়ে।

সাইকেল → ১ ২ ৩ ৪ ৫ ৬ ৭ ৮ I1 I2 I3 I4 IF ID EX MEM WB IF ID EX MEM WB IF ID EX MEM WB IF ID EX MEM WB
৫-স্টেজ (K=5) পাইপলাইনে ৪টি (N=4) ইনস্ট্রাকশন মাত্র ৮ সাইকেলে (K+N-1) সম্পন্ন হয় — সিকোয়েনশিয়াল হলে লাগত ২০ সাইকেল (K×N)।

২ · আদর্শ সম্পন্ন-হওয়ার-সময় ও স্পিডআপ সূত্র

একটি K-স্টেজ পাইপলাইনে N-টি ইনস্ট্রাকশন প্রসেস করলে, প্রথম ইনস্ট্রাকশনটি সব K স্টেজ পার হতে লাগে K সাইকেল, আর বাকি (N-1) টি ইনস্ট্রাকশন প্রতি সাইকেলে একটি করে যোগ হয়ে সম্পন্ন হয় — তাই মোট সময়:

$$\text{pipeline\_cycles} = K + N - 1$$

অথচ সম্পূর্ণ সিকোয়েনশিয়াল (নন-পাইপলাইনড) এক্সিকিউশনে প্রতিটি ইনস্ট্রাকশন সব K স্টেজ শেষ করার পরই পরেরটি শুরু হয়, তাই মোট সময়:

$$\text{sequential\_cycles} = K \times N$$

এই দুইয়ের অনুপাতই স্পিডআপ —

$$\text{speedup} \approx \frac{K \times N}{K + N - 1}$$

N যখন খুব বড় হয় ($N \to \infty$), তখন $K+N-1 \approx N$, তাই speedup $\approx \frac{K \times N}{N} = K$ — অর্থাৎ স্পিডআপ ধীরে ধীরে K-এর কাছাকাছি যায়, কিন্তু N যতই বড় হোক, কখনও ঠিক K-এর সমান হয় না (এই আচরণটি M7-এর পরের পাঠগুলো পড়ার আগে ঠিক Operating Systems কোর্সের Amdahl's Law পাঠের asymptotic আচরণের সাথে খুবই মিল)।

সিকোয়েনশিয়াল এক্সিকিউশন
প্রতিটি ইনস্ট্রাকশন সব স্টেজ শেষ করার পরই পরেরটি শুরু হয় — মোট সময় K×N, N বাড়লে সময় সরলরৈখিকভাবে বাড়ে।
পাইপলাইনড এক্সিকিউশন
সব স্টেজ প্রতি সাইকেলে ব্যস্ত থাকে, ভিন্ন ইনস্ট্রাকশন নিয়ে — মোট সময় মাত্র K+N-1, N বাড়লেও প্রায় N-এর সমান থাকে।

৩ · কোড দিয়ে যাচাই — N=4, 10, 100

নিচের কোড সেলে pipeline_completion_cycles() ও sequential_completion_cycles() বাস্তবায়ন করে K=5 (একটি বাস্তবসম্মত ৫-স্টেজ পাইপলাইন) ধরে N=4, 10, 100-এর জন্য প্রকৃত স্পিডআপ গণনা করা হয়েছে।

Python
# পাইপলাইন স্পিডআপ -- প্রকৃত গাণিতিক সূত্র, প্রকৃত গণনা
def pipeline_completion_cycles(k_stages, n_instructions):
    """K-স্টেজ পাইপলাইনে N ইনস্ট্রাকশন সম্পন্ন হতে লাগে K+N-1 সাইকেল"""
    return k_stages + n_instructions - 1

def sequential_completion_cycles(k_stages, n_instructions):
    """সম্পূর্ণ সিকোয়েনশিয়াল (নন-পাইপলাইনড) এক্সিকিউশনে লাগে K*N সাইকেল"""
    return k_stages * n_instructions

K = 5  # IF, ID, EX, MEM, WB

print(f"{'N':>5} | {'সিকোয়েনশিয়াল (K*N)':>20} | {'পাইপলাইনড (K+N-1)':>20} | {'Speedup':>10}")
print("-" * 65)
for n in (4, 10, 100):
    seq = sequential_completion_cycles(K, n)
    pipe = pipeline_completion_cycles(K, n)
    speedup = seq / pipe
    print(f"{n:>5} | {seq:>20} | {pipe:>20} | {speedup:>9.4f}x")

print(f"\nK={K} স্টেজের পাইপলাইনে N -> ∞ হলে speedup-এর সীমা: {K}x -- কখনও পৌঁছায় না, শুধু কাছাকাছি যায়।")

# নিশ্চিত করা: N বাড়ার সাথে সাথে speedup একঘেয়েভাবে K-এর কাছাকাছি যায়, কিন্তু কখনও K স্পর্শ করে না
speedups = [sequential_completion_cycles(K, n) / pipeline_completion_cycles(K, n) for n in (4, 10, 100)]
assert speedups[0] < speedups[1] < speedups[2] < K
print(f"যাচাই সম্পন্ন: {speedups[0]:.4f}x < {speedups[1]:.4f}x < {speedups[2]:.4f}x < {K}x")

    
লক্ষ্য করুন — N=4-এ speedup মাত্র ২.৫x, N=10-এ ৩.৫৭x, N=100-এ ৪.৮১x। প্রতিবার N অনেক বড় হচ্ছে, কিন্তু speedup কখনওই ৫x-এ পৌঁছায় না — শুধু ধীরে ধীরে কাছাকাছি যায়, ঠিক যেভাবে Amdahl's Law-এ speedup কখনও হার্ড সীলিং অতিক্রম করে না।

৪ · কেন এই আদর্শ বাস্তবে পুরোপুরি অর্জিত হয় না

উপরের K+N-1 সূত্রটি একটি আদর্শ, হ্যাজার্ড-মুক্ত পরিস্থিতি ধরে নেয় — প্রতিটি স্টেজ প্রতিটি সাইকেলে নির্বিঘ্নে কাজ করে যায়। বাস্তবে তিন ধরনের হ্যাজার্ডHazardএমন পরিস্থিতি যেখানে পরের ইনস্ট্রাকশন প্রত্যাশিত সাইকেলে তার স্টেজ শুরু করতে পারে না — ফলে পাইপলাইন থামাতে বা "বাবল" ঢোকাতে হয়। এই আদর্শ ওভারল্যাপে বাধা দেয় —

  • স্ট্রাকচারাল হ্যাজার্ড — দুটি স্টেজের একই হার্ডওয়্যার রিসোর্স দরকার (পরের পাঠ, L33)।
  • ডেটা হ্যাজার্ড — একটি ইনস্ট্রাকশনের দরকারি মান আগের ইনস্ট্রাকশন তখনও লেখেনি (L34)।
  • কন্ট্রোল হ্যাজার্ড — একটি ব্রাঞ্চের ফলাফল না জানা পর্যন্ত পরের ইনস্ট্রাকশন কোনটা তা অনিশ্চিত (L35)।
মূল কথা · Key takeaway

পাইপলাইনিং একই হার্ডওয়্যার দিয়ে থ্রুপুট (একক সময়ে কতগুলো ইনস্ট্রাকশন সম্পন্ন হয়) নাটকীয়ভাবে বাড়ায়, শুধু স্টেজগুলো ওভারল্যাপ করে চালিয়ে — কোনো নতুন সার্কিট লজিক ছাড়াই। কিন্তু K+N-1-এর আদর্শ স্পিডআপ শুধু তখনই মেলে যখন কোনো হ্যাজার্ড না ঘটে — M7-এর বাকি পাঠগুলো ঠিক দেখাবে বাস্তবে কীভাবে এই হ্যাজার্ডগুলো ঘটে এবং কীভাবে হার্ডওয়্যার সেগুলো সামলায়।

ভাবনার প্রশ্ন

প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।

প্র ০১ N=4 ইনস্ট্রাকশনে স্পিডআপ মাত্র ২.৫x, কিন্তু N=100-এ ৪.৮x — পাইপলাইনিং কি বেশি ইনস্ট্রাকশন থাকলে "বেশি কার্যকর" হয়?

হ্যাঁ, ঠিক এটাই সূত্র থেকে বোঝা যায়। K+N-1-এর "-1"-এর মূল্য (K স্টেজ ভরাট হতে যে "warm-up" সময় লাগে) ছোট N-এর তুলনায় বড় একটি ভগ্নাংশ — N=4-এ K=5 অনেক বড় তুলনামূলকভাবে। N বড় হলে সেই warm-up খরচ মোট সময়ের একটি ক্ষুদ্র ভগ্নাংশে পরিণত হয়, তাই speedup K-এর কাছাকাছি চলে যায়। বাস্তবে প্রোগ্রামে হাজার হাজার ইনস্ট্রাকশন চলে, তাই এই warm-up খরচ প্রায় অগ্রাহ্য।

প্র ০২ যদি K=10 স্টেজের একটি (গভীরতর) পাইপলাইন ব্যবহার করা হয়, N একই রাখলে স্পিডআপ কি বাড়বে?

হ্যাঁ, সূত্র অনুযায়ী সর্বোচ্চ সম্ভাব্য স্পিডআপ (N→∞ সীমা) সরাসরি K-এর সমান, তাই K=10 স্টেজে সর্বোচ্চ সীমা ১০x, K=5-এর ৫x-এর দ্বিগুণ। কিন্তু বাস্তবে গভীরতর পাইপলাইন মানে বেশি স্টেজ, এবং বেশি স্টেজ মানে সাধারণত বেশি হ্যাজার্ড-সংবেদনশীলতা (যেমন ব্রাঞ্চ মিসপ্রেডিকশনের পেনাল্টি আরও বেশি সাইকেল হয়ে যায়, L35-এ দেখা যাবে) — তাই আদর্শ সীমা বাড়লেও, বাস্তব অর্জিত স্পিডআপ ততটা নাও বাড়তে পারে।

প্র ০৩ K+N-1 সূত্রটি কি ধরে নেয় প্রতিটি ইনস্ট্রাকশন ঠিক একই সংখ্যক স্টেজ ব্যবহার করবে? M6/L31-এর মাল্টি-সাইকেল ডিজাইনের সাথে এটি কীভাবে মেলে?

হ্যাঁ — ক্লাসিক পাইপলাইন মডেলে প্রতিটি ইনস্ট্রাকশন একই K-স্টেজ পথ দিয়ে যায় (এমনকি যেসব স্টেজ তার দরকার নেই, সেগুলোও "নো-অপ"-এর মতো পার হয়), যাতে সব ইনস্ট্রাকশন সমানভাবে ওভারল্যাপ করতে পারে। এটি M6/L31-এর মাল্টি-সাইকেল ডিজাইনের চেয়ে ভিন্ন — সেখানে R-type ইনস্ট্রাকশন MEM স্টেজ সম্পূর্ণ স্কিপ করে দ্রুত শেষ করত। পাইপলাইনিংয়ে এই "স্কিপিং" আর সম্ভব না, কারণ প্রতিটি স্টেজের একটি নির্দিষ্ট স্লট প্রয়োজন যাতে পরের ইনস্ট্রাকশনগুলোর সাথে ওভারল্যাপ সঠিকভাবে ঘটে।

অনুশীলন

  1. চিন্তা করুন: একটি K=4-স্টেজ পাইপলাইনে N=1,000 ইনস্ট্রাকশন প্রসেস করলে speedup আনুমানিক কত হবে (হাতে-কলমে অনুমান করুন, তারপর নিচের কোড সেলে যাচাই করুন)?

    N=1,000 অনেক বড় হওয়ায় $K+N-1 \approx N$, তাই speedup $\approx \frac{K \times N}{N} = K = 4$x — প্রায় পুরোপুরি ৪x-এর কাছাকাছি (প্রকৃত মান $\frac{4 \times 1000}{4+1000-1} = \frac{4000}{1003} \approx 3.988$x, যা ৪x-এর অত্যন্ত কাছাকাছি কিন্তু কখনও ঠিক ৪x নয়)।

  2. পরীক্ষা করুন: উপরের কোড সেলে K = 5-কে K = 8 করে Run চাপুন — N=4-এর জন্য speedup কীভাবে বদলায়, এবং কেন ছোট N-এ গভীরতর পাইপলাইন থেকে খুব বেশি লাভ হয় না তা ব্যাখ্যা করুন।

    K=8, N=4 হলে speedup $= \frac{8 \times 4}{8+4-1} = \frac{32}{11} \approx 2.909$x — K=5-এর তুলনায় ($2.5$x) সামান্য বেশি, কিন্তু গভীরতর পাইপলাইনের তাত্ত্বিক সীলিং (৮x) থেকে অনেক দূরে। কারণ N=4 ছোট হওয়ায় পাইপলাইন কখনও পুরোপুরি "ভরাট" হওয়ার সুযোগই পায় না — শেষ ইনস্ট্রাকশন IF করার আগেই প্রথমটি প্রায় শেষ হয়ে যায়, তাই বেশি স্টেজ যোগ করলে warm-up খরচই বেশি বাড়ে, প্রকৃত ওভারল্যাপ লাভ নয়।

আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ

পূর্ববর্তী পাঠ
মাল্টি-সাইকেল ডেটাপাথ