পাঠ ৫০ · ৫৭-এর মধ্যে · মডিউল ১১
Home / Courses / Computer Architecture & Digital Logic / ফ্লিনস ট্যাক্সোনমি

ফ্লিনস ট্যাক্সোনমি — SISD, SIMD, MISD, MIMD

Flynn's taxonomy — SISD, SIMD, MISD & MIMD
৮ মিনিট পড়া উচ্চ · Advanced Python কোডসহ সম্পূর্ণ বাংলায়

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

  • Flynn's Taxonomy-এর দুটি স্বাধীন অক্ষ এবং তা থেকে তৈরি চারটি ক্যাটাগরি
  • SISD — এতদিন এই কোর্সে ইমপ্লিসিটলি ধরে নেওয়া ঐতিহ্যবাহী একক-কোর মডেল
  • SIMD — একটি ইনস্ট্রাকশন একসাথে একাধিক ডেটা এলিমেন্টে প্রয়োগ, এবং কোডে প্রকৃত ইনস্ট্রাকশন-সংখ্যার পার্থক্য
  • MISD ও MIMD — বিরল কিন্তু গুরুত্বপূর্ণ ক্যাটাগরি, এবং MIMD কীভাবে মাল্টিকোরের ভিত্তি

১ · Flynn's Taxonomy — দুই অক্ষ, চার ক্যাটাগরি

এখন পর্যন্ত এই কোর্সে (M5-M10) CPU নিয়ে যা কিছু আলোচনা হয়েছে — সিঙ্গেল-সাইকেল ডেটাপাথ, পাইপলাইন, ক্যাশ, বাস — সবই একটি অন্তর্নিহিত ধারণার ওপর দাঁড়িয়ে ছিল: একটিমাত্র CPU একটিমাত্র ইনস্ট্রাকশন স্ট্রিম চালায়, একটিমাত্র ডেটা স্ট্রিমের ওপর কাজ করে। কিন্তু বাস্তব আধুনিক হার্ডওয়্যার এই মডেলের বাইরেও যায়। Flynn's Taxonomy (১৯৬৬ সালে মাইকেল ফ্লিন প্রস্তাবিত একটি ক্লাসিক শ্রেণীবিন্যাস) দুটি স্বাধীন প্রশ্নের ভিত্তিতে যেকোনো আর্কিটেকচারকে চারটি ক্যাটাগরিতে ভাগ করে —

  • ইনস্ট্রাকশন স্ট্রিম: একটিমাত্র (Single) না একাধিক (Multiple)?
  • ডেটা স্ট্রিম: একটিমাত্র (Single) না একাধিক (Multiple)?
SISD
Single Instruction, Single Data — ঐতিহ্যবাহী একক-কোর CPU মডেল, একটি ইনস্ট্রাকশন স্ট্রিম একটি ডেটা স্ট্রিমে কাজ করে। এই কোর্সের M5-M10 পর্যন্ত সবকিছুর ভিত্তি।
SIMD
Single Instruction, Multiple Data — একটি ইনস্ট্রাকশন সমান্তরালভাবে একাধিক ডেটা এলিমেন্টে প্রয়োগ হয়। CPU ভেক্টর এক্সটেনশন ও GPU-এর ভিত্তি।
MISD
Multiple Instruction, Single Data — বাস্তবে বিরল, বিশেষায়িত ফল্ট-টলারেন্ট সিস্টেমে দেখা যায় (একই ডেটার ওপর একাধিক ভিন্ন কম্পিউটেশন চালিয়ে রিডান্ডেন্সি চেক করা)।
MIMD
Multiple Instruction, Multiple Data — একাধিক স্বাধীন ইনস্ট্রাকশন স্ট্রিম, প্রতিটি নিজস্ব ডেটাতে কাজ করে। মাল্টিকোর CPU ও ডিস্ট্রিবিউটেড/ক্লাস্টার কম্পিউটিং-এর সাধারণ মডেল।

২ · SISD — এই কোর্সের অন্তর্নিহিত ধারণা

স্পষ্টভাবে বলা দরকার: L28-এর সিঙ্গেল-সাইকেল ডেটাপাথ, L32-L36-এর পাইপলাইনিং, L37-L42-এর ক্যাশ — এই সবকিছুই ইমপ্লিসিটলি SISD ছিল। একটিমাত্র ইনস্ট্রাকশন স্ট্রিম একটিমাত্র ডেটা স্ট্রিমে কাজ করছিল, তা সে পাইপলাইনড হোক বা না হোক। SISD-কে "মৌলিক" মডেল ধরে নেওয়া হয়েছিল যাতে বাকি সব ধারণা পরিষ্কারভাবে শেখানো যায়।

৩ · SIMD — একটি ইনস্ট্রাকশন, একাধিক ডেটা

SIMD-তে একটিমাত্র ইনস্ট্রাকশন সিমালটেনিয়াসলি একাধিক ডেটা এলিমেন্টে প্রয়োগ হয় — যেমন দুটি ৪-সংখ্যার অ্যারে এলিমেন্ট-বাই-এলিমেন্ট যোগ করতে হলে, SISD-তে ৪টি আলাদা "add" ইনস্ট্রাকশন লাগবে, কিন্তু SIMD হার্ডওয়্যারে একটিমাত্র "ভেক্টর add" ইনস্ট্রাকশনই যথেষ্ট, কারণ হার্ডওয়্যারের ভেতরে সমান্তরাল ALU লেইন থাকে যা একই ক্লক সাইকেলে সব এলিমেন্ট প্রসেস করে। বাস্তব উদাহরণ: CPU-র ভেক্টর এক্সটেনশন (SSE, AVX) এবং, আরও বড় স্কেলে, GPU আর্কিটেকচার (L53-এ বিস্তারিত)।

৪ · MISD — বিরল কিন্তু বাস্তব

MISD বাস্তবে খুবই কম দেখা যায় — একাধিক ভিন্ন ইনস্ট্রাকশন স্ট্রিম একই ডেটার ওপর কাজ করে। মূলত বিশেষায়িত ফল্ট-টলারেন্ট সিস্টেমে ব্যবহৃত হয়, যেখানে একই ইনপুট ডেটার ওপর একাধিক ভিন্ন কম্পিউটেশন চালিয়ে ফলাফল মিলিয়ে দেখা হয় (রিডান্ডেন্সি চেক) — যেমন এভিয়েশন বা মহাকাশ-শিল্পের অত্যন্ত-নির্ভরযোগ্য সিস্টেমে।

৫ · MIMD — মাল্টিকোরের ভিত্তি

MIMD-তে একাধিক স্বাধীন ইনস্ট্রাকশন স্ট্রিম, প্রতিটি নিজস্ব ডেটাতে কাজ করে — একে অপরের থেকে সম্পূর্ণ আলাদা কাজ করতে পারে, একই সাথে। এটাই মাল্টিকোর CPU-র সাধারণ মডেল (পরের পাঠ, L51, এই ধারণাকে বিস্তারিতভাবে দেখাবে) এবং ডিস্ট্রিবিউটেড/ক্লাস্টার কম্পিউটিং-এরও ভিত্তি।

নিচের কোড সেলে SISD আর SIMD-এর মধ্যে প্রকৃত পার্থক্যটি কনক্রিটভাবে দেখা যাক — দুটি পদ্ধতিই একই ফলাফল দেয়, কিন্তু কতগুলো "ইনস্ট্রাকশন" ইস্যু হচ্ছে তার সংখ্যায় বিশাল পার্থক্য।

Python
# সিমুলেটেড SISD বনাম SIMD -- বাস্তব সমান্তরাল ALU লেইন নয়, শুধুই ধারণা বোঝানোর সিমুলেশন
def sisd_add_arrays(a, b):
    """SISD: একটিমাত্র ইনস্ট্রাকশন স্ট্রিম -- প্রতিটি এলিমেন্টের জন্য আলাদা 'add' ইনস্ট্রাকশন ইস্যু হয় (সিকোয়েনশিয়াল লুপ)"""
    result = []
    instruction_issues = 0
    for i in range(len(a)):
        result.append(a[i] + b[i])
        instruction_issues += 1   # প্রতিটি এলিমেন্টের জন্য একটি করে "add" ইনস্ট্রাকশন
    return result, instruction_issues

def simd_add_arrays(a, b):
    """SIMD: একটিমাত্র 'ভেক্টর add' ইনস্ট্রাকশন একসাথে সব এলিমেন্ট প্রসেস করে
    (এখানে Python list comprehension দিয়ে 'একসাথে' প্রসেসিং কনসেপ্টচুয়ালি সিমুলেট করা হলো --
    বাস্তব SIMD হার্ডওয়্যার এটি করে সমান্তরাল ALU লেইন দিয়ে, একই ক্লক সাইকেলে)"""
    result = [x + y for x, y in zip(a, b)]
    instruction_issues = 1   # একটিমাত্র ভেক্টর ইনস্ট্রাকশন, ডেটার আকার যাই হোক না কেন
    return result, instruction_issues

a = [3, 7, 1, 9]
b = [2, 5, 8, 4]

sisd_result, sisd_issues = sisd_add_arrays(a, b)
simd_result, simd_issues = simd_add_arrays(a, b)

print(f"SISD ফলাফল: {sisd_result}   |  ইনস্ট্রাকশন ইস্যু হলো: {sisd_issues}টি")
print(f"SIMD ফলাফল: {simd_result}   |  ইনস্ট্রাকশন ইস্যু হলো: {simd_issues}টি")
print(f"দুই পদ্ধতির ফলাফল অভিন্ন কিনা: {sisd_result == simd_result}")

assert sisd_result == simd_result
print()
print(f"একই ফলাফল, কিন্তু SISD-তে {sisd_issues}টি আলাদা ইনস্ট্রাকশন লাগলো, SIMD-তে মাত্র {simd_issues}টি -- ডেটার আকার বাড়লে এই পার্থক্য আরও বাড়বে।")

    
লক্ষ্য করুন — উভয় ফাংশনই একই ফলাফল [5, 12, 9, 13] দিলো, কিন্তু SISD-তে ৪টি আলাদা "instruction issue" গোনা হলো, SIMD-তে মাত্র ১টি। বাস্তব হার্ডওয়্যারে এই পার্থক্যটাই SIMD-কে বড় ডেটাসেটে (যেমন ইমেজ প্রসেসিং বা মেশিন লার্নিং) এত কার্যকর করে তোলে।
মূল কথা · Key takeaway

Flynn's Taxonomy একটি সরল কিন্তু শক্তিশালী মানসিক মডেল দেয় — যেকোনো আর্কিটেকচারকে "কতগুলো ইনস্ট্রাকশন, কতগুলো ডেটা স্ট্রিম" এই দুই প্রশ্ন দিয়ে বোঝা যায়। এই কোর্স এতদিন SISD ধরে নিয়ে চলেছে; পরের পাঠ (L51) MIMD-কে বাস্তব মাল্টিকোর হার্ডওয়্যারে রূপান্তরিত করে দেখাবে, আর L53 SIMD-কে GPU আর্কিটেকচারের প্রেক্ষাপটে আরও গভীরভাবে দেখাবে।

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

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

প্র ০১ একটি ৪-কোর CPU, যেখানে প্রতিটি কোরও SIMD ভেক্টর এক্সটেনশন সমর্থন করে, তাকে কি একটিমাত্র Flynn ক্যাটাগরিতে রাখা যায়?

বাস্তবে এটি একই সময়ে একাধিক স্তরে শ্রেণীবদ্ধ হতে পারে — চিপ-লেভেলে এটি MIMD (৪টি স্বাধীন কোর, প্রতিটি নিজস্ব ইনস্ট্রাকশন স্ট্রিম চালাতে পারে), কিন্তু প্রতিটি কোরের ভেতরে যখন ভেক্টর এক্সটেনশন ব্যবহার হয়, সেই মুহূর্তে সেই কোরটি SIMD আচরণ করছে। Flynn's Taxonomy একক-স্তরের একটি সরলীকৃত মডেল — বাস্তব আধুনিক হার্ডওয়্যার প্রায়ই একাধিক স্তরে বিভিন্ন ক্যাটাগরির মিশ্রণ ব্যবহার করে।

প্র ০২ SIMD সব ধরনের সমস্যার জন্য সমানভাবে কার্যকর নয় — কোন ধরনের প্রোগ্রামিং কাজে SIMD সবচেয়ে বেশি সুবিধা দেয়, আর কোথায় কম?

SIMD সবচেয়ে বেশি সুবিধা দেয় যেখানে একই অপারেশন বড় পরিমাণ ডেটার ওপর অভিন্নভাবে প্রয়োগ করতে হয় — যেমন ইমেজ প্রসেসিং (প্রতিটি পিক্সেলে একই ফিল্টার), অ্যারে গণনা, বা মেশিন লার্নিং-এর ম্যাট্রিক্স অপারেশন। কিন্তু যেখানে প্রতিটি ডেটা এলিমেন্টের জন্য ভিন্ন ভিন্ন কন্ট্রোল-ফ্লো সিদ্ধান্ত (branch) নিতে হয় — যেমন প্রতিটি এলিমেন্টের জন্য আলাদা if-else শর্ত — সেখানে SIMD-এর সুবিধা অনেকটাই কমে যায়, কারণ একটিমাত্র ইনস্ট্রাকশন সবাইকে একই পথে চালাতে বাধ্য করে।

প্র ০৩ উপরের কোড সেলে simd_add_arrays-এর instruction_issues সবসময় ১, যতই বড় হোক অ্যারে। বাস্তব SIMD হার্ডওয়্যারে কি এটা সত্যিই সীমাহীনভাবে সত্য থাকে?

না — বাস্তব SIMD হার্ডওয়্যারে একটি ভেক্টর ইনস্ট্রাকশন একবারে সীমিত সংখ্যক এলিমেন্ট প্রসেস করতে পারে (যেমন একটি ৫১২-বিট ভেক্টর রেজিস্টারে একবারে ১৬টি ৩২-বিট সংখ্যা)। অ্যারে সেই সীমার চেয়ে বড় হলে, একাধিক ভেক্টর ইনস্ট্রাকশন লাগবে (প্রতিটি একটি "chunk" প্রসেস করবে) — তবুও এটি SISD-এর তুলনায় বহুগুণ কম ইনস্ট্রাকশন লাগে, কারণ প্রতিটি ভেক্টর ইনস্ট্রাকশন একসাথে অনেক এলিমেন্ট প্রসেস করে, একটি নয়।

অনুশীলন

  1. চিন্তা করুন: উপরের কোড সেলে a ও b-কে ৪-এর বদলে ১০০ এলিমেন্টের অ্যারে করলে sisd_issues ও simd_issues-এর মান কী হবে (এই লেসনের সিমুলেশন মডেল অনুযায়ী)?

    sisd_issues হবে ১০০ (প্রতিটি এলিমেন্টের জন্য একটি করে ইনস্ট্রাকশন গোনা হয়, তাই লুপের দৈর্ঘ্যের সমান), কিন্তু simd_issues এই সরলীকৃত সিমুলেশন মডেলে সবসময় ১-ই থাকবে, কারণ কোডে এটি হার্ডকোড করা আছে — বাস্তব SIMD হার্ডওয়্যারে অবশ্য (প্র ০৩-এর উত্তরে আলোচিত) ভেক্টর-প্রস্থের সীমা থাকায় একাধিক ভেক্টর ইনস্ট্রাকশন লাগতে পারে।

  2. পরীক্ষা করুন: কোড সেলে একটি misd_style_check(value, checks) ফাংশনের কথা কল্পনা করুন যা একই value-এর ওপর তালিকার checks-এর প্রতিটি ফাংশন আলাদাভাবে চালায় এবং সব ফলাফল সমান কিনা যাচাই করে — এটি কেন MISD-এর ধারণার সাথে মিলে যায়?

    কারণ এখানে একটিমাত্র ডেটা (value) একাধিক ভিন্ন, স্বাধীন ইনস্ট্রাকশন স্ট্রিম (প্রতিটি checks-এর ফাংশন) দ্বারা প্রসেস হচ্ছে — ঠিক MISD-এর সংজ্ঞা অনুযায়ী। ফলাফল সব মিলে গেলে ডেটার সঠিকতায় আস্থা বাড়ে (রিডান্ডেন্সি চেক); না মিললে সম্ভাব্য একটি হার্ডওয়্যার/গণনা ত্রুটি শনাক্ত হয় — এটাই বাস্তব ফল্ট-টলারেন্ট সিস্টেমে MISD-এর ব্যবহারিক উদ্দেশ্য।

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

পূর্ববর্তী পাঠ
DMA — ডাইরেক্ট মেমরি অ্যাক্সেস