的Fortran&OpenMP的:如何声明和分配可分配THREADPRIVATE数组

时间:2019-02-01 23:25:36

标签: fortran openmp gfortran fortran90

我有一个串行代码,可以在模块中声明一堆变量,然后在程序的其余部分和子例程中use插入这些模块。现在,我正在尝试并行处理此代码。我想并行运行一部分代码,除了一个数组gtmp之外,其他代码似乎都可以正常运行。我想每个线程都有它自己的版本gtmp,我想那个版本是私有的其各自的线程,所以我使用了threadprivate指令。 gtmp仅在代码的并行区域内或仅从代码的并行部分调用的子例程内使用。

起初我分配gtmp在平行部前的码的序列部分,但是这是一个问题,因为然后只的主线程“版本” gtmp得到分配,而另一个线程'版本' 的gtmpsize的{​​{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之前,但似乎笨重,所以我想知道什么是“正确”的方式做这样的事情是

感谢您的帮助!

0 个答案:

没有答案