1

我在 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

4 回答 4

2

这个调用在 openmp 规范中有很好的说明。linux在这里有正确的行为。话虽如此,您处于一个有效串行且主线程的主区域,因此 num threads 调用是可以解释的。如果您不依赖纯 c,我鼓励您查看 c++ tbb 库,尤其是 ppl 子集,您会发现更多的通用性和可组合性,例如嵌套并行性。我在我的手机上,所以我为这里的错别字道歉。

于 2010-01-16T19:25:23.217 回答
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 版本。

PS OpenMP 可以进行嵌套并行。

于 2010-01-16T20:52:53.577 回答
0

提醒一下,有一个专门讨论 OpenMP 的论坛,供 OpenMP 开发人员和世界各地的 OpenMP 专家阅读。在 OpenMP 官方网站上结束了:http: //openmp.org/forum

提出此类问题并在 openmp.org 上找到许多其他资源的好地方

于 2010-01-20T08:25:20.500 回答
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

一定是这里发生了其他事情。用just编译?

gcc fname.c -fopenmp
于 2010-01-20T08:51:06.417 回答