在程序源文件中使用脚本变量OMP_NUM_THREADS

时间:2014-06-26 16:30:20

标签: c++ openmp pbs

如果我在群集上运行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

2 个答案:

答案 0 :(得分:6)

您可以使用omp_set_num_threads()来设置程序中的线程数 要使用OMP_NUM_THREADS外部指定的值,您需要使用std::getenv从环境变量中读取它。一定要1)将字符串结果转换为数字,2)在未设置的情况下清理该值。

伪代码看起来像:

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

答案 1 :(得分:1)

如果您将环境变量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,并且不要在源代码中指定任意数量的线程。