পাঠ ১৬ · ৫৬-এর মধ্যে · মডিউল ৪
Home / Courses / Operating Systems (OS) / Amdahl's Law

Amdahl's Law ও প্যারালাল স্পিডআপ

Amdahl's Law & parallel speedup
৮ মিনিট পড়া মধ্যম · Intermediate Python কোডসহ সম্পূর্ণ বাংলায়

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

  • Amdahl's Law-এর সূত্র এবং এটি ঠিক কী প্রশ্নের উত্তর দেয়
  • S=0.25, N=4-এর জন্য প্রকৃত স্পিডআপ হাতে-কলমে ও কোড দিয়ে যাচাই করা
  • প্রসেসর সংখ্যা বাড়ানোর সাথে সাথে স্পিডআপ কীভাবে একটি সীমার দিকে অগ্রসর হয় ($N \to \infty$)
  • কেন সিকোয়েন্সিয়াল/ক্রিটিক্যাল-সেকশন অংশ কমানো (M5-এর প্রসঙ্গ) কোর সংখ্যা বাড়ানোর চেয়ে বেশি গুরুত্বপূর্ণ
  • Python দিয়ে amdahl_speedup() ফাংশন বাস্তবায়ন ও একাধিক N-এর জন্য যাচাই

১ · Amdahl's Law কী

Amdahl's LawAmdahl's Lawএকটি প্রোগ্রামকে একাধিক প্রসেসরে প্যারালালাইজ করে সর্বোচ্চ সম্ভাব্য স্পিডআপ পরিমাপ করার সূত্র, যেখানে প্রোগ্রামের একটি অংশ অনিবার্যভাবে সিকোয়েন্সিয়াল থাকে। পরিমাপ করে দেয় একটি প্রোগ্রামকে প্যারালালাইজ করে সর্বোচ্চ কতটুকু স্পিডআপ পাওয়া সম্ভব — যদি সেই প্রোগ্রামের একটি অংশ অনিবার্যভাবে সিকোয়েন্সিয়াল থাকে (যত প্রসেসরই যোগ করা হোক না কেন, সেই অংশ প্যারালাল করা যায় না)। এটি সরাসরি M5-এর ক্রিটিক্যাল সেকশন ধারণার সাথে যুক্ত — একটি প্রোগ্রামের ক্রিটিক্যাল সেকশনে একবারে মাত্র একটি থ্রেড ঢুকতে পারে, তাই সেই অংশটুকু কার্যত সিকোয়েন্সিয়াল।

যদি $S$ হয় প্রোগ্রামের সিকোয়েন্সিয়াল (অ-প্যারালালাইজযোগ্য) ভগ্নাংশ এবং $N$ হয় প্রসেসরের সংখ্যা, তাহলে —

$$\text{speedup} = \frac{1}{S + \dfrac{1-S}{N}}$$

অর্থাৎ মোট সময়ের $S$ অংশ কখনও ছোট হয় না (যত প্রসেসর যোগ করা হোক), আর বাকি $(1-S)$ অংশ $N$টি প্রসেসরের মধ্যে ভাগ হয়ে যায়।

২ · Worked Example — S=0.25, N=4

ধরা যাক একটি প্রোগ্রামের ২৫% ($S=0.25$) সিকোয়েন্সিয়াল, এবং আমরা ৪টি প্রসেসর ($N=4$) ব্যবহার করছি। হাতে-কলমে হিসাব — $\frac{1-S}{N} = \frac{0.75}{4} = 0.1875$, তাই $S + \frac{1-S}{N} = 0.25 + 0.1875 = 0.4375$, এবং $\text{speedup} = \frac{1}{0.4375} \approx 2.286$x। লক্ষ্য করুন — ৪টি প্রসেসর ব্যবহার করেও স্পিডআপ ৪x নয়, মাত্র প্রায় ২.২৮৬x — কারণ সেই অনিবার্য ২৫% সিকোয়েন্সিয়াল অংশ একটি বটলনেক হয়ে থেকেই যায়।

N = 1 মোট সময় = ৫০০ N = 4 মোট সময় ≈ ১৯৭ (speedup ≈ 2.29x) N = 16 মোট সময় ≈ ১৩৩ (speedup ≈ 3.37x) গাঢ় (লাল) অংশ = সিকোয়েন্সিয়াল S -- N যতই বাড়ুক, এই অংশের প্রস্থ কখনও কমে না
সিকোয়েন্সিয়াল অংশ (লাল) স্থির থাকে, প্যারালাল অংশ (নীল) N বাড়ার সাথে সংকুচিত হয় — কিন্তু মোট সময় কখনও লাল অংশের নিচে নামে না।

৩ · প্রসেসর বাড়ালে কী হয় — একটি হার্ড সীলিং

$N \to \infty$ হলে $\frac{1-S}{N} \to 0$, তাই speedup $\to \frac{1}{S}$ — একটি কঠিন সীলিং (hard ceiling) যা যতই প্রসেসর যোগ করা হোক না কেন কখনও অতিক্রম করা যায় না। $S=0.25$-এর জন্য এই সীলিং $\frac{1}{0.25} = 4$x — অর্থাৎ এই প্রোগ্রামটি কখনওই ৪x-এর বেশি স্পিডআপ পাবে না, এমনকি অসীম সংখ্যক প্রসেসর দিলেও নয়। এটি একটি গুরুত্বপূর্ণ, প্রায়ই বিস্ময়কর বাস্তবতা।

এই কারণেই সিকোয়েন্সিয়াল অংশ কমানো বেশি গুরুত্বপূর্ণ

যদি লক্ষ্য হয় আরও বেশি স্পিডআপ পাওয়া, শুধু আরও প্রসেসর যোগ করা যথেষ্ট নয় — কারণ $N$ যত বড়ই হোক, $S$ যদি একই থাকে, স্পিডআপ $1/S$-এর কাছাকাছি গিয়ে আটকে যাবে। বাস্তব উন্নতি আসে $S$ নিজেকে ছোট করা থেকে — অর্থাৎ M5-এর ক্রিটিক্যাল সেকশনে কাটানো সময় কমানো, বা প্রোগ্রামের আরও বেশি অংশকে প্যারালালাইজযোগ্য করে তোলা।

৪ · কোড দিয়ে যাচাই

নিচের কোড সেলে amdahl_speedup() ফাংশনটি বাস্তবায়ন করা হয়েছে এবং উপরের worked example-সহ N=8, N=100, N=1,000,000-এর জন্যও গণনা করে দেখানো হয়েছে স্পিডআপ কীভাবে ধীরে ধীরে ৪x-এর কাছাকাছি যায়, কিন্তু কখনওই তা অতিক্রম করে না।

Python
# Amdahl's Law -- বাস্তব সূত্র, প্রকৃত গণনা (toy simulation নয়, এটি সরাসরি গাণিতিক সূত্র)
def amdahl_speedup(sequential_fraction, num_processors):
    S = sequential_fraction
    N = num_processors
    parallel_fraction = 1 - S
    return 1 / (S + parallel_fraction / N)

S = 0.25  # ২৫% অংশ অনিবার্যভাবে সিকোয়েন্সিয়াল (যেমন M5-এর ক্রিটিক্যাল সেকশন)

print("--- মূল worked example: S=0.25, N=4 ---")
speedup_4 = amdahl_speedup(S, 4)
print(f"speedup = {speedup_4:.3f}x  (প্রত্যাশিত ≈ 2.286x, 4x নয়!)")

print("\n--- প্রসেসর সংখ্যা বাড়ালে কী হয় (একই S=0.25) ---")
for n in [4, 8, 16, 100, 1_000_000]:
    s = amdahl_speedup(S, n)
    print(f"N = {n:>10,} -> speedup = {s:.6f}x")

ceiling = 1 / S
print(f"\nহার্ড সীলিং (N -> ∞): 1/S = {ceiling:.3f}x -- যতই প্রসেসর যোগ করি, এই সীমা কখনও পার হবে না।")

    
লক্ষ্য করুন — N=4 থেকে N=100 পর্যন্ত speedup ২.২৮৬x থেকে ৩.৮৮x-এ ওঠে (একটি বাস্তব উন্নতি), কিন্তু N=100 থেকে N=1,000,000 পর্যন্ত speedup মাত্র ৩.৮৮x থেকে ৩.৯৯৯৯x-এ ওঠে — বিশাল সংখ্যক অতিরিক্ত প্রসেসর যোগ করেও প্রায় কোনো বাড়তি লাভ নেই, কারণ আমরা ইতিমধ্যে $1/S=4$x সীলিংয়ের খুব কাছাকাছি পৌঁছে গেছি।
মূল কথা · Key takeaway

Amdahl's Law একটি সোজা কিন্তু প্রায়ই উপেক্ষিত সত্য বলে — প্যারালালিজম থেকে লাভ পাওয়ার একটি সীমা আছে, এবং সেই সীমা নির্ধারণ করে দেয় প্রোগ্রামের সিকোয়েন্সিয়াল অংশ, প্রসেসরের সংখ্যা নয়। এটি সরাসরি বলে দেয় কেন M5-এর সিনক্রোনাইজেশন মডিউলে ক্রিটিক্যাল সেকশন যতটা সম্ভব ছোট রাখা এত গুরুত্বপূর্ণ — একটি বড় ক্রিটিক্যাল সেকশন মানে একটি বড় $S$, যা সরাসরি সর্বোচ্চ সম্ভাব্য স্পিডআপকে সীমাবদ্ধ করে দেয়।

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

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

প্র ০১ N=4 প্রসেসর ব্যবহার করেও স্পিডআপ ৪x না হয়ে মাত্র ≈2.286x হলো কেন — সূত্রের কোন অংশ এটি ব্যাখ্যা করে?

সূত্রে $S=0.25$ অংশ কখনও $N$ দিয়ে ভাগ হয় না — এটি প্রতিটি প্রসেসর সংখ্যাতেই অপরিবর্তিত ২৫% হিসেবে থেকে যায়। শুধুমাত্র $(1-S)=0.75$ অংশটুকুই $N=4$ দিয়ে ভাগ হয়ে $0.1875$ হয়। তাই মোট "সময়" $0.25+0.1875=0.4375$ — মূল সময়ের অর্ধেকেরও কম নয়, তাই স্পিডআপ ($1/0.4375$) ৪x-এর অনেক নিচে, প্রায় ২.২৮৬x-এ থেমে যায়।

প্র ০২ N=100 থেকে N=1,000,000 করলে স্পিডআপ প্রায় একই রকম থেকে যায় কেন — এত বেশি প্রসেসর যোগ করেও প্রায় কোনো লাভ হয় না?

N=100-তেই $\frac{1-S}{N} = \frac{0.75}{100} = 0.0075$, যা ইতিমধ্যে $S=0.25$-এর তুলনায় খুবই ছোট — তাই মোট "সময়" ইতিমধ্যে প্রায় $S$-এর কাছাকাছি ($0.2575$)। N আরও ১০,০০০ গুণ বাড়িয়ে ১০ লাখ করলেও, $\frac{0.75}{N}$ আরও ছোট (প্রায় শূন্যের কাছাকাছি) হবে, কিন্তু $S=0.25$ তো আর ছোট হবে না — তাই মোট সময় প্রায় $0.25$-এর কাছাকাছিই থেকে যায়, এবং স্পিডআপ প্রায় $1/0.25=4$x-এর কাছাকাছি আটকে থাকে।

প্র ০৩ যদি একটি প্রোগ্রামের সিকোয়েন্সিয়াল অংশ $S=0.5$ (৫০%) হয়, প্রসেসর সংখ্যা যতই বাড়ানো হোক, সর্বোচ্চ সম্ভাব্য স্পিডআপ কত হবে?

হার্ড সীলিং $1/S$ অনুযায়ী, $S=0.5$ হলে সর্বোচ্চ সম্ভাব্য স্পিডআপ $1/0.5 = 2$x — অর্থাৎ যত প্রসেসরই যোগ করা হোক না কেন, এই প্রোগ্রামটি কখনওই ২x-এর বেশি দ্রুত চলবে না। এটি স্পষ্টভাবে দেখায় কেন $S$ কমানো (প্রোগ্রামের আরও বেশি অংশ প্যারালালাইজযোগ্য করে তোলা) কেন প্রসেসর সংখ্যা বাড়ানোর চেয়ে অনেক বেশি গুরুত্বপূর্ণ একটি অপ্টিমাইজেশন লক্ষ্য।

অনুশীলন

  1. চিন্তা করুন: আপনি যদি একটি প্রোগ্রাম অপ্টিমাইজ করতে চান এবং তার $S=0.1$ (১০%), আপনার কি আরও প্রসেসর কেনায় বিনিয়োগ করা উচিত নাকি সিকোয়েন্সিয়াল কোড কমানোয়?

    $S=0.1$-এর হার্ড সীলিং হলো $1/0.1=10$x — তাই যদি আপনি ইতিমধ্যে N=100 বা তার বেশি প্রসেসর ব্যবহার করছেন ($\frac{1-S}{N}$ ইতিমধ্যে খুব ছোট), আরও প্রসেসর কেনা প্রায় কোনো বাড়তি লাভ দেবে না — বরং $S$ আরও কমিয়ে আনতে পারলে (যেমন $S=0.05$ করলে সীলিং হয়ে যাবে ২০x) অনেক বড় বাস্তব উন্নতি সম্ভব। তাই কম $N$-এ থাকলে প্রসেসর বাড়ানো লাভজনক, কিন্তু বড় $N$-এ $S$ কমানোই একমাত্র বাস্তব পথ।

  2. পরীক্ষা করুন: উপরের কোড সেলে S = 0.25-কে S = 0.1 করে Run চেপে দেখুন N=4 ও হার্ড সীলিং কীভাবে বদলায়।

    $S=0.1$, $N=4$ হলে $\frac{1-S}{N}=\frac{0.9}{4}=0.225$, মোট $=0.1+0.225=0.325$, speedup $=1/0.325\approx3.077$x — আগের ২.২৮৬x-এর চেয়ে অনেক বেশি, কারণ সিকোয়েন্সিয়াল অংশ এখন ছোট। আর হার্ড সীলিং হবে $1/0.1=10.000$x — আগের ৪x সীলিংয়ের চেয়ে অনেক বেশি বড়, স্পষ্টভাবে দেখায় ছোট $S$ কতটা বেশি স্পিডআপ-সম্ভাবনা খুলে দেয়।

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

পূর্ববর্তী পাঠ
মাল্টিথ্রেডিং মডেল