为什么FirstPrivate在Fortran中使用了错误的值?

时间:2014-09-03 12:28:10

标签: fortran openmp

当使用带有来自子程序输入的参数的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

0 个答案:

没有答案