1

OpenMP を使用して並列化されたプログラムの動作に一貫性がありません。

実行すると、現在のステージが出力されるため、予想される出力は「2 3 4 5」などです。最初のいくつかのステージ間の時間は、通常 1 ~ 2 秒です (4 コアで並列実行する場合)。

ただし、再コンパイルまたは何も変更せずに、ソフトウェアを実行すると、印刷の直後にハングすることがあります2(最初の並列コードが実行される前に印刷されます)。

遅くなるわけではなく、文字通りコンピューティングを停止します。これを gdb で実行したところ、OpenMP 内でハングすることが確認されました。

(ハイパースレッディングのため、4 つ以上のスレッドがあります)

[New Thread 0x7ffff6c78700 (LWP 25878)]
[New Thread 0x7ffff6477700 (LWP 25879)]
[New Thread 0x7ffff5c76700 (LWP 25880)]
[New Thread 0x7ffff5475700 (LWP 25881)]
[New Thread 0x7ffff4c74700 (LWP 25882)]
[New Thread 0x7ffff4473700 (LWP 25883)]
[New Thread 0x7ffff3c72700 (LWP 25884)]
^C
Program received signal SIGINT, Interrupt.
0x00007ffff7641fd4 in ?? () from /usr/lib/libgomp.so.1
(gdb) up
#1  0x00007ffff7640a9e in ?? () from /usr/lib/libgomp.so.1
(gdb) 
#2  0x0000000000408ae8 in Redcraft::createStructures (this=0x7fffffffd8d0) at source/redcraft.cpp:512
512 #pragma omp parallel for private(node)

もともとpragma指定されschedule(dynamic)ていましたが、それを持っていても、それを削除しても、このハングアップの一貫性は変わりません。最後に、有効化/無効化を試みomp_set_dynamic()ましたが、効果もありませんでした。

デバッグに関する提案はありますか?

4

1 に答える 1

1

これは通常、データ競合がある場合に発生します。並列化されているコード ブロックを投稿する必要があります。基本的には、スレッドがデータをどのように使用しているかを確認する必要があります。コンパイルせずに再実行しても、同じスレッドの実行は保証されません。ファイルを操作していますか?再実行する前にファイルを閉じる必要があります。

于 2012-10-16T12:09:49.503 に答える