Fortran で書かれたシーケンシャル コードには、次のように動作するいくつかのベクトルをシャッフルするサブルーチンがあります。
DO i=1,nsim
IF(iflag(i) == 0)THEN
j=j+1
pos(j)=pos(i)
v(j)=v(i)
iflag(j)=iflag(i)
END IF
END DO
nsim=j
私は初心者の OpenMP ユーザーなので、このループを正しい方法で記述する方法がわかりません。当初、私は次のようなことを考えました:
!$omp parallel do reduction(+: j)
DO i=1,nsim
IF(iflag(i) == 0)THEN
j=j+1
pos(j)=pos(i)
v(j)=v(i)
iflag(j)=iflag(i)
END IF
END DO
!$omp end parallel do
nsim=j
しかし、この方法で競合状態を生成できるかどうかはわかりません。このループをより適切に記述する方法について何か提案はありますか? 前もって感謝します