我在Fortran中有一个很大的代码,它有一个商业许可证,所以我不能
发布代码。它包含几个模块,每个模块都有几个子程序。我使用-fopenmp
标志编译了该代码(我使用了标志
对于程序中的所有文件)。
在一个子程序中,我放置了代码
!$OMP PARALLEL
nthreads=OMP_GET_NUM_THREADS()
write(6,*) 'threads', nthreads
!$OMP END PARALLEL
最初,该程序抱怨无法识别的OMP_GET_NUM_THREADS数据类型。我在这个论坛上看到了一些帖子
使用use omp_lib
加载运行时库是suggested。后
将这一行添加到子程序中,程序运行但是打印了
线程1
好像只有一个线程被使用,即使我设置
export OMP_NUM_THREADS=10
我的问题是,我应该在每个子程序中使用use omp_lib
吗?或者可能
只在“主要”节目?
正如我之前所说,这个子程序(我编写omp
指令的地方)是
在一个模块内。
答案 0 :(得分:0)
您需要在子例程的范围内声明OMP_Get_num_threads()
。这可能发生在该子例程中的use
语句中,或者,因为您在模块的标题中使用模块。在下面粘贴的片段中,我做了两个。
注意,对OMP_Get_num_threads()
的函数调用需要嵌入到并行部分中(就像在代码片段中所做的那样),否则结果总是1
。
由于模块无法访问主程序的范围,因此use
模块不够用(但编译器会在链接二进制文件时告诉您)。
module testMod
use omp_lib, only: OMP_Get_num_threads
implicit none
contains
subroutine printThreads()
use omp_lib, only: OMP_Get_num_threads
implicit none
! This will always print "1"
print *,OMP_Get_num_threads()
! This will print the actual number of threads
!$omp parallel
print *,OMP_Get_num_threads()
!$omp end parallel
end subroutine
end module
program test
use testMod, only: printThreads
implicit none
call printThreads()
end program
具有以下结果:
OMP_NUM_THREADS=2 ./a.out
1
2
2
OMP_NUM_THREADS=4 ./a.out
1
4
4
4
4