Скорочення, здійснене за допомогою MPI_Allreduce()
, відтворюється до тих пір, коли ви використовуєте однакову кількість процесорів за умови, що реалізація дотримується наступної примітки, що з’являється у розділі 5.9.1 стандарту MPI-2.2.
Порада виконавцям . Настійно рекомендується MPI_REDUCE
реалізовувати так, щоб той самий результат був отриманий кожного разу, коли функція застосовується в одних і тих же аргументах, що з'являються в одному порядку. Зауважте, що це може запобігти оптимізаціям, що скористаються фізичним розташуванням процесорів. ( Кінець поради виконавцям .)
Якщо вам потрібно гарантувати відтворюваність будь-якою ціною, ви можете дотримуватися вказівок у наступному пункті:
Поради користувачам . Деякі програми можуть не в змозі ігнорувати неасоціативний характер операцій з плаваючою комою або можуть використовувати визначені користувачем операції (див. Розділ 5.9.5), які потребують спеціального порядку зменшення і не можуть розглядатися як асоціативні. Такі додатки повинні чітко виконувати порядок оцінки. Наприклад, у випадку операцій, які вимагають строгого наказу зліва направо (або справа наліво), це можна зробити, зібравши всі операнди в одному процесі (наприклад, з
MPI_GATHER
), застосувавши операцію скорочення у бажаному порядку (наприклад, з
MPI_REDUCE_LOCAL
), і, якщо потрібно, транслюйте або розповсюджуйте результат на інші процеси (наприклад, з MPI_BCAST
). ( Кінець поради користувачам .)
У більш широкій схемі речей ефективні алгоритми для більшості додатків використовують перевагу місцевості. Оскільки алгоритм дійсно відрізняється при запуску на різній кількості процесів, то точно відтворити результати при запуску на різній кількості процесів просто не практично. Можливим винятком є багаторешітка з затухаючими якобі або поліноміальними (наприклад, Чебишев) згладжувачами, де цей простий метод дуже добре працює.
При однаковій кількості процесів продуктивність часто корисна для обробки повідомлень у тому порядку, в якому вони були отримані (наприклад, використання MPI_Waitany()
), що вводить недетермінізм. У таких випадках ви можете реалізувати два варіанти, швидкий, який отримує в будь-якому порядку, і "налагодження", який отримує в статичному порядку. Це вимагає, щоб усі основні бібліотеки також були написані, щоб запропонувати таку поведінку.
Для налагодження в деяких випадках ви можете виділити частину обчислень, яка не пропонує такої відтворюваної поведінки, і виконувати це надмірно. Залежно від того, як були розроблені компоненти, ця зміна може бути невеликою кількістю коду або дуже нав'язливою.