主题:在OpenMP并行区内调用子函数,运算结果出错
不知道在并行区内调用的子函数的变量是如何算的(共享还是私有?)。我并行区内调用子函数之后,与串行执行的值完全不一样。下面是我的OpenMP并行程序:(前面计算结果和串行结果一样,下面显示调用函数后结果不一样的代码)
!$OMP PARALLEL PRIVATE(iblock,k,WTK)
!$OMP DO
do iblock = 1,nblocks_clinic
do k = 1,km
.............................
call hdifft(k, WTK, TMIX(:,:,iblock), UMIX(:,:,iblock), VMIX(:,:,iblock))
if(iblock==3)then
print*,WTK
endif
.............................
end do
end do
!$OMP END DO
!$OMP END PARALLEL
上面打印的WTK值与串行执行完全不一样,检测hifft函数,主要出错代码部分是hdifft里面的一个合并函数
merge,这是Fortran95的函数,根据k < KMT(:,:,iblock) 合并 1和0两个矩阵
WTK = merge(c1, c0, k < KMT(:,:,iblock))
我研究了好久都没看出来为什么串行和openMP并行为啥执行就不一样了,求各位专家指导一下,非常感谢!!
!$OMP PARALLEL PRIVATE(iblock,k,WTK)
!$OMP DO
do iblock = 1,nblocks_clinic
do k = 1,km
.............................
call hdifft(k, WTK, TMIX(:,:,iblock), UMIX(:,:,iblock), VMIX(:,:,iblock))
if(iblock==3)then
print*,WTK
endif
.............................
end do
end do
!$OMP END DO
!$OMP END PARALLEL
上面打印的WTK值与串行执行完全不一样,检测hifft函数,主要出错代码部分是hdifft里面的一个合并函数
merge,这是Fortran95的函数,根据k < KMT(:,:,iblock) 合并 1和0两个矩阵
WTK = merge(c1, c0, k < KMT(:,:,iblock))
我研究了好久都没看出来为什么串行和openMP并行为啥执行就不一样了,求各位专家指导一下,非常感谢!!