Зазвичай я пишу серійний код, і коли це роблю, я пишу одиничні тести з деякою рамкою тестування у стилі xUnit (MATLAB xUnit, PyUnit / nos або тестова рамка C ++ Google).
Спираючись на короткий пошук в Google, я не бачив багато того, як практикуючі опрацьовують тестовий код, який використовує MPI. Чи є найкращі практики для цього?
Порівняно зі Стратегіями тестування одиниць та тестових розробок , я шукаю відповіді щодо того, яке програмне забезпечення я повинен використовувати для тестування рамки (якщо така існує - відповідь цілком може бути "прокатати свій власний код", в якому випадки користувальницького коду тестування були б корисними).
Більшість того, що я шукаю для тестування, - це правосторонні оцінки функцій та схеми складання матриці Якобії для тимчасових кроків, які будуть інтегрувати напівдискретні PDE. Я буду використовувати PETSc, тому якщо є щось певне для PETSc, це було б корисно на додаток до більш загальних рамок тестування.
Поправки до уточнення:
Прикладом може бути те ${PETSC_DIR}/src/ts/examples/tutorials/ex2.c
, де я хотів би перевірити щось на кшталт RHSFunction
(оцінка функції правої частини) таRHSJacobian
(оцінка матриці Якобії). Я б протестував на відомі значення для зібраної правої частини та зібраної матриці Якобі; Я можу отримати ці значення аналітично для деяких простих випадків проблеми. Ці функції - це функції, що стосуються додатків, які не виконують жодної іншої функції на рівні додатків, але вони можуть викликати MPI, якщо вектор або матриця збирається в межах функції (як у зв'язаному прикладі PETSc вище). Якщо я пишу функції, які обчислюють лише частину векторів або матриць, локальних для процесора, я б хотів перевірити глобальну, зібрану версію, якщо це можливо, тому що, будучи новим для паралельного програмування, мені інтуїтивніше думати про глобальні вектори та глобальні матриці. Ці тести проводитимуться на невеликих розмірах проблем та невеликій кількості процесорів.
Я можу придумати кілька стратегій для цього:
- Стратегія, яка, ймовірно, не спрацює добре, базуючись на пошуках Google у цій темі, - це побудувати відомий вихід, паралельно знайти відносну / абсолютну помилку, а потім виконати наївні порівняння. Результат, ймовірно, буде пошкодженим - кожен, хто написав програму MPL «Привіт, світ», знає, чому - що обмежує корисність тестування одиниць. ( Це стало поштовхом до запитання. ) Також, мабуть, є певна потенційна хитрість у виклику рамки тестування одиниць.
- Запишіть вихідний файл у файл (наприклад, у PETSc, використовуючи
VecView
таMatView
) та порівняйте із відомим виводом щось подібне доndiff
абоnumdiff
. Моє відчуття кишки за допомогою цього методу з попереднього досвіду тестування одиниць із порівнянням файлів полягає в тому, що він буде витонченим, і він потребує деякої фільтрації. Цей метод здається, що він буде чудовим для регресійного тестування, оскільки я міг би замінити утиліти вище звичайнимиdiff
, і не потрібно турбуватися про відповідність текстових форматів. Я зібрав, що ця стратегія - це більш-менш те, що пропонують ВольфгангБангерт та Андібауер. PETSc також використовує подібний підхід для деяких тестувань. - Використовуйте блок тестування блоків, збирайте все на процесор з MPI ранг 0 і попросіть його виконати тести одиниць, лише якщо ранг процесора дорівнює 0. Я міг би зробити щось подібне з нормами (це, мабуть, ще простіше), хоча компроміс полягає в тому, що будь-які повернуті помилки підкажуть мені, що у мене є проблема в моєму розрахунку, але не те, які елементи помиляються. Тоді мені не потрібно турбуватися про те, що будь-який одиничний тестовий вихід буде зібраний; Мені потрібно лише турбуватися про те, щоб правильно викликати рамки тестування блоку. PETSc, як видається, використовує нормознавчі порівняння у своїх прикладних програмах, коли є точні рішення, але він не використовує блок тестування підрозділів при здійсненні цих порівнянь (а також не обов'язково).
mpiexec
для запуску його не повинно виникнути жодних проблем і включати виклики на зразок PETScInitialize
/ PETScFinalize
у код налаштування / відмовлення. (Імовірно, якщо я не використовував PETSc, я би замінив ці виклики аналогами MPI_Init
/ MPI_Finalize
, залежно від бібліотек, якими я користуюся.) Рамка тестування Google є джерелом випуску, тому компілюючи його разом із кодом I написати також не буде проблемою.
RHSFunction
та RHSJacobian
в ${PETSC_DIR}/src/ts/examples/tutorials/ex.2
) у відриві.