2010-12-20 3 views
1

ほんの少しのOMPテストを書き、それが正しく、すべての時間を動作しませんがフリーズこの例では、しかし小型のOpenMPプログラムの開発は時々(GCC、C、Linux)の

  • はJ

  • の唯一の非決定的な値がなければならない私は凍結しています。

4コアx86_Core2 Linuxサーバ上のgcc-4.3.1 -fopenmp a.c -o gcc -static

実行でコンパイル:(時々; 4-5ファストランの1回の凍結など)$ ./gcc、凍結を得ました。

straceの:

[pid 13118] futex(0x80d3014, FUTEX_WAKE, 1) = 1 
[pid 13119] <... futex resumed>)  = 0 
[pid 13118] futex(0x80d3020, FUTEX_WAIT, 251, NULL <unfinished ...> 
[pid 13119] futex(0x80d3014, FUTEX_WAKE, 1) = 0 
[pid 13119] futex(0x80d3020, FUTEX_WAIT, 251, NULL      
         <freeze> 

私はフリーズ(デッドロック)を持っているのはなぜ?

答えて

3

私はプライベートにして、各ループに独自のコピーがあるようにしてください。

私はもっと時間があるので、私は試して説明します。デフォルトでOpenMPの変数は共有されています。変数をプライベートにするデフォルトがあるケースがいくつかあります。パラレルリージョンはそれらの1つではありません(High Performance Markのレスポンスは間違っています)。元のプログラムでは、iとjの2つの競合条件があります。問題は私の問題です。各スレッドは何度かループを実行しますが、スレッドごとに変更されているため、スレッドがループを実行する回数は不定です。すべてのスレッドがバリアを満たすためにバリアを実行する必要があるため、すべてのスレッドが同じ回数だけ実行するわけではないため、バリアでハングすることはありません。

OpenMP仕様では、「ワーク共有領域とバリア領域の遭遇順序は、チーム内のすべてのスレッドで同じ でなければならない」というOMP仕様V3.0、準拠していないため、不確定な動作をする可能性があります。

+0

ねえ...ありがとう!私はそれをテストします – osgx

+0

-1:私は非公開です。OpenMP標準では、各スレッドが繰り返しの独自のシェアを制御するようにこれを要求しています。 –

+1

-1:ループインデックス変数はプライベートです。 –

1

複数のスレッドから同じ場所に追加しようとしています。並行してやろうとすることはできません。合計を並行して実行したい場合は、それをより小さな部分に分割して後で収集する必要があります。

a5bによるアップデート:正しいアイデアだが、コードの間違った部分が見つかった。 i変数は両方のスレッドによって変更されます。

+0

ARSEN M、すべての質問をお読みください。 SUMは間違っていますが、プログラムは停止する必要があります。そしてそれはしません。変数の並列変更はデッドロックではありません – osgx

+0

ここには基本的に間違っています。あなたの周りにロックしようとしているように見えますが、それは間違っていますが、あなたはまたそれを間違っています。これがデッドロックではないと期待することはできません。あなたはすべてのスレッドが合計の前に何も起こるのを待っている。 – arsenm

+0

さて、 'j + = j^i;'行を削除すると、その動作は同じになります – osgx

0

@ejd私はプライベートとして私をマークすると、私のプログラムは準拠しますか?

申し訳ありません - 私はこの質問を見ました。技術的には、変数 "i"をプライベートとしてマークすると、プログラムはOpenMPに準拠します。ただし、 "j"の競合状態が存在し、プログラムが準拠している間(競合条件を持つ有効なケースがあるため)、 "j"の値は(OpenMP仕様に従って)指定されていません。

以前の回答の1つでは、バリア実装の速度を測定しようとしていたとお伝えしました。いくつかの "ベンチマーク"があり、さまざまなOpenMP構成の結果を公開しています。 1つはマーク・ブル(EPCC、エジンバラ大学)、もう1つ(スフィンクス)はローレンス・リバモア国立研究所(LLNL)、3番目(パークベンチ)は日本コンピューティング・パートナーシップから来たものです。彼らはあなたにいくつかの指導を提供するかもしれません

+0

なぜあなたはあなたが( "ejd"という名前のいくつかのstackoverflowログインを使用しますが、それぞれリンクhttp://stackoverflow.com/users/578711/ejd&http:// stackoverflowで異なる番号を持っています。 com/users/551576/ejd) – osgx

+1

初めて登録しませんでした。 2回目に私が登録しましたが、なんらかの理由でWebサイトがすべてのIDを結合していなかったのです。残念ながら私はそれをどのように修正するか分かりません。 – ejd

+0

あなたは司会者またはmeta.stackに質問する必要がありますか? – osgx

関連する問題