在OpenMP中,我如何让每个核心运行一个线程?

时间:2011-07-14 04:39:24

标签: openmp

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

感到困惑

非常感谢.. :))

3 个答案:

答案 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