コードの並列部分に注目すると、以下に示すオプションのどれが優先されますか? より良い解決策はありますか?私は独立した実現の平均を作ろうとしていますdo_something
オプション 1: CRITICAL の使用
resultado%uno = 0.d0
!$OMP PARALLEL DO shared(large) private(i_omp) schedule(static,1)
do i_omp=1, nthreads
call do_something(large, resultadoOmp(i_omp))
!$OMP CRITICAL (forceloop)
resultado%uno = resultado%uno + resultadoOmp(i_omp)%uno
!$OMP END CRITICAL (forceloop)
enddo
!$OMP END PARALLEL DO
resultado%uno = resultado%uno/nthreads
オプション 2: 回避CRITICAL
(およびATOMIC
)
!$OMP PARALLEL DO shared(large) private(i_omp) schedule(static,1)
do i_omp=1, nthreads
call do_something(large, resultadoOmp(i_omp))
enddo
!$OMP END PARALLEL DO
uno = 0.d0
!$OMP PARALLEL DO shared(resultado) private(i_omp) schedule(static,1) &
!$OMP & REDUCTION(+:uno)
do i_omp=1, nthreads
uno = uno + resultadoOmp(i_omp)%uno
end do
!$OMP END PARALLEL DO
resultado%uno = uno/nthreads
この点では、使用できませんでしREDUCTION(+:resultado%uno)
たREDUCTION(+:resultado)
。数値型のみが許可されています。
この方法 (IMO) の欠点は、resultadoOmp
スレッドの数を使用して派生チップの寸法を決める必要があることです。利点はCRITICAL
、パフォーマンスに影響を与える可能性のある句を回避できることです。そうですか?