私はn個のボディシミュレーションを行い、パーティクルの加速を格納する配列を持っています。今ではコードを並列化しようとしていますが、配列が実数型なのでこの問題は発生しました。ロックできません。 OpenMPのinit_lock
サブルーチンのため、引数は整数でなければなりません。OpenMPを使用してロック配列インデックスを使用するには?
方法はありますか?私はクリティカルなコンストラクトを使用しましたが、計算時間には影響しません。ここでは、配列のインデックスをロックしようとしましたが、どちらも動作していません。
call omp_init_lock(i,j)
!$omp parallel
!$omp do private(rx,ry,rz,rsqd,r2i,r6i,virij,ff,i,j) schedule(dynamic)
do i=1,m-1
do j=i+1,m
rsqd = 0.0
rx = x(i,1) - x(j,1)
ry = x(i,2) - x(j,2)
rz = x(i,3) - x(j,3)
rsqd = rsqd + rx*rx +ry*ry + rz*rz
!calculation of another variable ff
! $omp critical
call omp_set_lock(i)
a(i,1) = a(i,1) + rx*ff
a(i,2) = a(i,2) + ry*ff
a(i,3) = a(i,3) + rz*ff
call omp_unset_lock(i)
call omp_set_lock(j)
a(j,1) = a(j,1) - rx*ff
a(j,2) = a(j,2) - ry*ff
a(j,3) = a(j,3) - rz*ff
call omp_unset_lock(j)
! $omp end critical
end do
end do
Bcz、U、Plsはここに似たような言語を使用しないでください。それはクールではない。 –
"!$ OMP"間のスペースは受け入れられますか? – Holmz
@Holmz、いいえ、スペースは使用できません。 OpenMP仕様では、スペースが無視される固定フォーマットのFortranについても、センチネルが文字を介さずに単一の単語として表示される必要があることは明らかです。 –