3天前我开始使用OpenMP。我想知道如何使用#pragma
使每个核心运行一个线程。更多细节: -
int ncores = omp_get_num_procs();
for(i = 0; i < ncores;i++){
....
}
我希望将for循环分布在我拥有的核心中,我应该使用哪个#pragma
?
另一件事,#pragmas
是什么意思?
#pragma omp parallel
#pragma omp for
#pragma omp parallel for
我对那些#pragmas
非常感谢.. :))
答案 0 :(得分:8)
线程固定
我想知道如何使用#pragma来使每个核心运行一个 单线程。
您使用哪种openmp实现?答案取决于那个。
没有使用pragma定义固定。您将不得不使用环境变量。使用gcc时,可以使用环境变量将线程固定到核心:
GOMP_CPU_AFFINITY="0-3" ./main
将第一个线程绑定到第一个核心,将第二个线程绑定到第二个核心,依此类推。有关更多信息,请参阅gomp documentation(第3节,环境变量)。我忘了如何用PGI和其他编译器做同样的事情,但你应该能够找到使用流行搜索引擎的那些编译器的答案。
OpenMP Pragmas
没有办法避免阅读文档。例如,请参阅this link to an IBM website。我发现tutorial by Blaise Barney非常有用。
答案 1 :(得分:2)
要添加到上一个答案,英特尔OpenMP库中的等效环境变量是KMP_AFFINITY。与
类似的用法GOMP_CPU_AFFINITY="0-3"
将是
KMP_AFFINITY="proclist=[0-3]"
KMP_AFFINITY语法和选项的完整详细信息如下: http://software.intel.com/sites/products/documentation/studio/composer/en-us/2009/compiler_c/optaps/common/optaps_openmp_thread_affinity.htm
答案 2 :(得分:1)
新的OpenMP实施(3.0+)让您的生活更轻松。您只需将以下行添加到.bashrc或.bash_profile。
导出OMP_PROC_BIND = true