主题:求救!数组在OpenMP并行后,数组数据出现NaN无效数据!
程序在做OpenMP并行后,并行区内的数据总会莫名其妙地出现NaN,然后结果就完全错误了。大家能帮我看一下是什么问题么? 下面是其中一段出现这样情况的程序,FX与FY属于并行区内被调用子函数hdifft_gm的局部变量,FX与FY这个变量的2次打印间没有被赋值过,但两次打印结果就不一样了,后一次打印的值间歇地出现了NaN无效数据。求大家帮我看一下问题出在哪里?这个问题折磨了我好久,没有办法解决!其他部分的并行代码也有类似的问题。对了,我用的是OpenMP与MPICH2的混合并行,在一个进程中再分出8个线程来执行代码。所以下面打印代表的是0号进程的1号线程的数据。
if(my_task==0)then
if(bid==1)then
open(43,file='A3.txt')
write(43,*)FX(i,j)
open(44,file='A4.txt')
write(44,*)FY(i,j)
endif
endif
do j=this_block%jb,this_block%je
do i=this_block%ib,this_block%ie
fz = -KMASK(i,j)* &
(dz(k )*KPTMP1(i,j)* &
(SLX(i,j,ieast ,kbt ,bid)*HYX(i ,j,bid)* &
TX(i ,j,kn,n,bid) &
+ SLY(i,j,jnorth,kbt ,bid)*HXY(i ,j,bid)* &
TY(i ,j,kn,n,bid) &
+ SLX(i,j,iwest ,kbt ,bid)*HYX(i-1,j,bid)* &
TX(i-1,j,kn,n,bid) &
+ SLY(i,j,jsouth,kbt ,bid)*HXY(i,j-1,bid)* &
TY(i,j-1,kn,n,bid)) &
+ dz(k+1)*KPTMP2(i,j)* &
(SLX(i,j,ieast ,kbt2,bid)*HYX(i ,j,bid)* &
TX(i ,j,ks,n,bid) &
+ SLY(i,j,jnorth,kbt2,bid)*HXY(i ,j,bid)* &
TY(i ,j,ks,n,bid) &
+ SLX(i,j,iwest ,kbt2,bid)*HYX(i-1,j,bid)* &
TX(i-1,j,ks,n,bid) &
+ SLY(i,j,jsouth,kbt2,bid)*HXY(i,j-1,bid)* &
TY(i,j-1,ks,n,bid)))
GTK(i,j,n) = (FX(i,j) - FX(i-1,j) + FY(i,j) - FY(i,j-1) &
+ FZTOP(i,j,n,bid) - fz)* &
dzr(k)*TAREA_R(i,j,bid)
FZTOP(i,j,n,bid) = fz
if(my_task==0)then
if(bid==1)then
open(37,file='H3.txt')
write(37,*)FX(i,j)
open(38,file='H4.txt')
write(38,*)FY(i,j)
endif
endif
end do
end do
else ! k=km
do j=this_block%jb,this_block%je
do i=this_block%ib,this_block%ie
!fz = 0
GTK(i,j,n) = (FX(i,j) - FX(i-1,j) + FY(i,j) - FY(i,j-1) &
+ FZTOP(i,j,n,bid))* &
dzr(k)*TAREA_R(i,j,bid)
FZTOP(i,j,n,bid) = c0
end do
end do
endif
endif
if(my_task==0)then
if(bid==1)then
open(43,file='A3.txt')
write(43,*)FX(i,j)
open(44,file='A4.txt')
write(44,*)FY(i,j)
endif
endif
do j=this_block%jb,this_block%je
do i=this_block%ib,this_block%ie
fz = -KMASK(i,j)* &
(dz(k )*KPTMP1(i,j)* &
(SLX(i,j,ieast ,kbt ,bid)*HYX(i ,j,bid)* &
TX(i ,j,kn,n,bid) &
+ SLY(i,j,jnorth,kbt ,bid)*HXY(i ,j,bid)* &
TY(i ,j,kn,n,bid) &
+ SLX(i,j,iwest ,kbt ,bid)*HYX(i-1,j,bid)* &
TX(i-1,j,kn,n,bid) &
+ SLY(i,j,jsouth,kbt ,bid)*HXY(i,j-1,bid)* &
TY(i,j-1,kn,n,bid)) &
+ dz(k+1)*KPTMP2(i,j)* &
(SLX(i,j,ieast ,kbt2,bid)*HYX(i ,j,bid)* &
TX(i ,j,ks,n,bid) &
+ SLY(i,j,jnorth,kbt2,bid)*HXY(i ,j,bid)* &
TY(i ,j,ks,n,bid) &
+ SLX(i,j,iwest ,kbt2,bid)*HYX(i-1,j,bid)* &
TX(i-1,j,ks,n,bid) &
+ SLY(i,j,jsouth,kbt2,bid)*HXY(i,j-1,bid)* &
TY(i,j-1,ks,n,bid)))
GTK(i,j,n) = (FX(i,j) - FX(i-1,j) + FY(i,j) - FY(i,j-1) &
+ FZTOP(i,j,n,bid) - fz)* &
dzr(k)*TAREA_R(i,j,bid)
FZTOP(i,j,n,bid) = fz
if(my_task==0)then
if(bid==1)then
open(37,file='H3.txt')
write(37,*)FX(i,j)
open(38,file='H4.txt')
write(38,*)FY(i,j)
endif
endif
end do
end do
else ! k=km
do j=this_block%jb,this_block%je
do i=this_block%ib,this_block%ie
!fz = 0
GTK(i,j,n) = (FX(i,j) - FX(i-1,j) + FY(i,j) - FY(i,j-1) &
+ FZTOP(i,j,n,bid))* &
dzr(k)*TAREA_R(i,j,bid)
FZTOP(i,j,n,bid) = c0
end do
end do
endif
endif