Українська
Підсумки
Висновки
OpenMP дозволяє розпаралелити програму мовою C++ директивами компілятора за моделлю fork–join: головний потік створює команду потоків у паралельній області й чекає на неї на неявному бар’єрі. Змінні, оголошені поза областю, спільні, всередині – приватні; клаузи private, firstprivate, lastprivate і default(none) роблять це явним. Директива for розподіляє ітерації між потоками, а schedule визначає розподіл: static для рівномірних ітерацій, dynamic і guided для нерівномірних. Редукції об’єднують приватні копії без синхронізації, а critical, atomic та інші директиви синхронізують доступ до спільних даних. Задачі OpenMP підходять для рекурсивних алгоритмів за умови порогу, нижче якого код виконується послідовно. Директива simd додає векторизацію всередині ядра. На NUMA-системах дані ініціалізують паралельно (політика першого дотику), а потоки прив’язують до процесорів змінними OMP_PLACES і OMP_PROC_BIND. Прискорення вимірюють серією запусків з різними OMP_NUM_THREADS і OMP_SCHEDULE без перекомпіляції.
Питання для самоперевірки
- З яких частин складається OpenMP? Що таке директива й клауза?
- Поясніть модель fork–join. Що відбувається на неявному бар’єрі?
- Як увімкнути OpenMP у GCC і в проєкті CMake? Що показує макрос
_OPENMP? - Як визначається кількість потоків паралельної області?
- Які змінні в паралельній області спільні, а які приватні за замовчуванням?
- Чим відрізняються
private,firstprivateіlastprivate? Навіщоdefault(none)? - Які вимоги до циклу, що розпаралелюється директивою
for? - Порівняйте види розподілу
static,dynamicіguided. Для чогоschedule(runtime)? - Що роблять клаузи
collapseіnowait? - Як працює клауза
reduction? Які оператори редукції існують? Як оголосити власну? - Чим відрізняються
criticalіatomic? Для чогоsingle,maskedіbarrier? - Чим задачі відрізняються від секцій? Що роблять
taskwait,taskgroupіtaskloop? - Навіщо поріг у рекурсивних алгоритмах із задачами?
- Що дає директива
simdпорівняно з автоматичною векторизацією? - Що таке NUMA і політика першого дотику? Як ініціалізувати дані на NUMA-системі?
- Що задають змінні
OMP_PLACESіOMP_PROC_BIND? Коли обиратиclose, а колиspread? - Як перевірити фактичну прив’язку потоків і топологію системи?
Корисні посилання
- Специфікації OpenMP: https://www.openmp.org/specifications/
- Довідкові картки OpenMP: https://www.openmp.org/resources/refguides/
- Документація GNU libgomp: https://gcc.gnu.org/onlinedocs/libgomp/
- Модуль CMake FindOpenMP: https://cmake.org/cmake/help/latest/module/FindOpenMP.html
- LLVM OpenMP: https://openmp.llvm.org/
- Бібліотека hwloc: https://www.open-mpi.org/projects/hwloc/
- Сторінка довідки numactl: https://man7.org/linux/man-pages/man8/numactl.8.html
- Політики пам’яті NUMA в Linux: https://www.kernel.org/doc/html/latest/admin-guide/mm/numa_memory_policy.html