دعم التسريع متعدد العمليات ومتعدد الخيوط
توثّق هذه الصفحة مدى دعم qiskit-addon-sqd للتسريع متعدد الخيوط ومتعدد العمليات، والافتراضات التي يمكن لمطوّر الحوسبة عالية الأداء (HPC) الاعتماد عليها عند دمج هذه الحزمة في حمل عمل مسرَّع.
افتراض الخيط الواحد
ما لم يُذكر خلاف ذلك، فإن واجهات البرمجة في هذه الحزمة مصممة لاستدعائها من خيط واحد. وواجهات البرمجة عالية المستوى التي تعرضها هذه الحزمة غير مضمونة لإعادة الدخول (re-entrant)، ولا ينبغي للمستخدمين النهائيين استدعاؤها من أي خيط غير الخيط الرئيسي.
التنفيذ الجماعي متعدد العمليات
تدعم هذه الحزمة التسريع الجماعي متعدد العمليات بنمط البرنامج الواحد والبيانات المتعددة (SPMD)، حيث يُشغَّل البرنامج بأكمله كعمليات معزولة متعددة تعمل بمزامنة عامة صريحة وتواصل فيما بينها (على سبيل المثال، mpirun -n 128 python my_program.py). ولأن نمط SPMD يتكامل بسلاسة مع مجدولات المهام والبرمجيات المتوازية الأخرى ويتسع لأعداد كبيرة من العمليات، فهو النموذج الموصى به لأحمال العمل عالية الأداء وواسعة النطاق، وهو موضوع هذه الصفحة.
مع أن هذه الحزمة مصممة لاستيعاب واجهات خلفية مختلفة للتنفيذ الجماعي، فإن تنفيذها الحالي يستهدف MPI، وهي واجهة تمرير الرسائل القياسية لأنظمة HPC. وبصرف النظر عن التنفيذ، تفترض هذه الحزمة أن خيطًا واحدًا يتحكم في كل عملية. وفي حالة MPI، يقابل ذلك MPI_THREAD_FUNNELED أو ما دونه.
إذا كانت الدالة تدعم التنفيذ الجماعي، فيجب أن توضح وثائقها ذلك. وإذا لم تذكر الوثائق التنفيذ الجماعي، فليس للدالة دلالات جماعية ويجب استدعاؤها من عملية التحكم وحدها.
تُوثَّق دلالات القيمة المُرجَعة والمزامنة الخاصة بالدالة الجماعية مع الدالة نفسها. وبوجه عام، ينبغي أن توضح تلك الوثائق:
-
ما إذا كان المقصود استدعاء الدالة بشكل مستقل من كل عملية على بياناتها المحلية، أم بشكل جماعي من كل العمليات.
-
كيف يجب أن تتفق وسائطها عبر العمليات.
-
كيف تُسلَّم قيمتها المُرجَعة، أي هل توجد النتيجة على عملية التحكم فقط، أم تتلقى كل العمليات القيمة نفسها، أم تتلقى كل عملية مقبضًا لجزء محلي من بنية بيانات موزعة.
توجد حاليًا دالة واحدة فقط تدعم الاستدعاء الجماعي من كل العمليات: diagonalize_fermionic_hamiltonian(). وعند استدعائها جماعيًا، تكون خطوة حلّال القيم الذاتية هي التي تشارك فيها كل العمليات وتساهم بالعمل، بحيث يمكن لتنفيذ حلّال القيم الذاتية استخدام كل عملية. أما بقية أجزاء حلقة استرجاع التكوين فليس لها تنفيذ موزع وتعمل على عملية التحكم (الرتبة 0) فقط.
يُمرَّر كل فضاء جزئي في التكرار إلى حلّال القيم الذاتية في استدعاء واحد، لذلك يمكن للتنفيذ تقسيم العمليات إلى مجموعات وتقطير عدة فضاءات جزئية بالتوازي. وكيفية استخدام الحلّال للعمليات المتاحة له هي خاصية تخص حلّال القيم الذاتية ذاك.
تتطلب بعض تنفيذات حلّال القيم الذاتية الحالية أن يعمل البرنامج المستدعي خارج بيئة MPI/SPMD، لأنها تُطلق وتدير عملياتها المتوازية بنفسها داخليًا، مثلًا باستدعاء mpirun نيابةً عن المستخدم. هذا الوضع مريح للعمل التفاعلي والعمل القائم على الدفاتر ولا يزال مدعومًا؛ وتوصف متطلباته على البرنامج المستدعي في مرجع واجهة البرمجة الخاص بالدالة diagonalize_fermionic_hamiltonian().
معالجة الأخطاء في سياق متعدد العمليات
يجب ألا تطلق الدالة التي تُستدعى جماعيًا من كل العمليات استثناءً أو تُجهض عملية واحدة فقط، لأن ذلك سيترك بقية العمليات في حالة جمود أو في حالة غير متسقة. بدلًا من ذلك، تتبع معالجة الأخطاء دلالات التوقف عند الفشل (fail-stop) لسياق التنفيذ ككل: فعند حدوث خطأ، يجب أن يكون التنفيذ مستعدًا لإجهاض سياق التنفيذ بأكمله جماعيًا (على سبيل المثال، باستخدام MPI_Abort).
لا يمكن لواجهة البرمجة أن تضمن الإبلاغ المنسق عن الأخطاء أو التسليم الجماعي للاستثناءات عبر العمليات، لأن تنفيذات MPI لا توفر مثل هذه الضمانات. وقد يحاول التنفيذ إضافةً إلى ذلك جعل الخطأ مرئيًا لكل العمليات المشاركة، مثلًا بأن تطلق كل عملية استثناءً، لكن ذلك لا يمكن توفيره إلا على أساس بذل أفضل جهد، ولا يجوز الاعتماد عليه لضمان الصحة أو التعافي.
هذه خصائص يُسمح للتنفيذ الجماعي بامتلاكها، وليست ضمانات بشأن أي تنفيذ بعينه. في هذه الحزمة، الخطوة الجماعية الوحيدة هي حلّال القيم الذاتية (انظر القسم السابق)؛ وتنفيذه الافتراضي غير موزع، لذلك تنطبق هذه الاعتبارات على حلّال قيم ذاتية جماعي مخصص يقدمه المستخدم.