BARRIER はチーム内のすべてのスレッドで実行されません。
BARRIER 構文は同期スレッドによって使用され、BARRIER の後の処理を行う前に、BARRIER の前のすべての処理が完了していることを保証します。OpenMP* ランタイムは、チーム内の最後のスレッドが処理を完了するまで BARRIER でスレッドを待機させ、完了したらすべてのスレッドを解放します。
チーム内のスレッドのうち BARRIER に到達しないものがある場合、待機中のスレッドは解放されず、デッドロックが発生します。このため、BARRIER はチーム内のすべてのスレッドによって実行されるか、全く実行されないかのいずれかでなければなりません。このエラーは、BARRIER が条件文 ("if" 文など) の中で使用され、デッドロックが発生する可能性がある場合にレポートされます。
条件文でチーム内のすべてのスレッドが同じパスを実行する場合は、BARRIER を安全に使用できます。フローパスの制御式 ("if" 文の中にあるブール式など) が不変の場合、つまり、並列領域で式の値が変わらない場合は安全です。解析で制御式が不変であると判断された場合、この診断は出力されません。"可能性がある" と診断された場合、解析では制御式が不変かどうかを判断できなかったことを示します。この場合、制御式が不変であることが確認できたら、この診断は無視しても問題ありません。
ID |
問題箇所 |
説明 |
---|---|---|
1 |
OpenMP* の使用方法に関するエラー |
バリア領域の場所 |
2 |
定義 |
囲まれた条件文の場所 |
!************************************************** !* * !* OpenMP Assertion 04 * !* * !* work-sharing constructs and BARRIER directives * !* must be encountered by all threads in a team * !* or by none at all * !* * !************************************************** program barrier dimension A(1000) !$OMP PARALLEL do I = 1, 1000 if (i .GT. 500) then ! Bad - if expression is not loop invariant so ! BARRIER may not be encountered by all threads !$OMP BARRIER end if A(i) = i end do !$OMP END PARALLEL end
© 2010 Intel Corporation. 無断での引用、転載を禁じます。