これはF90にありますが、OpenMPをサポートするすべての言語に問題が当てはまります。時間積分のために複数のストレージアレイを必要とするシミュレーションコードのデータを構造化する一般的な方法は、次のとおりです(現時点では2次元)。
REAL, DIMENSION(imax,jmax,n_sub_timesteps) :: vars
その後、次のように更新されます。
DO J = 1, jmax
DO I = 1, imax
vars(I,J,2) = func(vars(:,:,1))
END DO
END DO
vars
私の経験では、OpenMPはスレッドセーフではないと考えているため、実際にはこれらのループを並列化することはありません。しかし、プログラマーにとっては、明らかにそうです。
vars
さらに実際の状況では、スレッドローカルにするのはコストがかかりすぎてデータをそこにコピーできないと仮定しましょう。
vars
それで、スレッドの依存関係の問題がないことを理解できないかもしれないが、実際にはないので、OpenMPをロックしないように穏やかに示唆する(別名強制する)方法はありますか?何かがスレッドセーフではなく、ロックが必要であることを伝える方法があることは知っていますが、スレッドごとにコピーを作成せずに逆を指定する方法はありますか?