Управление привязкой и переменные окружения

Одним из способов увеличения производительности является управление привязкой и распределением OpenMP-нитей по доступным аппаратным потокам. Реализация технологии OpenMP в Intel runtime library предоставляет возможность управления OpenMP-нитями с помощью переменной окружения KMP_AFFINITY (действует только для компилятора Intel). В данном разделе приведены только некоторые рекомендации по управлению программных потоков по вычислительным ядрам и тредам процессора. Полный список значений переменной окружения можно найти по ссылке: Thread Affinity Interface (Linux* and Windows*).

На узле gpu-node установлено два процессора Intel Xeon E5-2683 v3 с включенным режимом HyperThreading, всего доступно 2 процессора * 14 ядер * 2 треда в ядре = 56 аппаратных (физических) потока на узле.

Для того, чтобы распределить OpenMP-нити равномерно по системе, по одной нити на ядро (при условии OMP_NUM_THREADS <= 56 / 2), нужно использовать следующий набор параметров:

KMP_AFFINITY=scatter,granularity=threads

Важно понимать, что при запуске задачи с помощью srun используются локальные переменные окружения. Для того, чтобы передать переменную окружения при запуске sbatch, нужно создать файл запуска community (его необходимо сделать исполняемым chmod +x community):

#!/bin/bash
export OMP_NUM_THREADS=<num_threads>
export KMP_AFFINITY=scatter,granularity=threads

./community-myalg $*

И запускать следующим образом:

sbatch --wrap="./community -in path_to_graph/graph -nIters nIters"

Предварительно необходимо изменить Makefile таким образом, чтобы во время сборки получить другое имя исполняемого фаила, например, community-myalg.