هذا هو الأمر mpy الذي يمكن تشغيله في مزود الاستضافة المجانية OnWorks باستخدام إحدى محطات العمل المجانية المتعددة عبر الإنترنت مثل Ubuntu Online أو Fedora Online أو محاكي Windows عبر الإنترنت أو محاكي MAC OS عبر الإنترنت
برنامج:
اسم
mpy - رسالة تمر Yorick
موجز
mpirun -np mp_size mpy [-j pfile1.i [-j pfile2.i [ ... ]]] [ -أنا file1.i [ -أنا file2.i [
...]]]
mpirun -np mp_size mpy -حزمة ملف
الوصف
يوريك هي لغة مفسرة مثل Basic أو Lisp ، لكنها أسرع بكثير. ارى يوريك (1) إلى
تعلم المزيد عنها.
مبي هي نسخة موازية من يوريك استنادًا إلى واجهة تمرير الرسائل (MPI). ال
تعتمد البنية الدقيقة لبدء عمل موازٍ على بيئة MPI الخاصة بك. من الممكن ان تكون
ضروري لإطلاق عفريت خاص قبل الاتصال ميرون أو أمر مكافئ.
تفسيرات
واجهة حزمة mpy مناسبة لمكتبة البرمجة المتوازية MPI. MPI تعني
واجهة تمرير الرسائل ؛ الفكرة هي ربط عدة حالات من yorick
التواصل فيما بينهم عبر الرسائل. يمكن أن تؤدي Mpy إما بسيطة ، متوازية للغاية
المهام كبرامج مفسرة بحتة ، أو يمكن أن تبدأ وتوجه مجمعة بشكل تعسفي معقدة
الحزم المجانية لاستخدام MPI API المترجم. لا يقصد تفسير API
أن يكون غلاف MPI ؛ بدلا من ذلك يتم تجريده إلى الحد الأدنى.
هذا هو الإصدار 2 من mpy (صدر عام 2010) ؛ إنه غير متوافق مع الإصدار 1 من mpy
(تم إصداره في منتصف التسعينيات) ، لأن الإصدار 1990 به العديد من عيوب التصميم مما يجعله شديد الأهمية
من الصعب كتابة برامج خالية من ظروف العرق ، ويستحيل توسيع نطاقها إلى الملايين
من المعالجات. ومع ذلك ، يمكنك تشغيل معظم برامج الإصدار 1 mpy ضمن الإصدار 2 عن طريق القيام بذلك
mp_include ، "mpy1.i" قبل تضمين mp_include أي ملف يحدد مهمة mpy1 المتوازية (أي
قبل أي ملف يحتوي على استدعاء لـ mp_task.)
الأستعمال ملاحظات
لم يتم تحديد بيئة MPI بالفعل بواسطة المعيار ؛ البيئات الحالية
خام جدًا ، ويفضل بشدة الوظائف الدفعية غير التفاعلية. عدد العمليات
ثابت قبل أن يبدأ MPI ؛ كل عملية لها رتبة ، رقم من 0 إلى واحد أقل من
عدد العمليات. يمكنك استخدام التصنيف كعنوان لإرسال الرسائل والعملية
يمكن أن يؤدي تلقي الرسالة إلى التحقق لمعرفة الرتب التي أرسلت رسائل إليها ، وبالطبع
تلقي تلك الرسائل.
المشكلة الرئيسية في كتابة برنامج تمرير الرسائل هي التعامل مع الأحداث أو الرسائل
الوصول في أمر غير مخطط له. تضمن MPI فقط إرسال تسلسل من الرسائل بواسطة
ستصل الرتبة A إلى المرتبة B بالترتيب المرسل. لا يوجد ضمان حول ترتيب
وصول تلك الرسائل المتعلقة بالرسائل المرسلة إلى B من المرتبة الثالثة C. In
بشكل خاص ، افترض أن A يرسل رسالة إلى B ، ثم يرسل A رسالة إلى C (أو حتى التبادلات
عدة رسائل مع C) مما ينتج عنه C إرسال رسالة إلى B. الرسالة من C.
قد تصل إلى B قبل الرسالة من A. برنامج MPI الذي لا يسمح بذلك
الاحتمال له خلل يسمى "حالة السباق". قد تكون ظروف العرق دقيقة للغاية ،
خاصة عندما يكون عدد العمليات كبيرًا.
تتكون الواجهة الأساسية mpy المفسرة من متغيرين:
mp_size = عدد العمليات
mp_rank = رتبة هذه العملية وأربع وظائف:
mp_send ، إلى ، msg ؛ // أرسل الرسالة إلى رتبة "إلى"
msg = mp_recv (من) ؛ // تلقي رسالة من رتبة "من"
الرتب = mp_probe (كتلة) ؛ // الاستعلام عن مرسلي الرسائل المعلقة
mp_exec ، سلسلة ؛ // تحليل وتنفيذ سلسلة في كل رتبة
يمكنك استدعاء mp_exec في المرتبة 0 لبدء مهمة موازية. عندما تم إنشاء البرنامج الرئيسي على هذا النحو
ينتهي ، تعود جميع الرتب بخلاف الرتبة 0 إلى حلقة خاملة ، في انتظار التالية
mp_exec. تلتقط الرتبة 0 سطر الإدخال التالي من stdin (أي تنتظر الإدخال عندها
موجه في جلسة تفاعلية) ، أو إنهاء جميع العمليات إذا لم يكن هناك المزيد من المدخلات
متاح في جلسة دفعة.
تعدل حزمة mpy كيفية معالجة yorick لتوجيه المحلل اللغوي #include والتضمين
وتتطلب وظائف. وهي ، إذا كانت هناك مهمة موازية قيد التشغيل (أي ، بدأت الوظيفة
بواسطة mp_exec) ، تصبح هذه كلها عمليات جماعية. وهذا يعني أن المرتبة 0 تقرأ الكل
محتويات الملف ، ويرسل المحتويات إلى العمليات الأخرى كرسالة MPI (مثل
mp_exec لمحتويات الملف). كل عملية بخلاف المرتبة 0 تعمل فقط أثناء
مهام متوازية خارج مهمة موازية عند تشغيل الرتبة 0 فقط (وجميع الرتب الأخرى
ينتظرون mp_exec التالي) ، والتوجيه #include والتضمين والمطلوب
تعود الوظائف إلى عملياتها التسلسلية المعتادة ، مما يؤثر فقط على الرتبة 0.
عندما يبدأ mpy ، يكون في الوضع المتوازي ، بحيث يتم تضمين جميع الملفات yorick عند تشغيله
يبدأ (الملفات الموجودة في Y_SITE / i0) يتم تضمينها كعمليات جماعية. بدون هذا
ميزة ، كل عملية yorick ستحاول فتح وقراءة بدء التشغيل بما في ذلك الملفات ،
زيادة التحميل على نظام الملفات قبل بدء تشغيل mpy. تمرير محتويات هذه
الملفات كرسائل MPI هي الطريقة الوحيدة لضمان وجود نطاق ترددي كافٍ لكل ملف
عملية قراءة محتويات ملف واحد.
الملف الأخير الذي تم تضمينه عند بدء التشغيل هو إما الملف المحدد في خيار الدفعة ، أو
ملف custom.i. لتجنب مشاكل التعليمات البرمجية في custom.i والتي قد لا تكون آمنة لـ
التنفيذ المتوازي ، لا يبحث mpy عن custom.i ، بل يبحث عن custommp.i بدلاً من ذلك. ال
يتم تنفيذ التعليمات الموجودة في الملف -batch أو في custommp.i في الوضع التسلسلي بالرتبة 0
فقط. وبالمثل ، تتجاوز mpy وظيفة process_argv المعتادة ، بحيث تكون -i وغيرها
تتم معالجة خيارات سطر الأوامر فقط في المرتبة 0 في الوضع التسلسلي. القصد من كل هذا
الحالات هي جعل -batch أو custommp.i أو -i تضمين الملفات يتم تنفيذها فقط في المرتبة 0 ، مثل
إذا كنت قد كتبتها هناك بشكل تفاعلي. أنت حر في الاتصال بـ mp_exec من أي من هؤلاء
لبدء مهام متوازية ، لكن الملف نفسه تسلسلي.
يتم إضافة خيار سطر أوامر إضافي إلى المجموعة المعتادة:
mpy -j somefile.i
يتضمن somefile.i في الوضع المتوازي في جميع الرتب (مرة أخرى ، -i other.i يشمل other.i فقط
في المرتبة 0 في الوضع التسلسلي). إذا كانت هناك خيارات -j متعددة ، فسيتم تضمين التوازي
بترتيب سطر الأوامر. إذا تم خلط خياري -j و -i ، فإن الكل -j يشمل يحدث
قبل أي -i يشمل.
كأثر جانبي لتعقيد تضمين الوظائف في mpy ، فإن ميزة التحميل التلقائي هي
معاق؛ إذا كانت التعليمات البرمجية الخاصة بك تؤدي بالفعل إلى تضمين عن طريق استدعاء دالة محملة تلقائيًا ، mpy
سوف يتوقف مع وجود خطأ. يجب عليك صراحة تحميل أي وظائف ضرورية للتوازي
المهام التي تستخدم تتطلب وظيفة تستدعي نفسها داخل مهمة موازية.
يمكن للدالة mp_send إرسال أي مصفوفة رقمية yorick (أنواع char ، short ، int ، long ،
عائم أو مزدوج أو معقد) أو قيمة سلسلة عددية. عملية إرسال الرسالة
عبر MPI يحافظ فقط على عدد العناصر ، لذلك ينتج mp_recv قيمة عددية فقط أو
مصفوفة من القيم أحادية الأبعاد ، بغض النظر عن الأبعاد التي تم تمريرها إلى mp_send.
تتطلب منك الدالة mp_recv تحديد مرسل الرسالة التي تقصدها
تسلم. يتم حظره حتى تصل رسالة بالفعل من هذا المرسل ، ويصطف أي منها في قائمة الانتظار
الرسائل التي قد تصل مسبقًا من المرسلين الآخرين. ستكون الرسائل في قائمة الانتظار
استعادته الطلب الذي تم استلامه عند استدعاء mp_recv للمرسل المطابق. ال
تسهل ميزة قائمة الانتظار بشكل كبير تجنب أبسط أنواع حالات السباق
عندما تكتب برامج موازية مفسرة.
تعرض الدالة mp_probe قائمة بجميع مرسلي الرسائل في قائمة الانتظار (أو لا شيء إذا كان
قائمة الانتظار فارغة). مكالمة mp_probe(0) للعودة على الفور ، حتى لو كانت قائمة الانتظار فارغة.
اتصل mp_probe(1) للحظر إذا كانت قائمة الانتظار فارغة ، والرجوع فقط عند ظهور رسالة واحدة على الأقل
متاح لـ mp_recv. مكالمة mp_probe(2) للحظر حتى وصول رسالة جديدة ، حتى لو
بعض الرسائل متوفرة حاليا.
تستخدم الدالة mp_exec تدفقًا لوغاريتميًا - ترسل المرتبة 0 إلى عمليات F ، كل منها
الذي يرسل إلى F أكثر ، وهكذا ، حتى تحتوي جميع العمليات على الرسالة. مرة واحدة في عملية
يكمل جميع عمليات الإرسال الخاصة به ، ويوزع محتويات الرسالة وينفذها.
تصل خوارزمية التقسيم إلى عمليات N في السجل إلى القاعدة F من خطوات N. عمليات F
تُرسل الرتبة 0 إلى الرتب 1 ، 2 ، 3 ، ... ، F. بشكل عام ، تُرسل العملية ذات الرتبة r إلى
الرتب r * F + 1 ، r * F + 2 ، ... ، r * F + F (عندما تكون أقل من N-1 لعمليات N). هذه المجموعة
يسمى "طاقم" الرتبة ص. تتلقى الرتب مع r> 0 الرسالة من رتبة (r-1) / F ،
وهو ما يسمى "رئيس" ص. استدعاء mp_exec يعمل مع قائمة الانتظار mp_recv ؛
بعبارة أخرى ، ستكون الرسائل من رتبة أخرى غير الرئيس أثناء انتشار mp_exec
في قائمة الانتظار لاسترجاعها لاحقًا بواسطة mp_recv. (بدون هذه الميزة ، أي مهمة موازية
استخدام نمط رسالة بخلاف التوزيع اللوغاريتمي سيكون عرضة للعرق
شروط.)
إن التوزيع اللوغاريتمي وما يعادله إلى الداخل مفيد للغاية لدرجة أن mpy يوفر زوجين
من وظائف المستوى الأعلى التي تستخدم نفس نمط التوزيع مثل mp_exec:
mp_handout ، msg ؛
المجموع = mp_handin (القيمة) ؛
لاستخدام mp_handout ، يحسب التصنيف 0 رسالة ، ثم تستدعي جميع الرتب mp_handout ، والتي ترسل الرسالة
(ناتج على جميع الرتب بخلاف 0) في كل مكان بنفس الانتشار مثل mp_exec. ليستخدم
mp_handin ، كل عملية تحسب القيمة ، ثم تستدعي mp_handin ، التي ترجع مجموع
قيمتها الخاصة وجميع موظفيهم ، بحيث في المرتبة 0 تُرجع mp_handin مجموع
القيم من كل عملية.
يمكنك استدعاء mp_handin كدالة بدون وسيطات للعمل كمزامنة ؛ متي
تستمر المرتبة 0 بعد هذه المكالمة ، فأنت تعلم أن كل رتبة أخرى وصلت إلى تلك النقطة.
يجب أن تنتهي جميع المهام المتوازية (أي شيء يبدأ بـ mp_exec) باستدعاء mp_handin ،
أو ضمان مكافئ بأن جميع العمليات قد عادت إلى حالة الخمول عند المهمة
ينتهي في المرتبة 0.
يمكنك استرداد أو تغيير معلمة fanout F باستخدام وظيفة mp_nfan. الافتراضي
القيمة هي 16 ، والتي يجب أن تكون معقولة حتى بالنسبة لعدد كبير جدًا من العمليات.
مهمة واحدة خاصة متوازية تسمى mp_connect ، والتي يمكنك استخدامها لتغذية مفسرة
خطوط الأوامر إلى أي رتبة مفردة غير صفرية ، بينما تظل جميع الرتب الأخرى خامدة. الترتيب 0 يجلس في
حلقة قراءة لوحة المفاتيح وإرسال الخطوط إلى المرتبة "المتصلة" ، والتي يتم تنفيذها
لهم ، ويرسل إقرارًا مرة أخرى إلى المرتبة 0. تقوم بتشغيل وظيفة mp_disconnect إلى
أكمل المهمة الموازية وعد إلى المرتبة 0.
أخيرًا ، ملاحظة حول استعادة الأخطاء. في حالة حدوث خطأ أثناء مهمة موازية ،
تحاول mpy الخروج برشاقة من mp_exec ، بحيث عندما تعود المرتبة 0 ، فإن جميع الرتب الأخرى
من المعروف أنها خاملة ، وجاهزة لـ mp_exec التالي. سيتم تعليق هذا الإجراء إلى الأبد إن وجد
تكون إحدى العمليات في حلقة لا نهائية ، أو في حالة لن تكون أبدًا فيها
استدعاء mp_send أو mp_recv أو mp_probe ، لأن MPI لا يوفر وسيلة لإرسال إشارة
يقطع جميع العمليات. (هذه إحدى الطرق التي تكون بها بيئة MPI
"الخام".) تُركت عملية الرتبة 0 مع رتبة العملية الأولى التي أبلغت عن أ
خطأ ، بالإضافة إلى عدد العمليات التي أخطأت لسبب آخر غير الوجود
أرسل رسالة مفادها أن رتبة أخرى قد أخطأت. يمكن أن تدخل عملية الخطأ الأولى dbug
الوضع عبر mp_connect ؛ استخدم mp_disconnect أو dbexit للعودة إلى الوضع التسلسلي في المرتبة 0.
مزيد من الخيارات
-j ملف يتضمن ملف Yorick المصدر ملف كما يبدأ mpy في الوضع المتوازي
في جميع الرتب. هذا يكافئ وظيفة mp_include بعد mpy
قد بدأت.
-i ملف يتضمن ملف Yorick المصدر ملف كما يبدأ mpy ، في الوضع التسلسلي.
هذا يعادل التوجيه #include بعد بدء mpy.
-حزمة ملف يتضمن ملف Yorick المصدر ملف كما يبدأ mpy ، في الوضع التسلسلي.
ملف التخصيص الخاص بك custommp.i ، إن وجد ، هو ليست قراءة ، و mpy هو
وضعت في وضع الدُفعات. استخدم أمر التعليمات في وظيفة الدُفعات
(تعليمات ، دفعة) لمعرفة المزيد حول وضع الدُفعات. في وضع الدُفعات ، كل شيء
الأخطاء قاتلة عادةً ما توقف mpy التنفيذ وتنتظر المزيد
الإدخال بعد حدوث خطأ.
استخدم mpy عبر الإنترنت باستخدام خدمات onworks.net