Підтримка багатопроцесного та багатопотокового прискорення
Ця сторінка описує, якою мірою qiskit-addon-sqd підтримує багатопотокове та багатопроцесне прискорення, а також припущення, на які може покладатися розробник високопродуктивних обчислень (HPC) під час інтеграції цього пакета в прискорене навантаження.
Припущення про один потік
Якщо не вказано інше, API цього пакета призначені для виклику з одного потоку. Високорівневі API, які надає цей пакет, не гарантовано є реентерабельними, і кінцеві користувачі не повинні викликати їх з жодного потоку, окрім основного.
Колективне багатопроцесне виконання
Цей пакет підтримує колективне багатопроцесне прискорення в стилі «одна програма, багато даних» (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().
Обробка помилок у багатопроцесному контексті
Функція, яку викликають колективно з усіх процесів, не повинна генерувати виняток або завершувати лише один процес, бо це залишило б решту процесів у взаємному блокуванні або в неузгодженому стані. Натомість обробка помилок підпорядковується семантиці fail-stop для всього контексту виконання: у разі помилки реалізація має бути готова колективно перервати весь контекст виконання (наприклад, за допомогою MPI_Abort).
API не може гарантувати узгоджене повідомлення про помилки чи колективну доставку винятків між процесами, оскільки реалізації MPI не надають таких гарантій. Реалізація може додатково спробувати зробити помилку видимою для всіх процесів-учасників, наприклад, змусивши кожен процес згенерувати виняток, але це можливо лише за принципом найкращих зусиль, і на це не слід покладатися для коректності чи відновлення.
Це властивості, які колективна реалізація може мати, а не гарантії щодо якоїсь конкретної. У цьому пакеті єдиний колективний крок — це розв'язувач власних значень (див. попередній розділ); його реалізація за замовчуванням не є розподіленою, тож ці міркування стосуються власного колективного розв'язувача власних значень, наданого користувачем.