واجهة تمرير الرسائل
واجهة تمرير الرسائل ( MPI ) هي معيار محمول لتمرير الرسائل مصمم للعمل على بنى الحوسبة المتوازية . [ 1 ] يحدد معيار MPI بنية ودلالات إجراءات المكتبة المفيدة لمجموعة واسعة من المستخدمين الذين يكتبون برامج تمرير رسائل محمولة بلغات C و C++ و Fortran . توجد العديد من تطبيقات MPI مفتوحة المصدر ، مما ساهم في تطوير صناعة البرمجيات المتوازية ، وشجع على تطوير تطبيقات متوازية واسعة النطاق قابلة للنقل والتوسع.
تاريخ
بدأ العمل على واجهة تمرير الرسائل في صيف عام ١٩٩١ عندما بدأت مجموعة صغيرة من الباحثين مناقشات في منتجع جبلي بالنمسا. ونتج عن تلك المناقشات ورشة عمل حول معايير تمرير الرسائل في بيئة الذاكرة الموزعة، عُقدت في الفترة من ٢٩ إلى ٣٠ أبريل ١٩٩٢ في ويليامزبرغ، فرجينيا . [ ٢ ] ناقش الحضور في ويليامزبرغ السمات الأساسية اللازمة لواجهة تمرير رسائل قياسية، وشكلوا فريق عمل لمواصلة عملية التقييس. وقدّم كلٌ من جاك دونغارا ، وتوني هاي ، وديفيد دبليو ووكر مسودة اقتراح أولية بعنوان "MPI1" في نوفمبر ١٩٩٢. وفي نوفمبر من العام نفسه، عُقد اجتماع لفريق عمل MPI في مينيابوليس، حيث تقرر وضع عملية التقييس على أسس أكثر رسمية. اجتمع فريق عمل MPI كل 6 أسابيع خلال الأشهر التسعة الأولى من عام 1993. تم تقديم مسودة معيار MPI في مؤتمر الحوسبة الفائقة 93 في نوفمبر 1993. [ 3 ] بعد فترة من التعليقات العامة، والتي أسفرت عن بعض التغييرات في MPI، تم إصدار الإصدار 1.0 من MPI في يونيو 1994. شكلت هذه الاجتماعات ومناقشات البريد الإلكتروني معًا منتدى MPI، الذي كانت العضوية فيه مفتوحة لجميع أعضاء مجتمع الحوسبة عالية الأداء .
شارك في مشروع MPI حوالي 80 شخصًا من 40 منظمة، معظمهم في الولايات المتحدة وأوروبا. وشاركت معظم الشركات الكبرى المصنعة للحواسيب المتزامنة في هذا المشروع، بالتعاون مع باحثين من الجامعات والمختبرات الحكومية والقطاع الصناعي .
توفر MPI لموردي الأجهزة المتوازية مجموعة أساسية محددة بوضوح من الإجراءات التي يمكن تنفيذها بكفاءة. ونتيجة لذلك، يمكن لموردي الأجهزة البناء على هذه المجموعة من الإجراءات القياسية منخفضة المستوى لإنشاء إجراءات عالية المستوى لبيئة الاتصال بالذاكرة الموزعة المرفقة مع أجهزتهم المتوازية . توفر MPI واجهة سهلة الاستخدام وقابلة للنقل للمستخدم العادي، وفي الوقت نفسه قوية بما يكفي لتمكين المبرمجين من استخدام عمليات تمرير الرسائل عالية الأداء المتوفرة على الأجهزة المتقدمة.
في محاولةٍ لوضع معيارٍ عالمي لتبادل الرسائل، لم يعتمد الباحثون على نظامٍ واحد، بل جمعوا أبرز ميزات أنظمةٍ عديدة، منها أنظمةٌ صممتها شركاتٌ مثل IBM و Intel و nCUBE و PVM وExpress وP4 وPARMACS. يتميز نموذج تبادل الرسائل بجاذبيته نظرًا لسهولة نقله بين الأنظمة المختلفة، ويمكن استخدامه في الاتصالات بين المعالجات المتعددة ذات الذاكرة الموزعة والذاكرة المشتركة، وشبكات محطات العمل، ومزيجٍ من هذه العناصر. كما يمكن تطبيق هذا النموذج في بيئاتٍ متعددة، بغض النظر عن سرعة الشبكة أو بنية الذاكرة.
تلقى منتدى MPI دعماً جزئياً من وكالة مشاريع البحوث الدفاعية المتقدمة ( DARPA ) ومن المؤسسة الوطنية للعلوم الأمريكية (NSF) بموجب المنحة ASC-9310330، واتفاقية التعاون بين مركز العلوم والتكنولوجيا التابع للمؤسسة الوطنية للعلوم رقم CCR-8809615، ومن المفوضية الأوروبية من خلال مشروع Esprit P6643. كما قدمت جامعة تينيسي مساهمات مالية لمنتدى MPI.
في السنوات اللاحقة، تطور معيار MPI عبر العديد من المراجعات الرئيسية والثانوية، حيث أضاف كل منها إمكانيات وتحسينات جديدة. على سبيل المثال، قدم MPI-3.0 عمليات جماعية غير حظرية، وتحسينات على الاتصال أحادي الجانب، وتحديثات على روابط اللغة؛ وأضاف MPI-4.0 إجراءات العد الكبيرة، وعمليات جماعية مستمرة، وطرق تهيئة محسّنة؛ وقدم MPI-5.0 واجهة ثنائية موحدة للتطبيقات (ABI) لتحسين قابلية التشغيل البيني بين التطبيقات. [ 4 ]
ملخص
MPI هو بروتوكول اتصال لبرمجة الحواسيب المتوازية [ 5 ] . يدعم كلاً من الاتصال المباشر والاتصال الجماعي. MPI عبارة عن واجهة برمجة تطبيقات تعتمد على تمرير الرسائل، بالإضافة إلى بروتوكول ومواصفات دلالية لكيفية عمل ميزاته في أي تطبيق. [ 6 ] تتمثل أهداف MPI في الأداء العالي، وقابلية التوسع، وسهولة النقل. ظل MPI النموذج السائد المستخدم في الحوسبة عالية الأداء حتى عام 2006. [ 7 ]
تشمل أهداف المعيار الأداء العالي، وقابلية التوسع، وسهولة النقل عبر بنى الحوسبة المتوازية. وعلى الرغم من عدم خضوعه لهيئة معايير دولية رسمية، يُعتبر MPI على نطاق واسع معيارًا فعليًا لتمرير الرسائل في تطبيقات الحوسبة عالية الأداء. [ 8 ]
لا تحظى MPI بموافقة أي هيئة معايير رئيسية؛ ومع ذلك، فقد أصبحت معيارًا فعليًا للتواصل بين العمليات التي تحاكي برنامجًا متوازيًا يعمل على نظام ذاكرة موزعة . غالبًا ما تُشغّل الحواسيب العملاقة ذات الذاكرة الموزعة، مثل مجموعات الحواسيب، مثل هذه البرامج .
لا يتضمن نموذج MPI-1 الرئيسي مفهوم الذاكرة المشتركة ، بينما يقتصر نموذج MPI-2 على مفهوم محدود للذاكرة المشتركة الموزعة . ومع ذلك، تُشغَّل برامج MPI بانتظام على حواسيب ذات ذاكرة مشتركة، ويمكن لكل من MPICH و Open MPI استخدام الذاكرة المشتركة لنقل الرسائل إذا كانت متاحة. [ 9 ] [ 10 ] يتميز تصميم البرامج وفقًا لنموذج MPI (على عكس نماذج الذاكرة المشتركة الصريحة ) بمزايا عند التشغيل على بنى NUMA ، حيث يشجع MPI على استخدام الذاكرة المحلية . وقد أُدخلت برمجة الذاكرة المشتركة الصريحة في MPI-3. [ 11 ] [ 12 ] [ 13 ]
على الرغم من أن MPI ينتمي إلى الطبقات 5 وما فوق من نموذج OSI المرجعي ، إلا أن التطبيقات قد تغطي معظم الطبقات، مع استخدام المقابس وبروتوكول التحكم في الإرسال (TCP) في طبقة النقل.
تتألف معظم تطبيقات MPI من مجموعة محددة من الإجراءات التي يمكن استدعاؤها مباشرةً من لغات C و C++ و Fortran (أي واجهة برمجة تطبيقات) وأي لغة قادرة على التفاعل مع هذه المكتبات، بما في ذلك C# و Java و Python . وتتمثل مزايا MPI على مكتبات تمرير الرسائل القديمة في قابلية النقل (لأن MPI قد تم تطبيقها على جميع بنى الذاكرة الموزعة تقريبًا) والسرعة (لأن كل تطبيق مُحسَّن من حيث المبدأ للأجهزة التي يعمل عليها).
تستخدم MPI مواصفات مستقلة عن اللغة (LIS) للاستدعاءات وربط اللغات. حدد معيار MPI الأول روابط ANSI C و Fortran 77 بالإضافة إلى LIS. عُرضت المسودة في مؤتمر الحوسبة الفائقة 1994 (نوفمبر 1994) [ 14 ] وتم الانتهاء منها بعد ذلك بوقت قصير. يتألف معيار MPI-1.3 من حوالي 128 دالة، وقد صدر كنهاية لسلسلة MPI-1 في عام 2008. [ 15 ]
يوجد حاليًا عدة إصدارات من المعيار: الإصدار 1.3 (يُختصر عادةً إلى MPI-1 )، الذي يُركز على تمرير الرسائل ويتميز ببيئة تشغيل ثابتة، وMPI-2.2 (MPI-2)، الذي يتضمن ميزات جديدة مثل الإدخال/الإخراج المتوازي، وإدارة العمليات الديناميكية، وعمليات الذاكرة عن بُعد، [ 16 ] وMPI-3.1 (MPI-3)، الذي يتضمن امتدادات للعمليات الجماعية مع إصدارات غير حظرية، وامتدادات للعمليات أحادية الجانب. [ 17 ] تُحدد مكتبة معلومات اللغة (LIS) الخاصة بـ MPI-2 أكثر من 500 دالة، وتوفر روابط لغوية للغات ISO C وISO C++ و Fortran 90. كما أُضيفت قابلية التشغيل البيني للكائنات لتسهيل برمجة تمرير الرسائل بلغات متعددة. ومن الآثار الجانبية لتوحيد معيار MPI-2، الذي اكتمل في عام 1996، توضيح معيار MPI-1، مما أدى إلى إنشاء MPI-1.2.
يُعدّ MPI-2 في معظمه مجموعةً فرعيةً من MPI-1، على الرغم من إيقاف بعض وظائفه. ولا تزال برامج MPI-1.3 تعمل ضمن تطبيقات MPI المتوافقة مع معيار MPI-2.
يُقدّم MPI-3.0 تحديثاتٍ جوهرية لمعيار MPI، بما في ذلك إصدارات غير حظرية للعمليات الجماعية، وتحسينات على العمليات أحادية الجانب، وربطًا بلغة Fortran 2008. كما يُزيل روابط C++ المُهملة والعديد من الإجراءات والكائنات القديمة. والأهم من ذلك، أن أي برنامج MPI-2.2 صالح يتجنّب العناصر المُزالة يكون صالحًا أيضًا في MPI-3.0.
يُعدّ MPI-3.1 تحديثًا بسيطًا يركز على التصحيحات والتوضيحات، لا سيما فيما يتعلق بربط Fortran. ويُقدّم وظائف جديدة لمعالجة MPI_Aintالقيم، وإجراءات إدخال/إخراج جماعية غير حظرية، وطرقًا لاسترجاع قيم الفهرس بالاسم MPI_Tلمتغيرات الأداء. بالإضافة إلى ذلك، تمت إضافة فهرس عام. جميع برامج MPI-3.0 الصالحة صالحة أيضًا في MPI-3.1.
يُعدّ MPI-4.0 تحديثًا رئيسيًا يُقدّم إصدارات ذات عدد كبير من العديد من الإجراءات، وعمليات جماعية مستمرة، واتصالات مُجزّأة، وطريقة تهيئة جديدة لـ MPI. كما يُضيف تأكيدات معلومات التطبيق ويُحسّن تعريفات معالجة الأخطاء، إلى جانب العديد من التحسينات الصغيرة الأخرى. أي برنامج صالح مكتوب بلغة MPI-3.1 متوافق مع MPI-4.0.
يُعدّ MPI-4.1 تحديثًا بسيطًا يركز على تصحيحات وتوضيحات لمعيار MPI-4.0. وقد ألغى هذا التحديث استخدام العديد من الإجراءات، MPI_HOSTومفتاح السمة، وملف mpif.hتضمين Fortran. كما أُضيف إجراء جديد للاستعلام عن الجهاز الذي يُشغّل برنامج MPI. ويظل أي برنامج MPI-4.0 صالحًا للاستخدام في MPI-4.1.
يُعدّ MPI-5.0 تحديثًا رئيسيًا يُقدّم واجهة ثنائية للتطبيقات . وهذا يسمح بزيادة التوافق بين مكتبات MPI من مختلف موردي MPI، بالإضافة إلى تحسين الأداء في بيئات الحاويات. [ 18 ]
كثيراً ما تُقارن MPI مع الآلة الافتراضية المتوازية (PVM)، التي كانت بيئة موزعة ونظام تمرير رسائل شائعين طُوِّرا عام 1989، وكانا من الأنظمة التي حفزت الحاجة إلى معيار تمرير الرسائل المتوازي. ويمكن اعتبار نماذج برمجة الذاكرة المشتركة متعددة الخيوط (مثل Pthreads و OpenMP ) وبرمجة تمرير الرسائل (MPI/PVM) متكاملة، وقد استُخدمت معاً في بعض الأحيان، على سبيل المثال، في الخوادم التي تحتوي على عُقد متعددة كبيرة ذات ذاكرة مشتركة.
الوظائف
تهدف واجهة MPI إلى توفير وظائف أساسية للبنية الافتراضية، والتزامن ، والتواصل بين مجموعة من العمليات (المُرتبطة بالعُقد/الخوادم/أجهزة الحاسوب) بطريقة مستقلة عن لغة البرمجة، مع استخدام صيغة خاصة بكل لغة (روابط)، بالإضافة إلى بعض الميزات الخاصة بكل لغة. تعمل برامج MPI دائمًا مع العمليات، ولكن يُشير المبرمجون عادةً إلى العمليات باسم المعالجات. ولتحقيق أقصى أداء، يُخصص لكل وحدة معالجة مركزية (أو نواة في جهاز متعدد النوى) عملية واحدة فقط. ويتم هذا التخصيص أثناء التشغيل من خلال الوكيل الذي يبدأ برنامج MPI، والذي يُسمى عادةً mpirun أو mpiexec.
يدعم MPI كلاً من الاتصال المباشر بين نقطتين ، حيث يتم تبادل الرسائل مباشرةً بين أزواج من العمليات، والاتصال الجماعي ، حيث تتعاون مجموعات من العمليات في عمليات مثل البث والاختزال. تسمح روابط اللغات باستخدام إجراءات MPI من لغات برمجة متعددة، وتُعد روابط C وFortran الأكثر شيوعًا. [ 19 ]
تتضمن وظائف مكتبة MPI، على سبيل المثال لا الحصر، عمليات الإرسال/الاستقبال من نوع نقطة إلى نقطة، والاختيار بين بنية منطقية للعمليات (ديكارتية أو شبيهة بالرسم البياني) ، وتبادل البيانات بين أزواج العمليات (عمليات الإرسال/الاستقبال)، ودمج النتائج الجزئية للحسابات (عمليات التجميع والاختزال)، ومزامنة العقد (عملية الحاجز)، بالإضافة إلى الحصول على معلومات متعلقة بالشبكة مثل عدد العمليات في جلسة الحوسبة، وهوية المعالج الحالية التي تُربط بها العملية، والعمليات المجاورة التي يمكن الوصول إليها في بنية منطقية، وما إلى ذلك. تأتي عمليات نقطة إلى نقطة بأشكال متزامنة وغير متزامنة ومخزنة مؤقتًا وجاهزة ، للسماح بدلالات أقوى وأضعف نسبيًا لجوانب المزامنة في عملية الإرسال من نوع نقطة إلى نقطة. العديد من العمليات المعلقة ممكنة في الوضع غير المتزامن، في معظم التطبيقات.
يُمكّن كلٌّ من MPI-1 وMPI-2 من تنفيذ تطبيقات تتداخل فيها عمليات الاتصال والحساب، إلا أن التطبيق العملي يختلف عن النظرية. كما يُحدد MPI واجهات آمنة للخيوط ، والتي تتميز باستراتيجيات تماسك وترابط تُساعد على تجنب الحالة المخفية داخل الواجهة. من السهل نسبيًا كتابة كود MPI متعدد الخيوط من نقطة إلى نقطة، وتدعم بعض التطبيقات هذا النوع من الكود. يُحقق الاتصال الجماعي متعدد الخيوط على أفضل وجه باستخدام نسخ متعددة من Communicators، كما هو موضح أدناه.
المفاهيم
توفر MPI العديد من الميزات. توضح المفاهيم التالية سياق هذه الإمكانيات وتساعد المبرمج على تحديد الوظائف التي سيستخدمها في برامجه التطبيقية. أربعة من المفاهيم الأساسية الثمانية لـ MPI خاصة بـ MPI-2.
متواصل
تربط كائنات الاتصال مجموعات العمليات في جلسة MPI. يمنح كل كائن اتصال كل عملية مُضمنة مُعرّفًا مستقلًا، ويُرتب العمليات المُضمنة ضمنه في بنية مُنظمة . يدعم MPI أيضًا المجموعات الصريحة، ولكنها تُستخدم بشكل أساسي لتنظيم وإعادة تنظيم مجموعات العمليات قبل إنشاء كائن اتصال آخر. يدعم MPI عمليات الاتصال الداخلي لمجموعة واحدة، والاتصال الثنائي بين كائنات الاتصال. في MPI-1، تُعد عمليات المجموعة الواحدة هي الأكثر شيوعًا. أما العمليات الثنائية فتظهر بشكل رئيسي في MPI-2، حيث تشمل الاتصال الجماعي والإدارة الديناميكية داخل العملية.
يمكن تقسيم وحدات الاتصال باستخدام عدة أوامر MPI. تتضمن هذه الأوامر الأمر MPI_COMM_SPLIT، حيث تنضم كل عملية إلى واحدة من وحدات الاتصال الفرعية الملونة المتعددة عن طريق إعلان نفسها بأنها تحمل ذلك اللون.
أساسيات الاتصال من نقطة إلى نقطة
تتضمن العديد من وظائف MPI المهمة التواصل بين عمليتين محددتين. ومن الأمثلة الشائعة على ذلك MPI_Send، وظيفة إرسال رسالة إلى عملية محددة أخرى. تُعدّ عمليات الاتصال المباشر، كما تُسمى، مفيدة بشكل خاص في الاتصالات ذات الأنماط أو غير المنتظمة، على سبيل المثال، بنية البيانات المتوازية حيث يتبادل كل معالج بشكل روتيني أجزاء من البيانات مع معالجات أخرى محددة بين خطوات الحساب، أو بنية السيد والتابع حيث يرسل السيد بيانات مهمة جديدة إلى التابع عند اكتمال المهمة السابقة.
يحدد MPI-1 آليات الاتصال من نقطة إلى نقطة، سواء كانت مانعة أو غير مانعة، بالإضافة إلى آلية "الإرسال الجاهز" التي بموجبها لا يمكن إرسال طلب إرسال إلا بعد إرسال طلب استقبال مطابق.
الأساسيات الجماعية
تتضمن الوظائف الجماعية التواصل بين جميع العمليات في مجموعة عمليات (والتي قد تشمل مجموعة العمليات بأكملها أو مجموعة فرعية محددة من قِبل البرنامج). من الوظائف النموذجية الاستدعاء MPI_Bcast(اختصارًا لـ " البث "). تأخذ هذه الوظيفة البيانات من عقدة واحدة وترسلها إلى جميع العمليات في مجموعة العمليات. أما العملية العكسية فهي الاستدعاء MPI_Reduce، الذي يأخذ البيانات من جميع العمليات في المجموعة، ويُجري عملية (مثل الجمع)، ويخزن النتائج على عقدة واحدة. MPI_Reduceغالبًا ما يكون هذا مفيدًا في بداية أو نهاية عملية حسابية موزعة كبيرة، حيث يُعالج كل معالج جزءًا من البيانات ثم يجمعها في نتيجة واحدة.
تقوم عمليات أخرى بمهام أكثر تعقيدًا، مثل MPI_Alltoallتلك التي تعيد ترتيب n عنصرًا من البيانات بحيث تحصل العقدة رقم n على العنصر رقم n من البيانات من كل عقدة.
أنواع البيانات المشتقة
تتطلب العديد من وظائف MPI تحديد نوع البيانات المُرسلة بين العمليات. ويعود ذلك إلى أن MPI يهدف إلى دعم بيئات غير متجانسة حيث قد تُمثَّل الأنواع بشكل مختلف على العُقد المختلفة [ 20 ] (على سبيل المثال، قد تعمل هذه العُقد ببنى معالجة مركزية مختلفة ذات ترتيب بايتات مختلف )، وفي هذه الحالة، يمكن لتطبيقات MPI إجراء تحويل البيانات . [ 20 ] ولأن لغة C لا تسمح بتمرير النوع نفسه كمعامل، فإن MPI يُعرّف الثوابت مسبقًا MPI_INTلتتوافق مع الأنواع الأخرى .MPI_CHARMPI_DOUBLEintchardouble
إليك مثال بلغة C يُمرر مصفوفات من ints من جميع العمليات إلى عملية واحدة. تُسمى العملية المُستقبلة بالعملية "الجذرية"، ويمكن أن تكون أي عملية مُحددة، ولكنها عادةً ما تكون العملية رقم 0. تطلب جميع العمليات إرسال مصفوفاتها إلى الجذر باستخدام MPI_Gather، وهو ما يُعادل قيام كل عملية (بما في ذلك الجذر نفسه) باستدعاء MPI_Send، ثم يقوم الجذر بإجراء العدد المُناسب من MPI_Recvالاستدعاءات المُرتبة لتجميع كل هذه المصفوفات في مصفوفة أكبر: [ 21 ]
int send_array [ 100 ]; int root = 0 ; /* أو أي قيمة أخرى */ int num_procs , * recv_array ; MPI_Comm_size ( comm , & num_procs ); recv_array = malloc ( num_procs * sizeof ( send_array )); MPI_Gather ( send_array , sizeof ( send_array ) / sizeof ( * send_array ), MPI_INT , recv_array , sizeof ( send_array ) / sizeof ( * send_array ), MPI_INT , root , comm );مع ذلك، قد يكون من الأفضل إرسال البيانات ككتلة واحدة بدلاً من 100 intكتلة. وللقيام بذلك، قم بتعريف نوع بيانات مشتق "كتلة متجاورة":
MPI_Datatype newtype ; MPI_Type_contiguous ( 100 , MPI_INT , & newtype ); MPI_Type_commit ( & newtype ); MPI_Gather ( array , 1 , newtype , receive_array , 1 , newtype , root , comm );لتمرير فئة أو بنية بيانات، MPI_Type_create_structيتم إنشاء نوع بيانات مشتق من MPI من MPI_predefinedأنواع البيانات، كما يلي:
int MPI_Type_create_struct ( int count , int * blocklen , MPI_Aint * disp , MPI_Datatype * type , MPI_Datatype * newtype )أين:
countيمثل عدد الكتل، ويحدد طول المصفوفات (بالعناصر)blocklen،dispوtype.blocklenيحتوي كل قسم على عدد من العناصر،dispيحتوي على إزاحات البايت لكل كتلة،typeيحتوي على أنواع العناصر في كل كتلة.newtype(المخرجات) تحتوي على النوع المشتق الجديد الذي تم إنشاؤه بواسطة هذه الدالة
dispتُستخدم مصفوفة الإزاحات لمحاذاة بنية البيانات، إذ قد يقوم المُصرّف بإضافة مسافات إلى المتغيرات في فئة أو بنية بيانات. وأفضل طريقة لحساب المسافة بين الحقول المختلفة هي الحصول على عناوينها في الذاكرة. ويتم ذلك باستخدام عامل التشغيل `displacements` ، الذي يُشابه MPI_Get_addressعادةً &عامل التشغيل `displacements` في لغة C، ولكن قد لا يكون هذا صحيحًا عند التعامل مع تجزئة الذاكرة . [ 22 ]
يُعدّ تمرير بنية البيانات ككتلة واحدة أسرع بكثير من تمرير عنصر واحد في كل مرة، خاصةً إذا كانت العملية ستتكرر. وذلك لأن الكتل ذات الحجم الثابت لا تتطلب تسلسلًا أثناء النقل. [ 23 ]
بالنظر إلى هياكل البيانات التالية:
struct A { int f ; short p ; };struct B { struct A a ; int pp , vp ; };إليك كود C لإنشاء نوع بيانات مشتق من MPI:
static const int blocklen [] = { 1 , 1 , 1 , 1 }; static const MPI_Aint disp [] = { offsetof ( struct B , a ) + offsetof ( struct A , f ), offsetof ( struct B , a ) + offsetof ( struct A , p ), offsetof ( struct B , pp ), offsetof ( struct B , vp ) }; static MPI_Datatype type [] = { MPI_INT , MPI_SHORT , MPI_INT , MPI_INT }; MPI_Datatype newtype ; MPI_Type_create_struct ( sizeof ( type ) / sizeof ( * type ), blocklen , disp , type , & newtype ); MPI_Type_commit ( & newtype );مفاهيم MPI-2
التواصل من جانب واحد
يُعرّف MPI-2 ثلاث عمليات اتصال أحادية الجانب، MPI_Putوهي MPI_Get: MPI_Accumulateالكتابة إلى الذاكرة البعيدة، والقراءة من الذاكرة البعيدة، وعملية الاختزال على نفس الذاكرة عبر عدد من المهام، على التوالي. كما يُعرّف ثلاث طرق مختلفة لمزامنة هذا الاتصال (الأقفال العامة، والأقفال الثنائية، والأقفال البعيدة)، حيث لا يضمن المعيار إتمام هذه العمليات حتى نقطة المزامنة.
يمكن أن تكون هذه الأنواع من الاستدعاءات مفيدة في كثير من الأحيان للخوارزميات التي يكون فيها التزامن غير ملائم (مثل ضرب المصفوفات الموزعة )، أو عندما يكون من المرغوب فيه أن تكون المهام قادرة على موازنة حملها أثناء قيام المعالجات الأخرى بالعمل على البيانات.
إدارة العمليات الديناميكية
يتمثل الجانب الأساسي في "قدرة عملية MPI على المشاركة في إنشاء عمليات MPI جديدة أو إقامة اتصال مع عمليات MPI التي تم تشغيلها بشكل منفصل". يصف معيار MPI-2 ثلاث واجهات رئيسية يمكن من خلالها لعمليات MPI إقامة اتصالات ديناميكية، وهي: `<input>` و`<input> MPI_Comm_spawn` MPI_Comm_acceptو` MPI_Comm_connect< input> MPI_Comm_join`. MPI_Comm_spawnتسمح الواجهة `<input>` لعملية MPI بإنشاء عدد من مثيلات عملية MPI المسماة. تُشكل مجموعة عمليات MPI المُنشأة حديثًا MPI_COMM_WORLDمُتصلًا داخليًا جديدًا، ولكنها تستطيع التواصل مع العملية الأصلية والمُتصل الخارجي الذي تُرجعه الدالة. MPI_Comm_spawn_multipleأما الواجهة `<input>` فهي واجهة بديلة تسمح بأن تكون المثيلات المختلفة المُنشأة ملفات ثنائية مختلفة ذات وسائط مختلفة. [ 24 ]
الإدخال/الإخراج
تُسمى ميزة الإدخال/الإخراج المتوازي أحيانًا MPI-IO، [ 25 ] وتشير إلى مجموعة من الوظائف المصممة لتجريد إدارة الإدخال/الإخراج على الأنظمة الموزعة إلى MPI، والسماح بالوصول إلى الملفات بسهولة بطريقة نمطية باستخدام وظائف نوع البيانات المشتقة الموجودة.
تشير الأبحاث القليلة التي أُجريت على هذه الخاصية إلى أن تحقيق مكاسب عالية في الأداء باستخدام MPI-IO قد لا يكون بالأمر الهين. فعلى سبيل المثال، يُظهر تطبيق ضرب المصفوفات المتفرقة في المتجهات باستخدام مكتبة MPI I/O تحسنًا طفيفًا في الأداء بشكل عام، إلا أن هذه النتائج غير حاسمة. [ 26 ] ولم يبدأ استخدام MPI-IO على نطاق واسع إلا بعد تطبيق فكرة الإدخال/الإخراج الجماعي [ 27 ] في MPI-IO. يُعزز الإدخال/الإخراج الجماعي بشكل كبير عرض نطاق الإدخال/الإخراج للتطبيقات من خلال قيام العمليات بتحويل عمليات الإدخال/الإخراج الصغيرة وغير المتجاورة إلى عمليات كبيرة ومتجاورة، مما يُقلل من تكاليف التأمين والبحث في القرص. وبفضل فوائده الكبيرة في الأداء، أصبح MPI-IO أيضًا طبقة الإدخال/الإخراج الأساسية للعديد من مكتبات الإدخال/الإخراج الحديثة، مثل HDF5 و Parallel NetCDF . كما أدت شعبيتها إلى إجراء أبحاث حول تحسينات الإدخال/الإخراج الجماعي، مثل الإدخال/الإخراج المُراعي للتخطيط [ 28 ] وتجميع الملفات عبر الملفات. [ 29 ] [ 30 ]
التنفيذ الرسمي
- كان تطبيق MPICH ، الذي طوره مختبر أرغون الوطني (ANL) وجامعة ولاية ميسيسيبي ، أول تطبيق لمعيار MPI 1.x. وكانت شركة IBM من أوائل الشركات التي طبقت هذا المعيار، وقامت معظم شركات الحواسيب العملاقة في أوائل التسعينيات إما بتسويق MPICH أو بتطوير تطبيقاتها الخاصة. وكان LAM/MPI من مركز أوهايو للحواسيب العملاقة تطبيقًا مفتوح المصدر مبكرًا آخر. وواصل مختبر أرغون الوطني تطوير MPICH لأكثر من عقد، ويقدم الآن MPICH-4.3.0، الذي يطبق معيار MPI-4.1.
- تم تشكيل Open MPI (لا ينبغي الخلط بينه وبين OpenMP ) من خلال دمج FT-MPI و LA-MPI و LAM/MPI و PACX-MPI، وهو موجود في العديد من أجهزة الكمبيوتر العملاقة TOP-500 .
العديد من الجهود الأخرى هي مشتقات من MPICH و LAM وأعمال أخرى، بما في ذلك، على سبيل المثال لا الحصر، التطبيقات التجارية من HPE و Intel و Microsoft و NEC .
على الرغم من أن المواصفات تشترط وجود واجهة بلغة C و Fortran، إلا أن اللغة المستخدمة لتنفيذ MPI ليست مقيدة بمطابقة اللغة أو اللغات التي تسعى لدعمها أثناء التشغيل. تجمع معظم التطبيقات بين لغات C و C++ ولغة التجميع، وتستهدف مبرمجي C و C++ و Fortran. تتوفر روابط للعديد من اللغات الأخرى، بما في ذلك Perl و Python و R و Ruby و Java و CL (انظر #روابط اللغات ).
تنقسم واجهة التطبيق الثنائية (ABI) لتطبيقات MPI تقريبًا بين مشتقات MPICH و Open MPI ، بحيث يمكن استبدال مكتبة من عائلة معينة بأخرى من نفس العائلة، ولكن الاستبدال المباشر بين العائلات المختلفة غير ممكن. وتحتفظ هيئة الطاقة الذرية الفرنسية (CEA) بواجهة تغليف لتسهيل عمليات التبديل هذه. [ 31 ]
الأجهزة
يركز البحث في مجال أجهزة MPI على تطبيق MPI مباشرةً في الأجهزة، على سبيل المثال عبر معالج مدمج في الذاكرة ، وذلك بدمج عمليات MPI في الدوائر الدقيقة لرقائق ذاكرة الوصول العشوائي (RAM) في كل عقدة. وبناءً على ذلك، فإن هذا النهج مستقل عن لغة البرمجة ونظام التشغيل ووحدة المعالجة المركزية، ولكنه لا يمكن تحديثه أو إزالته بسهولة.
يتمثل نهج آخر في إضافة تسريع الأجهزة إلى جزء واحد أو أكثر من العملية، بما في ذلك معالجة الأجهزة لقوائم انتظار MPI واستخدام RDMA لنقل البيانات مباشرة بين الذاكرة ووحدة التحكم في واجهة الشبكة دون تدخل وحدة المعالجة المركزية أو نواة نظام التشغيل.
أغلفة المترجم
برنامج mpicc (وكذلك mpic++ و mpif90 وما إلى ذلك) هو برنامج يغلّف مُصرّفًا موجودًا لضبط علامات سطر الأوامر اللازمة عند تجميع التعليمات البرمجية التي تستخدم MPI. عادةً، يضيف البرنامج بعض العلامات التي تُمكّن من تجميع التعليمات البرمجية وربطها بمكتبة MPI. [ 32 ]
روابط اللغة
الروابط هي مكتبات تعمل على توسيع دعم MPI للغات أخرى عن طريق تغليف تطبيق MPI موجود مثل MPICH أو Open MPI.
البنية التحتية للغة المشتركة
يُعدّ كلٌّ من Pure Mpi.NET [ 33 ] وMPI.NET [ 34 ] تطبيقين مُدارين لبنية اللغة المشتركة (CLAN) في بيئة .NET ، وهما مشروع بحثي في جامعة إنديانا مرخص بموجب ترخيص مشابه لترخيص BSD . وهو متوافق مع Mono ، ويستفيد استفادة كاملة من بنى شبكة MPI الأساسية منخفضة زمن الاستجابة.
جافا
على الرغم من أن لغة جافا لا تملك ربطًا رسميًا بواجهة برمجة تطبيقات MPI، إلا أن العديد من المجموعات تحاول الربط بينهما، بدرجات متفاوتة من النجاح والتوافق. كانت إحدى المحاولات الأولى هي mpiJava لبريان كاربنتر، [ 35 ] وهي عبارة عن مجموعة من أغلفة واجهة جافا الأصلية (JNI) لمكتبة MPI محلية مكتوبة بلغة C، مما ينتج عنه تطبيق هجين ذو قابلية نقل محدودة، والذي يجب أيضًا تجميعه باستخدام مكتبة MPI المحددة المستخدمة.
مع ذلك، حدد هذا المشروع الأصلي أيضًا واجهة برمجة تطبيقات mpiJava [ 36 ] (وهي واجهة برمجة تطبيقات MPI فعلية للغة Java تتبع بشكل وثيق روابط C++ المكافئة)، والتي اعتمدتها مشاريع Java MPI اللاحقة. ومن واجهات برمجة التطبيقات الأقل استخدامًا واجهة MPJ، التي صُممت لتكون أكثر توجهاً نحو الكائنات وأقرب إلى اصطلاحات البرمجة الخاصة بشركة Sun Microsystems . [ 37 ] وبالإضافة إلى واجهة برمجة التطبيقات، يمكن أن تعتمد مكتبات Java MPI إما على مكتبة MPI محلية، أو أن تُنفذ وظائف تمرير الرسائل في Java، بينما توفر بعضها، مثل P2P-MPI، وظائف الند للند وتسمح بالتشغيل على منصات متعددة.
تنشأ بعض أصعب جوانب Java/MPI من خصائص Java، مثل غياب المؤشرات الصريحة ومساحة عناوين الذاكرة الخطية للكائنات، مما يجعل نقل المصفوفات متعددة الأبعاد والكائنات المعقدة غير فعال. تتضمن الحلول البديلة عادةً نقل سطر واحد في كل مرة، و/أو إجراء إلغاء تسلسل وتحويل صريحين في كل من طرفي الإرسال والاستقبال، ومحاكاة مصفوفات C أو Fortran باستخدام مصفوفة أحادية البعد، ومؤشرات إلى أنواع البيانات الأولية باستخدام مصفوفات أحادية العنصر، مما ينتج عنه أساليب برمجة بعيدة كل البعد عن معايير Java.
يُعدّ MPJ Express نظامًا آخر لتمرير الرسائل في جافا. [ 38 ] يمكن تشغيل الإصدارات الحديثة منه في بيئات الحوسبة العنقودية والمعالجات متعددة النوى. في بيئة الحوسبة العنقودية، يُمكنه تشغيل تطبيقات جافا بالتوازي على مجموعات الحوسبة السحابية. في هذه البيئة، تدعم مقابس جافا أو وصلات الإدخال/الإخراج المتخصصة، مثل Myrinet، تبادل الرسائل بين عمليات MPJ Express. كما يُمكنه أيضًا الاستفادة من تطبيق MPI الأصلي المكتوب بلغة C باستخدام جهازه الأصلي. أما في بيئة المعالجات متعددة النوى، فيتم تشغيل تطبيق جافا بالتوازي على معالجات متعددة النوى. في هذا الوضع، تُمثَّل عمليات MPJ Express بخيوط جافا.
جوليا
MATLAB
توجد بعض التطبيقات الأكاديمية لـ MPI باستخدام MATLAB . يحتوي MATLAB على مكتبة امتداد متوازية خاصة به تم تنفيذها باستخدام MPI و PVM .
أوكاميل
تُنفّذ وحدة OCamlMPI [ 40 ] مجموعة كبيرة من وظائف MPI، وهي قيد الاستخدام النشط في الحوسبة العلمية. وقد تمّ تحويل برنامج OCaml مؤلف من 11000 سطر إلى برنامج MPI باستخدام هذه الوحدة، مع إضافة 500 سطر من التعليمات البرمجية وإعادة هيكلة طفيفة، وقد حقق البرنامج نتائج ممتازة على ما يصل إلى 170 عقدة في حاسوب فائق. [ 41 ]
طبيب عام/طبيب عام
يمكن بناء PARI/GP [ 42 ] لاستخدام MPI كمحرك متعدد الخيوط، مما يسمح بتشغيل برامج PARI وGP المتوازية على مجموعات MPI دون تعديل.
بايثون
تتضمن أغلفة MPI التي يتم صيانتها بنشاط للغة بايثون ما يلي: mpi4py، [ 43 ] وnumba-mpi [ 44 ] وnumba-jax. [ 45 ]
وتشمل التطورات المتوقفة: pyMPI و pypar و [ 46 ] و MYMPI [ 47 ] والوحدة الفرعية MPI في ScientificPython .
R
تتضمن روابط R لـ MPI كلاً من Rmpi [ 48 ] و pbdMPI [ 49 ] ، حيث يركز Rmpi على التوازي بين المدير والعاملين، بينما يركز pbdMPI على التوازي SPMD . يدعم كلا التطبيقين Open MPI أو MPICH2 بشكل كامل .
برنامج نموذجي
إليكم برنامج "Hello, World!" مكتوب بلغة C باستخدام MPI. في هذا المثال، نرسل رسالة "hello" إلى كل معالج، ونتعامل معها بشكل بسيط، ونعيد النتائج إلى العملية الرئيسية، ونطبع الرسائل.
/* برنامج اختبار MPI "Hello World" */ #include <assert.h> #include <stdio.h> #include <string.h> #include <mpi.h>int main ( int argc , char ** argv ) { char buf [ 256 ]; int my_rank , num_procs ;/* تهيئة البنية التحتية اللازمة للاتصال */ MPI_Init ( & argc , & argv );/* تحديد هذه العملية */ MPI_Comm_rank ( MPI_COMM_WORLD , & my_rank );/* معرفة عدد العمليات النشطة إجمالاً */ MPI_Comm_size ( MPI_COMM_WORLD , & num_procs );/* حتى هذه اللحظة، كانت جميع البرامج تؤدي نفس الوظيفة تمامًا. هنا، نتحقق من الرتبة لتمييز أدوار البرامج */ إذا كانت ( رتبتي == 0 ) { int رتبة_أخرى ؛ printf ( "لدينا %i عملية. \n " , عدد_العمليات )؛/* إرسال الرسائل إلى جميع العمليات الأخرى */ for ( other_rank = 1 ; other_rank < num_procs ; other_rank ++ ) { sprintf ( buf , "Hello %i!" , other_rank ); MPI_Send ( buf , 256 , MPI_CHAR , other_rank , 0 , MPI_COMM_WORLD ); }/* استلام الرسائل من جميع العمليات الأخرى */ for ( other_rank = 1 ; other_rank < num_procs ; other_rank ++ ) { MPI_Recv ( buf , 256 , MPI_CHAR , other_rank , 0 , MPI_COMM_WORLD , MPI_STATUS_IGNORE ); printf ( "%s \n " , buf ); }} آخر {/* استلام رسالة من العملية رقم 0 */ MPI_Recv ( buf , 256 , MPI_CHAR , 0 , 0 , MPI_COMM_WORLD , MPI_STATUS_IGNORE ); assert ( memcmp ( buf , "Hello " , 6 ) == 0 );/* إرسال رسالة إلى العملية رقم 0 */ sprintf ( buf , "العملية %i حاضرة للعمل." , my_rank ); MPI_Send ( buf , 256 , MPI_CHAR , 0 , 0 , MPI_COMM_WORLD );}/* إزالة بنية الاتصال */ MPI_Finalize (); return 0 ; }عند تشغيله بأربع عمليات، يجب أن ينتج عنه المخرجات التالية: [ 50 ]
$ mpicc example.c && mpiexec -n 4 ./a.out لدينا 4 عمليات. العملية 1: الحضور للعمل. العملية الثانية: الحضور للعمل. العملية رقم 3: الحضور للعمل.
هذا mpiexecأمر يُستخدم لتنفيذ البرنامج التجريبي بأربع عمليات ، كل منها نسخة مستقلة من البرنامج أثناء التشغيل، ومُخصصة لها رتب (أي معرّفات رقمية) 0 و1 و2 و3. mpiexecيُوصى بهذا الاسم وفقًا لمعيار MPI، مع أن بعض التطبيقات تُوفر أمرًا مشابهًا تحت هذا الاسم mpirun. MPI_COMM_WORLDهو المُتصل الذي يتكون من جميع العمليات.
يُسهّل ذلك نموذج برمجة "برنامج واحد، بيانات متعددة" ( SPMD )، ولكنه ليس شرطًا أساسيًا؛ إذ تسمح العديد من تطبيقات MPI بتشغيل ملفات تنفيذية متعددة ومختلفة ضمن نفس مهمة MPI. لكل عملية رتبتها الخاصة، وعدد العمليات الإجمالي في العالم، وإمكانية التواصل فيما بينها إما عبر اتصال مباشر (إرسال/استقبال)، أو عبر اتصال جماعي بين المجموعة. يكفي أن توفر MPI برنامجًا بنمط SPMD مع MPI_COMM_WORLDرتبته الخاصة وحجم العالم لتمكين الخوارزميات من تحديد ما يجب فعله. في الحالات الأكثر واقعية، تتم إدارة الإدخال/الإخراج بعناية أكبر مما هو عليه في هذا المثال. لا تُحدد MPI كيفية عمل الإدخال/الإخراج القياسي (stdin، stdout، stderr) على نظام معين. يعمل بشكل عام كما هو متوقع على العملية ذات الرتبة 0، وتقوم بعض التطبيقات أيضًا بالتقاط وتوجيه مخرجات العمليات الأخرى.
تستخدم MPI مفهوم العملية بدلاً من المعالج. يقوم وقت تشغيل MPI بربط نسخ البرنامج بالمعالجات . وبهذا المعنى، يمكن ربط الجهاز المتوازي بمعالج فعلي واحد، أو بـ N معالج، حيث N هو عدد المعالجات المتاحة، أو حتى عدد بينهما. ولتحقيق أقصى سرعة للتوازي، يتم استخدام عدد أكبر من المعالجات الفعلية. يُعدّل هذا المثال سلوكه وفقًا لحجم العالم N ، لذا فهو يسعى أيضًا إلى التوسع وفقًا لتكوين وقت التشغيل دون الحاجة إلى إعادة تجميع لكل اختلاف في الحجم، على الرغم من أن قرارات وقت التشغيل قد تختلف بناءً على مقدار التزامن المتاح.
اعتماد MPI-2
كان اعتماد MPI-1.2 واسع الانتشار، لا سيما في الحوسبة العنقودية، بينما كان قبول MPI-2.1 محدودًا. وتشمل المشكلات ما يلي:
- تتضمن تطبيقات MPI-2 إدارة الإدخال/الإخراج وإدارة العمليات الديناميكية، كما أن حجم البرمجيات الوسيطة أكبر بكثير. لا تدعم معظم المواقع التي تستخدم أنظمة جدولة الدفعات إدارة العمليات الديناميكية. تحظى ميزة الإدخال/الإخراج المتوازي في MPI-2 بقبول واسع.
- تم تطوير العديد من برامج MPI-1.2 قبل MPI-2. وقد أدت مخاوف قابلية النقل في البداية إلى إبطاء عملية التبني، على الرغم من أن الدعم الأوسع قد قلل من ذلك.
- تستخدم العديد من تطبيقات MPI-1.2 مجموعة فرعية فقط من هذا المعيار (16-25 وظيفة) دون الحاجة الفعلية لوظائف MPI-2.
مستقبل
تبدو بعض جوانب مستقبل MPI راسخة، بينما تبدو جوانب أخرى أقل وضوحًا. اجتمع منتدى MPI مجددًا في عام 2007 لتوضيح بعض مشكلات MPI-2 واستكشاف تطويرات محتملة لـ MPI-3، مما أسفر عن إصداري MPI-3.0 (سبتمبر 2012) [ 51 ] وMPI-3.1 (يونيو 2015). [ 52 ] استمر التطوير مع الموافقة على MPI-4.0 في 9 يونيو 2021، [ 53 ] ثم تمت الموافقة على MPI-4.1 في 2 نوفمبر 2023. [ 54 ] ، وأخيرًا تمت الموافقة على MPI-5.0 في 5 يونيو 2025، مما أضاف وظائف جديدة هامة، أبرزها إضافة واجهة ثنائية قياسية للتطبيقات ( ABI). [ 55 ]
تشهد البنى المعمارية تطورًا ملحوظًا، مع زيادة التزامن الداخلي (المعالجات متعددة النوى )، وتحسين دقة التحكم في التزامن (الخيوط، والتقارب)، وزيادة مستويات التسلسل الهرمي للذاكرة . وتستفيد البرامج متعددة الخيوط من هذه التطورات بسهولة أكبر من التطبيقات أحادية الخيط. وقد أدى ذلك بالفعل إلى ظهور معايير منفصلة ومتكاملة للمعالجة المتعددة المتناظرة ، وتحديدًا OpenMP . يحدد MPI-2 كيفية تعامل التطبيقات المتوافقة مع المعايير مع مشكلات تعدد الخيوط، ولكنه لا يشترط أن تكون التطبيقات متعددة الخيوط، أو حتى آمنة للخيوط. ويضيف MPI-3 إمكانية استخدام التوازي في الذاكرة المشتركة داخل العقدة. وتقدم تطبيقات MPI، مثل Adaptive MPI وHybrid MPI وFine-Grained MPI وMPC وغيرها، امتدادات لمعيار MPI تعالج تحديات مختلفة في MPI.
كتب عالم الفيزياء الفلكية جوناثان دورسي مقالاً رأياً وصف فيه MPI بأنه قديم الطراز، مشيراً إلى تقنيات أحدث مثل لغة Chapel ، و Unified Parallel C ، وHadoop ، وSpark ، و Flink . [ 56 ] في الوقت نفسه، تعتمد جميع مشاريع مشروع الحوسبة فائقة السرعة تقريباً بشكل صريح على MPI؛ وقد ثبت أن MPI قابل للتوسع ليشمل أكبر الأجهزة اعتباراً من أوائل العقد الثاني من القرن الحادي والعشرين، ويُعتقد على نطاق واسع أنه سيظل ذا صلة لفترة طويلة قادمة.
انظر أيضاً
مراجع
- ↑ "واجهة تمرير الرسائل :: الحوسبة عالية الأداء" . hpc.nmsu.edu . تم الاطلاع عليه بتاريخ 2022-08-06 .
- ↑ ووكر، د. و. (أغسطس 1992). معايير تمرير الرسائل في بيئة ذاكرة موزعة (ملف PDF) (تقرير). مختبر أوك ريدج الوطني، تينيسي (الولايات المتحدة الأمريكية)، مركز أبحاث الحوسبة المتوازية (CRPC). ص 25. OSTI 10170156. ORNL/TM-12147. مؤرشف من الأصل (ملف PDF) بتاريخ 15 نوفمبر 2023. تم الاطلاع عليه بتاريخ 18 أغسطس 2019 .
- ↑ منتدى MPI، للشركات (15-19 نوفمبر 1993). "MPI: واجهة تمرير الرسائل". وقائع مؤتمر ACM/IEEE للحوسبة الفائقة لعام 1993. الحوسبة الفائقة 93. بورتلاند، أوريغون، الولايات المتحدة الأمريكية: ACM. الصفحات 878-883 . doi : 10.1145/169627.169855 . ISBN 0-8186-4340-4.
- ↑ "واجهة تمرير الرسائل" ، ويكيبيديا ، 23 ديسمبر 2025 ، تاريخ الاطلاع 3 يناير 2026
- ↑ نيلسن، فرانك (2016). "2. مقدمة إلى MPI: واجهة تمرير الرسائل" . مقدمة إلى الحوسبة عالية الأداء باستخدام MPI لعلوم البيانات . سبرينغر. ص 195-211 . ISBN 978-3-319-21903-5.
- ^ جروب، لوسك وسكيلوم 1996 ، ص. 3.
- ↑ سور، سايانتان؛ كوب، ماثيو جيه؛ باندا، داباليسوار كيه (11 نوفمبر 2006). "MPI عالي الأداء وقابل للتوسع عبر InfiniBand مع تقليل استخدام الذاكرة: تحليل معمق للأداء". وقائع مؤتمر ACM/IEEE للحوسبة الفائقة لعام 2006 – SC '06 . ACM. ص 105. doi : 10.1145/1188455.1188565 . ISBN 978-0769527000. S2CID 818662 .
- ↑ "واجهة تمرير الرسائل" ، ويكيبيديا ، 23 ديسمبر 2025 ، تاريخ الاطلاع 3 يناير 2026
- ↑ KNEM: اتصال MPI عالي الأداء داخل العقدة : "يستخدم MPICH2 (منذ الإصدار 1.1.1) تقنية KNEM في DMA LMT لتحسين أداء الرسائل الكبيرة داخل عقدة واحدة. كما يتضمن Open MPI دعم KNEM في مكون SM BTL الخاص به منذ الإصدار 1.5. بالإضافة إلى ذلك، يتضمن NetPIPE واجهة خلفية لتقنية KNEM منذ الإصدار 3.7.2."
- ↑ "الأسئلة الشائعة: ضبط خصائص وقت التشغيل لاتصالات MPI sm" . www.open-mpi.org .
- ↑ يقدم معيار MPI-3 نهجًا آخر للبرمجة الهجينة التي تستخدم نموذج الذاكرة المشتركة MPI (SHM) الجديد .
- ↑ الذاكرة المشتركة وMPI 3.0 : "يمكن إجراء العديد من الاختبارات المعيارية لتحديد الطريقة الأمثل لتطبيق معين، سواء باستخدام MPI + OpenMP أو امتدادات MPI SHM. في حالة اختبار بسيطة نسبيًا، بلغت الزيادة في السرعة مقارنةً بالإصدار الأساسي الذي استخدم الاتصال من نقطة إلى نقطة ما يصل إلى 5 أضعاف، وذلك بحسب الرسالة."
- ↑ استخدام الذاكرة المشتركة MPI-3 كنظام برمجة متعدد النوى (شرائح عرض تقديمي بصيغة PDF).
- ↑ جدول المحتويات — سبتمبر 1994، 8 (3-4) . Hpc.sagepub.com. تم الاطلاع عليه بتاريخ 24-03-2014.
- ↑ وثائق معهد ماكس بلانك . Mpi-forum.org. تم الاطلاع عليها بتاريخ 24-03-2014.
- ^ جروب، لوسك وسكيلوم 1999ب ، الصفحات من 4 إلى 5 .
- ↑ MPI: معيار واجهة تمرير الرسائل. الإصدار 3.1، منتدى واجهة تمرير الرسائل، 4 يونيو 2015 على www.mpi-forum.org.
- ↑ اجتماع منتدى MPI في HLRS لمناقشة مسار MPI 5.0 . تم الاطلاع عليه بتاريخ 30-09-2025.
- ↑ "واجهة تمرير الرسائل" ، ويكيبيديا ، 23 ديسمبر 2025 ، تاريخ الاطلاع 3 يناير 2026
- 1 2 "قواعد مطابقة الأنواع" . mpi-forum.org .
- ↑ "صفحة دليل MPI_Gather(3) (الإصدار 1.8.8)" . www.open-mpi.org .
- ↑ "MPI_Get_address" . www.mpich.org .
- ↑ الأساس المنطقي لآلية هيكل/محتوى Boost.MPI (تم إنتاج رسوم بيانية لمقارنة الأداء باستخدام NetPIPE )
- ^ جروب، لوسك وسكيلينج 1999ب ، ص. 7 خطأ harvnb: لا يوجد هدف: CITEREFGroppLuskSkjelling1999b ( مساعدة )
- ^ Gropp, Lusk & Skjelling 1999b ، الصفحات من 5 إلى 6 خطأ harvnb: لا يوجد هدف: CITEREFGroppLuskSkjelling1999b ( مساعدة )
- ↑ "عمليات ضرب المصفوفة المتفرقة بالمتجهات باستخدام مكتبة MPI I/O" (PDF) .
- ↑ "غربلة البيانات والإدخال/الإخراج الجماعي في ROMIO" (ملف PDF) . IEEE. فبراير 1999.
- ↑ تشين، يونغ؛ صن، شيان-هي؛ ثاكور، راجيف؛ روث، فيليب سي؛ غروب، ويليام دي. (سبتمبر 2011). "LACIO: استراتيجية جديدة للإدخال/الإخراج الجماعي لأنظمة الإدخال/الإخراج المتوازية". ندوة IEEE الدولية للمعالجة المتوازية والموزعة لعام 2011. IEEE. الصفحات 794-804 . CiteSeerX 10.1.1.699.8972 . doi : 10.1109/IPDPS.2011.79 . ISBN 978-1-61284-372-8. S2CID 7110094 .
- ↑ تينغ وانغ؛ كيفن فاسكو؛ تشو ليو؛ هوي تشن؛ ويكوان يو (2016). "تحسين الإدخال/الإخراج المتوازي باستخدام تجميع الحزم المتقاطعة". المجلة الدولية لتطبيقات الحوسبة عالية الأداء . 30 (2): 241-256 . doi : 10.1177/1094342015618017 . S2CID 12067366 .
- ↑ وانغ، تينغ؛ فاسكو، كيفن؛ ليو، تشو؛ تشين، هوي؛ يو، ويكوان (نوفمبر 2014). "BPAR: إطار عمل تجميع متوازي قائم على الحزم لتنفيذ الإدخال/الإخراج المنفصل". ورشة العمل الدولية لعام 2014 حول أنظمة الحوسبة القابلة للتوسع كثيفة البيانات . IEEE. الصفحات 25-32 . doi : 10.1109/DISCS.2014.6 . ISBN 978-1-4673-6750-9. S2CID 2402391 .
- ↑ cea-hpc. "cea-hpc/wi4mpi: واجهة تغليف لـ MPI" . GitHub .
- ↑ mpicc . Mpich.org. تم الاطلاع عليه بتاريخ 24-03-2014.
- ↑ "移住の際は空き家バンクと自治体の支援制度を利用しよう - あいち移住ナビ" . 30 يونيو 2024.
- ↑ "MPI.NET: مكتبة C# عالية الأداء لتمرير الرسائل" . www.osl.iu.edu .
- ↑ "الصفحة الرئيسية لـ mpiJava" . www.hpjava.org .
- ↑ "مقدمة إلى واجهة برمجة تطبيقات mpiJava" . www.hpjava.org .
- ↑ "مواصفات واجهة برمجة تطبيقات MPJ" . www.hpjava.org .
- ↑ "مشروع MPJ Express" . mpj-express.org .
- ↑ JuliaParallel/MPI.jl ، Parallel Julia، 3 أكتوبر 2019 ، تاريخ الاسترجاع 8 أكتوبر 2019
- ↑ "Xavier Leroy - Software" . cristal.inria.fr .
- ↑ أرشيف قائمة بريد كاميل > رسالة من يارون م. مينسكي . Caml.inria.fr (15-07-2003). تم الاطلاع عليها بتاريخ 24-03-2014.
- ↑ "مقدمة في البرمجة الجينية المتوازية" (ملف PDF) . pari.math.u-bordeaux.fr .
- ↑ "MPI لـ Python — وثائق MPI لـ Python 4.1.0" . mpi4py.readthedocs.io .
- ↑ "وصف المشروع: Numba-MPI" . pypi.org .
- ↑ "mpi4jax — وثائق mpi4jax" . mpi4jax.readthedocs.io .
- ↑ "أرشيف كود جوجل - تخزين طويل الأمد لاستضافة مشاريع كود جوجل" . code.google.com .
- ↑ الآن جزء من بايدوسا
- ↑ يو، هاو (2002). "Rmpi: الحوسبة الإحصائية المتوازية في R" . أخبار R.
- ↑ تشين، وي-تشين؛ أوستروشوف، جورج؛ شميدت، درو؛ باتيل، براغنيشكومار؛ يو، هاو (2012). "pbdMPI: البرمجة باستخدام البيانات الضخمة - واجهة MPI" .
- ↑ تم إنتاج مقتطف الإخراج على نظام سطح مكتب لينكس عادي مثبت عليه Open MPI. عادةً ما تضع توزيعات لينكس أمر mpicc في حزمة openmpi-devel أو libopenmpi-dev، وأحيانًا تتطلب تشغيل "module add mpi/openmpi-x86_64" أو ما شابه قبل توفر mpicc وmpiexec.
- ↑ "MPI: معيار واجهة تمرير الرسائل الإصدار 3.0" (ملف PDF) . مؤرشف من النسخة الأصلية (ملف PDF) بتاريخ 19-03-2013.
- ↑ "MPI: معيار واجهة تمرير الرسائل الإصدار 3.1" (ملف PDF) . مؤرشف من الأصل (ملف PDF) بتاريخ 2015-07-06.
- ↑ "MPI: معيار واجهة تمرير الرسائل، الإصدار 4.0" (ملف PDF) . 9 يونيو 2021. مؤرشف من النسخة الأصلية (ملف PDF) بتاريخ 28 يونيو 2021.
- ↑ "MPI: معيار واجهة تمرير الرسائل، الإصدار 4.1" (ملف PDF) . 2023-11-02. مؤرشف من النسخة الأصلية (ملف PDF) بتاريخ 2023-11-15.
- ↑ "MPI: معيار واجهة تمرير الرسائل" (ملف PDF) . www.mpi-forum.org .
- ↑ "الحوسبة عالية الأداء تحتضر، وتقنية MPI تقضي عليها " . www.dursi.ca
للمزيد من القراءة
- تستند هذه المقالة إلى مواد مأخوذة من واجهة تمرير الرسائل في قاموس الحوسبة المجاني على الإنترنت قبل 1 نوفمبر 2008 وتم دمجها بموجب شروط "إعادة الترخيص" الخاصة بـ GFDL ، الإصدار 1.3 أو أحدث.
- أوياما، يوكيا؛ ناكانو، يونيو (1999) RS/6000 SP: برمجة MPI العملية ، ITSO
- فوستر، إيان (1995) تصميم وبناء البرامج المتوازية (عبر الإنترنت) أديسون-ويسلي ISBN 0-201-57594-9الفصل الثامن: واجهة تمرير الرسائل
- ويجيسوريا، فيراج برايان (29-12-2010) داني ويب: نموذج برمجي لضرب المصفوفات باستخدام أسلوب البرمجة المتوازية MPI
- استخدام سلسلة MPI:
- غروب، ويليام؛ لوسك، إيوينغ؛ سكيليوم، أنتوني (1994). استخدام MPI: البرمجة المتوازية المحمولة باستخدام واجهة تمرير الرسائل . كامبريدج، ماساتشوستس، الولايات المتحدة الأمريكية: سلسلة الحوسبة العلمية والهندسية، مطبعة معهد ماساتشوستس للتكنولوجيا. ISBN 978-0-262-57104-3.
- غروب، ويليام؛ لوسك، إيوينغ؛ سكيليوم، أنتوني (1999أ). استخدام MPI، الطبعة الثانية: البرمجة المتوازية المحمولة باستخدام واجهة تمرير الرسائل . كامبريدج، ماساتشوستس، الولايات المتحدة الأمريكية: سلسلة الحوسبة العلمية والهندسية، مطبعة معهد ماساتشوستس للتكنولوجيا. ISBN 978-0-262-57132-6.
- غروب، ويليام؛ لوسك، إيوينغ؛ سكيليوم، أنتوني (1999ب). استخدام MPI-2: الميزات المتقدمة لواجهة تمرير الرسائل . مطبعة معهد ماساتشوستس للتكنولوجيا . ISBN 978-0-262-57133-3.
- غروب، ويليام؛ لوسك، إيوينغ؛ سكيليوم، أنتوني (2014). استخدام MPI، الطبعة الثالثة: البرمجة المتوازية المحمولة باستخدام واجهة تمرير الرسائل . كامبريدج، ماساتشوستس، الولايات المتحدة الأمريكية: سلسلة الحوسبة العلمية والهندسية، مطبعة معهد ماساتشوستس للتكنولوجيا. ISBN 978-0-262-52739-2.
- غروب، ويليام؛ لوسك، إيوينغ؛ سكيليوم، أنتوني (1996). "تنفيذ عالي الأداء وقابل للنقل لواجهة تمرير الرسائل MPI". الحوسبة المتوازية . 22 (6): 789-828 . CiteSeerX 10.1.1.102.9485 . doi : 10.1016/0167-8191(96)00024-5 .
- باتشيكو، بيتر س. (1997) البرمجة المتوازية باستخدام MPI . البرمجة المتوازية باستخدام MPI، 500 صفحة. مورغان كوفمان، ISBN 1-55860-339-5.
- سلسلة المراجع الكاملة من MPI :
- سنير، مارك؛ أوتو، ستيف دبليو؛ هوس-ليدرمان، ستيفن؛ ووكر، ديفيد دبليو؛ دونغارا، جاك جيه. (1995) MPI: المرجع الكامل . مطبعة معهد ماساتشوستس للتكنولوجيا، كامبريدج، ماساتشوستس، الولايات المتحدة الأمريكية. ISBN 0-262-69215-5
- سنير، مارك؛ أوتو، ستيف دبليو؛ هوس-ليدرمان، ستيفن؛ ووكر، ديفيد دبليو؛ دونغارا، جاك جيه. (1998) MPI - المرجع الكامل: المجلد 1، MPI Core . مطبعة معهد ماساتشوستس للتكنولوجيا، كامبريدج، ماساتشوستس. ISBN 0-262-69215-5
- غروب، ويليام؛ هوس-ليدرمان، ستيفن؛ لومسدين، أندرو؛ لوسك، إيوينغ؛ نيتزبيرغ، بيل؛ سافير، ويليام؛ وسنير، مارك (1998) MPI - المرجع الكامل: المجلد 2، ملحقات MPI-2 . مطبعة معهد ماساتشوستس للتكنولوجيا، كامبريدج، ماساتشوستس. ISBN 978-0-262-57123-4
- فيروزيان، محمد؛ نومينسن، أو. (2002) المعالجة المتوازية عبر MPI و OpenMP ، لينكس إنتربرايز، 10/2002
- فانيشي، ماركو (1999) نماذج متوازية للحوسبة العلمية. في وقائع المدرسة الأوروبية للكيمياء الحاسوبية (1999، بيروجيا، إيطاليا)، العدد 75 في سلسلة محاضرات في الكيمياء ، الصفحات 170-183. سبرينغر، 2000.
- Bala, Bruck, Cypher, Elustondo, A Ho, CT Ho, Kipnis, Snir (1995) " مكتبة اتصالات جماعية محمولة وقابلة للضبط لأجهزة الكمبيوتر المتوازية القابلة للتوسع " في IEEE Transactions on Parallel and Distributed Systems," المجلد 6، العدد 2، الصفحات 154-164، فبراير 1995.
روابط خارجية
- واجهات برمجة التطبيقات
- الحوسبة المتوازية
