1

Snow Leopard と Linux でこのコードをコンパイルすると、異なる結果が得られます。Snow leopard では、omp_get_max_threads の最初の呼び出しはコア数である 2 を返し、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 スレッドの呼び出しは説明可能です。純粋な c に縛られていない場合は、c++ tbb ライブラリ、特に ppl サブセットを確認することをお勧めします。ネストされた並列処理のような一般性と構成可能性が向上します。私は携帯電話を使用しているので、ここでタイプミスをお詫びします。

于 2010-01-16T19:25:23.217 に答える
1

Apple 提供の gcc 4.2 [gcc version 4.2.1 (Apple Inc. build 5566)] を Leopard で使用すると、あなたと同じ結果が得られます (私の 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の公式Webサイトで終了しました:http://openmp.org/forum

このような質問をしたり、openmp.orgで他の多くのリソースを見つけたりするのに最適な場所です。

于 2010-01-20T08:25:20.500 に答える
0

変。OS X 10.6.2では常に期待される動作(4.2.1を使用、ビルド5646ドット1)が得られます。

私のMacProで

 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
于 2010-01-20T08:51:06.417 に答える