omp_get_max_threads在并行区域中的行为

时间:2010-01-16 19:12:02

标签: c openmp

我在Snow Leopard和linux上编译了这段代码,得到了不同的结果。在Snow leopard上,omp_get_max_threads的第一次调用返回2,这是我的内核数,而第二次返回1.在linux上,两个调用返回4,这是我的内核数。我认为Linux有正确的行为,对吗?两者都是正确的,我只是对这个功能有误解吗?

#include <stdio.h>
#include <omp.h>

int main() {
  printf(" In a serial region; max threads are : %d\n", omp_get_max_threads());
#pragma omp parallel
{
  #pragma omp master
  printf(" In a parallel region; max threads are : %d\n", omp_get_max_threads());
}
}

Mac输出:

 In a serial region; max threads are : 2
 In a parallel region; max threads are : 1

Linux输出:

 In a serial region; max threads are : 4
 In a parallel region; max threads are : 4

4 个答案:

答案 0 :(得分:2)

这个调用在openmp规范中有明确规定。 linux在这里有正确的行为。 话虽如此,你在一个主要区域,它是有效的串行和主线程,所以num threads调用是可解释的。如果你不依赖于纯c我会鼓励你看看c ++ tbb库,特别是ppl子集,你会发现更多的通用性和可组合性,比如嵌套并行性。我在打电话,所以我在这里为拼写错误道歉。

答案 1 :(得分:1)

在Leopard上使用Apple提供的gcc 4.2 [gcc版本4.2.1(Apple Inc. build 5566)],我得到与您相同的结果(除了我的MacBook拥有更少的内核)。

In a serial region; max threads are : 2
In a parallel region; max threads are : 1

同样适用于MacPorts的4.3.4。

然而,使用MacPorts的gcc 4.4.2和4.5.0 20091231(实验性),在同一台计算机上我得到:

In a serial region; max threads are : 2
In a parallel region; max threads are : 2

看起来这不是Mac与Linux的问题,而是由于gcc版本。

P.S。 OpenMP可以执行嵌套并行操作。

答案 2 :(得分:0)

提醒一下,有一个专门针对OpenMP的论坛,并由OpenMP的开发人员以及全球的OpenMP专家阅读。它在OpenMP官方网站上结束:http://openmp.org/forum

提出这样的问题并在openmp.org上找到很多其他资源的好地方

答案 3 :(得分:0)

怪异。我总是得到OS X 10.6.2的预期行为(使用4.2.1,构建5646点1):

在Mac Pro上

 In a serial region; max threads are : 8
 In a parallel region; max threads are : 8

和我的iMac

In a serial region; max threads are : 2
In a parallel region; max threads are : 2

必须在这里发生其他事情。只用?编译?

gcc fname.c -fopenmp