2011-01-23 13 views
3

はコードです。並列領域の開始時に、myIdはプライベートに設定され、すべてのスレッドが正しいスレッドIDを持つようにします。 set_affinity()は、どのスレッドがどのコアで動作するかを制御します。私が持っている問題は、#pragma omp for schedule(static、1)です。OpenMPスレッド「背く」OMPバリア

ブロック:

if (myId<myConstant) 
    { 
    #pragma omp for schedule(static,1) 
    for(count = 0; count < AnotherConstant; count++) 
     { 
     //Do stuff, everything runs as it should 
     } 
    } 

は、私は、スレッド、myConstant-1から0の一定数を超える配布するいくつかの作業を表します。これらのスレッドでは、スケジュール(静的、1)が行うような方法で、ループの反復を均等に分散したいと思う。これはすべて正しく実行されます。

コードが単一の領域に入ると、そこにあるすべてのコマンドが実行されます。しかし、私はmyConstantを2と指定します。次に3つ以上のスレッドで実行すると、単一マテリアルのすべてが正しく実行されますが、idが3以上のスレッドは単一の内部のすべてのコマンドが完了するまで待機しません。

すべてのスレッドによって実行されるタスクを作成するいくつかの関数が呼び出されます。 idが3以上のスレッド(一般的にはmyConstant以上)は引き続き、par_time()を実行しますが、他のスレッドは引き続き単一のスレッドで実行される関数によって作成されたタスクを実行します。 par_time()はスレッドごとにいくつかのデータを出力するだけです。

スケジュール(static、1)のプラグマompをコメントアウトして、単一のスレッドでforループを実行するだけであれば(if if(myId == 0)を変更するなど)、すべて動作します。だから私は、上記のスレッドがなぜ続いているのか分かりません。

紛らわしいことがあれば教えてください。それは具体的な問題です。 OMPを使って私のフロー制御の欠陥を誰かが見たかどうかを見ていました。

+0

ええ、まあ、私は修正を見つけたと思うが、わからない。 if文をコメントアウトすると問題が解決され、AnotherConstantから0までのスレッドのみがforループ内で使用されているようです。しかしこれは保証ですか? inと同じように、idを持つスレッドがforループ内で使用されるか、AnotherConstantから常に0になります。 – WtLgi

答えて

6

あなたはOpenMPのV3.0仕様を見れば、セクション2.5ワークシェア構築には、状態:

を、以下の制限が ワークシェアリング構造に適用されます。

  • 各ワークシェアリング領域が遭遇しなければなりませんチーム内のすべてのスレッド またはまったくなし。
  • ワークシェアリング領域とバリア領域のシーケンスは、 チーム内のすべてのスレッドで同じでなければなりません。

場合、あなたはあなたのプログラム不適合を作り、これらの制限の両方に違反している範囲内のためのワークシェアリングを有することによって。準拠していないOpenMPプログラムには、仕様に準拠していない動作があります。

スケジュールタイプが「静的1」のforループを実行するために使用されるスレッドについては、最初の作業チャンク(この場合はcount = 0)がスレッド0に割り当てられます。すべてのチャンクが割り当てられるまで、チャンク(count = 1)がスレッド1などに割り当てられます。スレッドより多くのチャンクがある場合、割り当てはスレッド0でラウ​​ンドロビン方式で再開されます。 OpenMP仕様のセクション2.5.1ループ構造の正確な言葉を、説明の下で読むことができます。ここで、それはスケジュール句について語ります。

関連する問題