llvm-openmp
Высокопроизводительная реализация спецификации OpenMP API для многопоточного параллельного программирования с общей памятью. Библиотека входит в состав проекта LLVM и предоставляет runtime-библиотеку libomp, а также инструменты для поддержки OpenMP в компиляторах Clang и Flang. Она обеспечивает эффективное выполнение параллельных регионов, конструкций распределения работы, синхронизации и поддержку целевых устройств (offloading) для гетерогенных вычислений.
Особенности
- полная поддержка стандартов OpenMP 3.1, 4.0, 4.5, 5.0 и 5.1;
- высокая производительность и масштабируемость на многоядерных процессорах;
- поддержка гетерогенных вычислений с offloading на GPU (NVIDIA, AMD);
- интеграция с компиляторами Clang и Flang;
- наличие оптимизированных алгоритмов синхронизации и распределения работы.
Основные компоненты
LLVM OpenMP предоставляет runtime-библиотеку, инструменты для компилятора и поддержку offloading (подробнее с документацией можно ознакомиться здесь).
Runtime-библиотека libomp
Библиотека времени выполнения реализует все основные механизмы OpenMP: создание параллельных регионов, распределение работы между потоками, синхронизацию и управление данными.
Основные функции интерфейса компилятора:
__kmpc_fork_call()— создание параллельного региона с вызовом outlined-функции;__kmpc_for_static_init()— инициализация статического распределения итераций цикла;__kmpc_for_static_fini()— завершение статического распределения;__kmpc_dispatch_init()/__kmpc_dispatch_next()— динамическое и управляемое распределение итераций;__kmpc_barrier()— барьерная синхронизация всех потоков в команде;__kmpc_critical()/__kmpc_end_critical()— вход и выход в критическую секцию;__kmpc_reduce()/__kmpc_end_reduce()— поддержка редукционных операций;__kmpc_omp_task()/__kmpc_omp_task_alloc()— создание и запуск задач.
Поддержка offloading
LLVM OpenMP включает механизмы для выполнения кода на ускорителях (GPU). Это реализовано через библиотеку libomptarget и поддержку в компиляторе.
Основные компоненты offloading:
libomptarget— runtime для управления целевыми устройствами;libomptarget.rtl.cuda— поддержка устройств NVIDIA;libomptarget.rtl.amdgpu— поддержка устройств AMD;__tgt_target()— низкоуровневая функция для запуска целевой области;__tgt_target_data_begin()/__tgt_target_data_end()— управление передачей данных;__tgt_target_data_update()— обновление данных на устройстве.
Опции компилятора Clang
Clang предоставляет набор флагов для управления OpenMP-компиляцией:
Основные опции:
-fopenmp— включение поддержки OpenMP;-fopenmp-simd— поддержка только SIMD-конструкций;-fopenmp-targets=<triple>— указание целевых архитектур для offloading;--offload-arch=<arch>— указание архитектуры устройства;--offload-arch=native— автоматическое определение архитектуры;-fopenmp-version=<ver>— выбор версии стандарта;-static-openmp— статическая линковка OpenMP runtime;-Xopenmp-target=<triple> <arg>— передача аргументов целевому компилятору;-fopenmp-target-debug— включение отладки в device runtime;-fopenmp-target-jit— генерация JIT-компилируемого кода для offloading.
Переменные окружения для настройки runtime
Библиотека поддерживает множество переменных окружения для контроля поведения во время выполнения.
Основные переменные:
OMP_NUM_THREADS— количество потоков в параллельных регионах;OMP_PROC_BIND— привязка потоков к процессорам (true, false, spread, close, master);OMP_PLACES— определение мест размещения потоков (cores, threads, sockets);OMP_SCHEDULE— тип планирования циклов (static, dynamic, guided, auto);OMP_STACKSIZE— размер стека для каждого потока;OMP_THREAD_LIMIT— максимальное количество одновременно используемых потоков;OMP_WAIT_POLICY— стратегия ожидания (active, passive);LIBOMPTARGET_DEVICE_RTL_DEBUG— отладка device runtime;LIBOMPTARGET_DEBUG— отладка для NVIDIA и AMD GPU.