תמיכה בהאצה מרובת תהליכים ומרובת תהליכונים
הדף הזה מתעד באיזו מידה qiskit-addon-sqd תומך בהאצה מרובת תהליכונים ומרובת תהליכים, ואת ההנחות שמפתח מחשוב עתיר ביצועים (HPC) יכול להסתמך עליהן כשהוא משלב את החבילה הזו בעומס עבודה מואץ.
ההנחה של תהליכון יחיד
אלא אם צוין אחרת, ה-API של החבילה הזו נועדו להיקרא מתהליכון יחיד. ה-API ברמה הגבוהה שהחבילה חושפת אינם מובטחים להיות re-entrant, ומשתמשי הקצה לא צריכים לקרוא להם מאף תהליכון מלבד התהליכון הראשי.
הרצה קולקטיבית מרובת תהליכים
החבילה הזו תומכת בהאצה קולקטיבית מרובת תהליכים בסגנון תוכנית יחידה, נתונים מרובים (SPMD), שבו כל התוכנית מופעלת כמספר תהליכים מבודדים שרצים עם סנכרון גלובלי מפורש ותקשורת ביניהם (למשל mpirun -n 128 python my_program.py). מכיוון שסגנון SPMD משתלב היטב עם מתזמני משימות ותוכנות מקביליות אחרות ומתרחב למספרי תהליכים גדולים, זה המודל המומלץ לעומסי עבודה עתירי ביצועים ובקנה מידה גדול, והוא הנושא של הדף הזה.
אף שהחבילה הזו מתוכננת להתאים לתשתיות הרצה קולקטיביות שונות, המימוש הנוכחי שלה מכוון ל-MPI, ה-API הסטנדרטי להעברת הודעות במערכות HPC. בלי קשר למימוש, החבילה מניחה שתהליכון יחיד שולט בכל תהליך. ב-MPI זה מתאים ל-MPI_THREAD_FUNNELED או נמוך ממנו.
אם פונקציה תומכת בהרצה קולקטיבית, התיעוד שלה חייב לציין זאת. אם התיעוד לא מזכיר הרצה קולקטיבית, לפונקציה אין סמנטיקה קולקטיבית וצריך לקרוא לה מתהליך הבקרה בלבד.
סמנטיקת ערך ההחזרה והסנכרון הספציפית של פונקציה קולקטיבית מתועדת יחד עם הפונקציה עצמה. באופן כללי, התיעוד צריך להבהיר:
-
אם הפונקציה נועדה להיקרא באופן עצמאי על ידי כל תהליך על הנתונים המקומיים שלו, או באופן קולקטיבי על ידי כל התהליכים.
-
איך הארגומנטים שלה צריכים להתאים בין התהליכים.
-
איך ערך ההחזרה שלה נמסר: אם התוצאה קיימת רק בתהליך הבקרה, אם כל התהליכים מקבלים את אותו ערך, או אם כל תהליך מקבל ידית לחלק מקומי של מבנה נתונים מבוזר.
כרגע רק פונקציה אחת תומכת בקריאה קולקטיבית מכל התהליכים: diagonalize_fermionic_hamiltonian(). כשקוראים לה באופן קולקטיבי, שלב פותר הערכים העצמיים הוא המקום שבו כל התהליכים משתתפים ותורמים עבודה, כך שמימוש של פותר ערכים עצמיים יכול להשתמש בכל תהליך. שאר חלקי לולאת שחזור התצורות אין להם מימוש מבוזר ורצים בתהליך הבקרה (דרגה 0) בלבד.
כל תת-מרחב של איטרציה מועבר לפותר הערכים העצמיים בקריאה אחת, ולכן מימוש חופשי לחלק את התהליכים לקבוצות ולהאלכסן כמה תת-מרחבים במקביל. האופן שבו פותר משתמש בתהליכים הזמינים לו הוא תכונה של אותו פותר.
חלק ממימושי פותרי הערכים העצמיים הקיימים דורשים שהתוכנית הקוראת תרוץ מחוץ לסביבת MPI/SPMD, כי הם מפעילים ומנהלים בעצמם תהליכים מקביליים באופן פנימי, למשל על ידי הפעלת mpirun מטעם המשתמש. המצב הזה נוח לעבודה אינטראקטיבית ולעבודה במחברות ונשאר נתמך; הדרישות שלו מהתוכנית הקוראת מתוארות בהפניית ה-API של הפונקציה diagonalize_fermionic_hamiltonian().
טיפול בשגיאות בהקשר מרובה תהליכים
פונקציה שנקראת באופן קולקטיבי מכל התהליכים אסור לה לזרוק חריגה או לבטל רק תהליך אחד, כי זה יותיר את שאר התהליכים בקיפאון (deadlock) או במצב לא עקבי. במקום זה, הטיפול בשגיאות פועל לפי סמנטיקת fail-stop עבור הקשר ההרצה כולו: עם השגיאה, המימוש חייב להיות מוכן לבטל את כל הקשר ההרצה באופן קולקטיבי (למשל באמצעות MPI_Abort).
ה-API לא יכול להבטיח דיווח שגיאות מתואם או מסירה קולקטיבית של חריגות בין תהליכים, כי מימושי MPI אינם מספקים הבטחות כאלה. מימוש עשוי לנסות בנוסף להפוך שגיאה לגלויה לכל התהליכים המשתתפים, למשל על ידי כך שכל תהליך יזרוק חריגה, אבל זה אפשרי רק על בסיס מאמץ מיטבי ואסור להסתמך על כך לצורך נכונות או התאוששות.
אלה תכונות שמימוש קולקטיבי רשאי לקיים, ולא הבטחות לגבי מימוש מסוים. בחבילה הזו, השלב הקולקטיבי היחיד הוא פותר הערכים העצמיים (ראו הסעיף הקודם); המימוש ברירת המחדל שלו אינו מבוזר, ולכן השיקולים האלה חלים על פותר ערכים עצמיים קולקטיבי מותאם אישית שהמשתמש מספק.