Использование переменной сценария OMP_NUM_THREADS в исходных файлах программы

Если я запускаю код C ++ в кластере, возможно ли использовать значение OMP_NUM_THREADS в моей программе? Например, предположим, у меня есть два файла .cpp main.cpp и func.cpp, где func.cpp написан параллельно с использованием OpenMP. Я хочу иметь возможность определять количество потоков один раз (в приведенном ниже скрипте) и не нужно определять его снова в func.cpp.

#!/bin/bash

#PBS -S /bin/bash
#PBS -l walltime=00:10:00
#PBS -l select=1:ncpus=4:mem=2gb
#PBS -q QName
#PBS -N Name
#PBS -o Results/output.txt
#PBS -e Results/error.txt
#PBS -m abe -M email@address

module purge
module load intel-compiler/11.1.073

export OMP_NUM_THREADS=4

cd $WORKDIR

./myprog

1

Решение

Ты можешь использовать omp_set_num_threads () установить количество потоков в вашей программе.
Чтобы использовать значение, внешне указанное OMP_NUM_THREADSвам нужно будет прочитать его из переменных окружения, используя станд :: GETENV. Обязательно 1) преобразуйте строковый результат в число и 2) очистите значение, если оно не установлено.

Псевдокод будет выглядеть примерно так:

unsigned int thread_qty = std::max(atoi(std::getenv("OMP_NUM_THREADS")), 1);
omp_set_num_threads(thread_qty);
5

Другие решения

Если вы установите переменную среды OMP_NUM_THREADS до некоторого значения, и никогда не касайтесь количества потоков в вашем коде (например, через omp_set_num_threads()), ваш код будет использовать

  • Динамическая настройка отключена (OMP_DYNAMIC=FALSE/omp_set_dynamic(0)): Код будет использовать OMP_NUM_THREADS потоки
  • Динамическая настройка включена (OMP_DYNAMIC=TRUE/omp_set_dynamic(1)): Код будет использовать вплоть до OMP_NUM_THREADS темы (но может использовать меньше).

Так что просто используйте OMP_NUM_THREADS и не указывайте количество потоков в исходном коде.

1

По вопросам рекламы [email protected]