مرا به خاطر بسپار

MPI در محاسبات با کارایی بالا چیست؟

بازدید: 200 آخرین به‌روزرسانی: 18 بهمن 1404

مقدمه

ابررایانه‌های برتر جهان با میلیون‌ها هسته پردازشی کار می‌کنند و مدل‌های هوش مصنوعی با تریلیون‌ها پارامتر آموزش داده می‌شوند، ولی MPI (Message Passing Interface) همچنان استاندارد طلایی ارتباط بین پردازنده‌ها در سیستم‌های توزیع‌شده محاسبات با کارایی بالا (HPC) است.
MPI یک رابط استاندارد پیام‌رسانی است که به برنامه‌نویسان اجازه می‌دهد برنامه‌های موازی را روی صدها هزار هسته (CPU و GPU) اجرا کنند. بدون MPI، تقریباً هیچ ابررایانه‌ای در لیست 500 ابررایانه برتر، نمی‌توانست به این سطح از عملکرد برسد.
طبق آخرین نسخه استاندارد (MPI-4.1 در سال ۲۰۲۱ و به‌روزرسانی‌های جزئی تا ۲۰۲۵)، MPI همچنان در بیش از ۹5 درصد برنامه‌های HPC (شبیه‌سازی فیزیک، شیمی کوانتومی، دینامیک مولکولی، CFD، یادگیری عمیق توزیع‌شده) استفاده می‌شود.

MPI چیست؟

MPI (Message Passing Interface) یک رابط استاندارد پیام‌رسانی برای برنامه‌نویسی موازی است که در سال ۱۹۹۴ معرفی شد و اکنون در نسخه ۴.۱ (و پیش‌نویس MPI-5) قرار دارد.
به زبان ساده:
MPI به برنامه‌نویس می‌گوید چگونه بین فرآیندهای مختلف (که روی هسته‌های مختلف یا حتی گره‌های مختلف یک خوشه اجرا می‌شوند) پیام بفرستد، دریافت کند، همگام‌سازی کند و داده را به اشتراک بگذارد، بدون اینکه نیاز باشد جزئیات شبکه یا سخت‌افزار را بداند.

ویژگی‌های کلیدی MPI

۱. استاندارد و قابل حمل (Portability & Standardization)
MPI یک استاندارد رسمی است (نه یک پیاده‌سازی خاص). این یعنی:
یک برنامه نوشته‌شده با MPI استاندارد، بدون تغییر کد منبع، روی هر خوشه‌ای با هر پیاده‌سازی MPI (Open MPI، MPICH، Intel MPI، MVAPICH، Cray MPICH و غیره) اجرا می‌شود.
این استاندارد توسط MPI Forum (شامل شرکت‌های بزرگ مانند Intel، AMD، NVIDIA، HPE، IBM، Google و دانشگاه‌ها) نگهداری می‌شود.
آخرین نسخه پایدار تا ۲۰۲۵: MPI-4.1 (۲۰۲۱) و پیش‌نویس MPI-5 در حال نهایی شدن است.
در واقع، برنامه‌نویس فقط یک بار کد می‌نویسد و روی ابررایانه‌های مختلف (Frontier، Aurora، LUMI، Fugaku، Leonardo و غیره) اجرا می‌کند.
انتقال از یک سیستم به سیستم دیگر فقط نیاز به کامپایل مجدد با MPI محلی بدون تغییر منطق برنامه دارد.
۲. پیام‌رسانی نقطه‌به‌نقطه (Point-to-Point) و جمعی (Collective)
اما منظور از این مفاهیم چیست؟ در بخش بعدی توضیح داده شده است.
MPI دو نوع اصلی ارتباط دارد:
Point-to-Point (نقطه به نقطه): ارتباط مستقیم بین دو فرآیند خاص که می‌تواند به صورت موارد زیر باشد:
  • MPI_Send / MPI_Recv (مسدودکننده)
  • MPI_Isend / MPI_Irecv (غیرمسدودکننده برای همپوشانی محاسبه و ارتباط)
  • MPI_Sendrecv (ارسال و دریافت همزمان)
Collective (عملیات جمعی): عملیات همزمان روی همه یا گروهی از فرآیندها.
عملیات رایج جمعی عبارتند از:
  • MPI_Bcast: پخش یک داده از یک فرآیند به همه
  • MPI_Scatter / MPI_Gather: توزیع و جمع‌آوری داده
  • MPI_Reduce / MPI_Allreduce: عملیات کاهش ( مانند جمع، میانگین، حداکثر، حداقل) روی همه فرآیندها
  • MPI_Alltoall: ارسال داده از یک فرآیند به همه فرآیندهای دیگر
  • MPI_Barrier: همگام‌سازی همه فرآیندها (همه منتظر می‌مانند تا همه برسند)
عملیات جمعی معمولاً ۱۰–۱۰۰ برابر سریع‌تر از نوشتن حلقه Point-to-Point توسط برنامه‌نویس هستند، چون از سخت‌افزار شبکه (SHMEM، RDMA، collective offload) استفاده می‌کنند.
در سال ۲۰۲۵، MPI-4.1 و پیاده‌سازی‌های جدید (مثل Open MPI ۵.۰ و Cray MPICH) عملیات جمعی را روی GPU و شبکه‌های Slingshot-11 بهینه کرده‌اند.
برای مثال:
در آموزش توزیع‌شده مدل‌های بزرگ (مثل Llama 3 با DeepSpeed)، از MPI_Allreduce برای میانگین‌گیری گرادیان‌ها در همه GPUها استفاده می‌شود. این عملیات در یک مرحله انجام می‌شود و زمان همگام‌سازی را از چند ثانیه به چند میلی‌ثانیه می‌رساند.
۳. پشتیبانی از زبان‌های برنامه‌نویسی متنوع
MPI از ابتدا برای زبان‌های علمی طراحی شده و اکنون در اکوسیستم بسیار گسترده‌ای پشتیبانی می‌شود:
یک تیم می‌تواند بخش‌های مختلف پروژه را با زبان‌های مختلف بنویسد و با MPI ارتباط برقرار کند.
در ۲۰۲۵، ترکیب Python + mpi4py + PyTorch برای آموزش توزیع‌شده مدل‌های بزرگ بسیار رایج است.
۴. عملکرد بسیار بالا: تأخیر زیر ۱ میکروثانیه و پهنای باند صدها گیگابیت بر ثانیه
MPI برای شبکه‌های با تأخیر بسیار پایین (low-latency interconnects) بهینه شده است:

تاخیر و پهنای باند شبکه‌ها در MPI

چرا این اعداد مهم هستند؟
در یک خوشه ۱۰۰٬۰۰۰ هسته‌ای، اگر هر Allreduce فقط ۱ میکروثانیه طول بکشد، در یک گام همگام‌سازی فقط ۰.۱ ثانیه زمان می‌برد. اما اگر تأخیر ۱۰ میکروثانیه باشد، این زمان به ۱ ثانیه می‌رسد، یعنی ۱۰ برابر کندتر!
بهینه‌سازی‌های ۲۰۲۵
GPU-aware MPI: داده مستقیماً از حافظه GPU به GPU دیگر منتقل می‌شود (بدون کپی به CPU).
Persistent Communication: برای پیام‌های تکراری (مثل گرادیان‌ها در آموزش)، درخواست‌ها را یک بار آماده می‌کند.
Collective Offload: عملیات جمعی روی NIC (شبکه) انجام می‌شود، نه CPU.

پیاده‌سازی عملی

یک برنامه ساده MPI در C

#include           // کتابخانه اصلی MPI
#include         // برای printf

int main(int argc, char** argv) {
    // خط ۱: شروع محیط MPI
    MPI_Init(&argc, &argv);

    // خط ۲: گرفتن شماره فرآیند (rank) و تعداد کل فرآیندها (size)
    int rank, size;
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);   // rank من چند است؟
    MPI_Comm_size(MPI_COMM_WORLD, &size);   // کل چند فرآیند داریم؟

    // خط ۳: هر فرآیند خودش را معرفی می‌کند
    printf("سلام از فرآیند شماره %d از %d فرآیند\n", rank, size);

    // خط ۴: یک مثال کوچک عملیات جمعی (Reduce)
    int local_value = rank * 10;            // هر فرآیند یک عدد محلی دارد
    int global_sum = 0;                     // متغیر برای جمع نهایی

    // خط ۵: همه فرآیندها عدد محلی خود را جمع می‌کنند و نتیجه به فرآیند ۰ می‌رود
    MPI_Reduce(&local_value, &global_sum, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD);

    // خط ۶: فقط فرآیند ۰ (معمولاً root) نتیجه را چاپ می‌کند
    if (rank == 0) {
        printf("جمع کل: %d\n", global_sum);
    }

    // خط ۷: پایان محیط MPI
    MPI_Finalize();
    return 0;
}
خروجی نمونه (با ۴ فرآیند):

سلام از فرآیند شماره 0 از 4 فرآیند

سلام از فرآیند شماره 1 از 4 فرآیند

سلام از فرآیند شماره 2 از 4 فرآیند

سلام از فرآیند شماره 3 از 4 فرآیند

جمع کل: 60

ترتیب چاپ سلام‌ها ممکن است متفاوت باشد چون فرآیندها همزمان اجرا می‌شوند

جمع‌بندی

MPI در سال ۲۰۲۵، نه فقط یک کتابخانه، بلکه زبان مشترک ابررایانه‌ها است. زبانی که میلیون‌ها هسته را هماهنگ می‌کند، شبیه‌سازی‌های علمی را ممکن می‌سازد و پایه آموزش مدل‌های بزرگ هوش مصنوعی است. از پیام‌رسانی نقطه‌به‌نقطه تا عملیات جمعی پیشرفته، MPI عملکرد، قابلیت حمل و مقیاس‌پذیری را به برنامه‌های موازی می‌بخشد. برای دانشجویان دکترا، MPI دریچه‌ای به تحقیق در ارتباطات کم‌تأخیر، GPU-aware MPI و hybrid MPI+OpenMP است. حالا شروع کنید: یک برنامه ساده MPI بنویسید، آن را روی چند هسته اجرا کنید و ببینید چگونه قدرت موازی‌سازی را حس می‌کنید. آینده محاسبات با عملکرد بالا، موازی و MPI است.

سوالات متداول

  1. MPI چیست؟
استاندارد پیام‌رسانی برای برنامه‌نویسی موازی در HPC.
  1. تفاوت MPI با OpenMP؟
MPI بین نودها (توزیع‌شده)، OpenMP داخل یک نود (اشتراکی).
  1. چالش اصلی MPI چیست؟
تأخیر شبکه، حل با MPI-4 و شبکه‌های جدید.
تا چه حد این مطلب برای شما مفید بود؟
بر اساس رای 0 نفر

اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.

ثبت نظر

نظر دادن