我有一个串行代码,可以在模块中声明一堆变量,然后在程序的其余部分和子例程中use
插入这些模块。现在,我正在尝试并行处理此代码。我想并行运行一部分代码,除了一个数组gtmp
之外,其他代码似乎都可以正常运行。我想每个线程都有它自己的版本gtmp
,我想那个版本是私有的其各自的线程,所以我使用了threadprivate
指令。 gtmp
仅在代码的并行区域内或仅从代码的并行部分调用的子例程内使用。
起初我分配gtmp
在平行部前的码的序列部分,但是这是一个问题,因为然后只的主线程“版本” gtmp
得到分配,而另一个线程'版本' 的gtmp
有size
的{{1}},而不是1
,(这是由 “测试” 出gtmp
声明的预期分配的大小)。我认为这是因为主线程是串行部分中唯一执行代码的线程。所以,我提出的print
线成平行区域,其允许具有适当尺寸的所有线程/分配allocate
阵列,但由于我的平行区域是一个循环中出现错误时,程序试图在gtmp
循环的第二次迭代中第二次分配gtmp
。
注意:在代码别处在所有其它变量r
是给定的值
下面是具有该问题的代码的简化部分:
mymod
因此,该问题是由这样的事实,我需要所有线程为活动的,(即在并行区域),以适当地初始化所有“版本”来的module mymod
integer :: xBins, zBins, rBins, histCosThBins, histPhiBins, cfgRBins
real(kind=dp),allocatable :: gtmp(:,:,:)
end module mymod
subroutine compute_avg_force
use mymod
implicit none
integer :: r, i, j, ip
integer :: omp_get_thread_num, tid
! I used to allocate 'gtmp' here.
do r = 1, cfgRBins
!$omp PARALLEL DEFAULT( none ) &
!$omp PRIVATE( ip, i, j, tid ) &
!$omp SHARED( r, xBins, zBins, histCosThBins, histPhiBins )
allocate( gtmp(4,0:histCosThBins+1,0:histPhiBins+1) )
tid = omp_get_thread_num() !debug
print*, 'test', tid, histCosThBins, histPhiBins, size(gtmp)
!$omp DO SCHEDULE( guided )
do ip = 1, (xBins*zBins)
call subroutine_where_i_alter_gtmp(...)
...code to be executed in parallel using gtmp...
end do !ip
!$omp END DO
!$omp END PARALLEL
end do !r
end subroutine compute_avg_force
,但我的平行区域是内部的循环,并且我不能多次分配gtmp
。
在短,什么是分配gtmp
在此代码的正确方法?我以为我可以只让另一个gtmp
区域循环并用它来分配omp parallel
之前,但似乎笨重,所以我想知道什么是“正确”的方式做这样的事情是
感谢您的帮助!