当使用带有来自子程序输入的参数的FIRSTPRIVATE指令时,我遇到了问题。执行并行代码时,即使使用一个线程,FIRSTPRIVATE指令内的变量值也不正确。看起来OpenMP没有正确读取内存并且没有初始化值。
我找到了解决这个问题的方法,我以前一直在使用它。我声明了辅助变量然后我将输入变量分配给这个新的辅助变量。但我不认为这个解决方案是非常正确的。
你觉得怎么样?
编辑:使用shared
代替firstprivate
无法解决问题。
这是子程序代码:
SUBROUTINE write_output_values (theta,phi,inc_theta,inc_phi,values,threads,pr)
integer, intent(in) :: theta, phi, threads
real, intent(in) :: inc_theta, inc_phi, values(theta,phi,3), pr
integer :: i, j
real :: thetar, phir, d1, d2, d3, d1_aux(theta,phi), d2_aux(theta,phi), d3_aux(theta,phi)
open(1,file='./resul/values.out',status='replace')
!$OMP PARALLEL NUM_THREADS(threads) DEFAULT(PRIVATE) FIRSTPRIVATE(phi,theta,pr) SHARED(values,d1_aux,d2_aux,d3_aux)
!$OMP DO SCHEDULE(STATIC)
do j=1,phi
do i=1,theta
d1=4*values(i,j,1)*pr
if(d1.lt.1.0e-10) d1=1.0e-10
d1=10.0*log10(d1)
d2=4*values(i,j,2)*pr
if(d2.lt.1.0e-10) d2=1.0e-10
d2=10.0*log10(d2)
d3=4*values(i,j,3)*pr
if(d3.lt.1.0e-10) d3=1.0e-10
d3=10.0*log10(d3)
d1_aux(i,j) = d1
d2_aux(i,j) = d2
d3_aux(i,j) = d3
end do
end do
!$OMP END DO
!$OMP END PARALLEL
do j=1,phi
phir=(j-1)*inc_phi
do i=1,theta
thetar=(i-1)*inc_theta
write(1,'(f6.2,2x,f6.2,2x,e12.6,2x,e12.6,2x,e12.6,2x,e12.6)')thetar,phir,d3_aux(i,j),d1_aux(i,j),d2_aux(i,j)
end do
end do
!Cerramos el archivo
close(1)
END SUBROUTINE write_output_values