我在fortran中遇到以下OMP问题:
虽然我已经找到了很多关于在并行区域内调用子程序的文献,但我在反向过程中遇到了困难。也就是说,在一个单独的文件中,我定义了一个包含几个子程序的模块。这些子程序我想包含并行区域。每次调用所述子程序时,这些区域应该并行执行。
现在,简单地在模块的子程序中添加OMP指令的简单方法,就像在主程序中一样,似乎不起作用。程序编译并执行得很好,但始终完全忽略OMP语句(-openmp-report = 2选项不会将这些区域标识为并行),因此以串行方式运行。我想使用这些子程序的主程序还包含可以正常工作的并行区域。
在主程序中,我包含USE OMP_LIB
,但在子程序中包含OMP_GET_THREAD_NUM()
等函数会给我一个错误,因为this name does not have a type
。再次包括USE OMP_LIB
,显式在子例程中摆脱了这个错误,但仍然没有让子例程再次运行。
我很困惑。我有什么明显的遗漏吗?
模块(示意性地)定义如下:
MODULE par_module
contains
SUBROUTINE sub1(var1,var2,var3...)
implicit none
INTEGER ... !variable definitions
!$OMP PARALLEL &
!$OMP DEFAULT(NONE) &
!$OMP SHARED(v_shared1,v_shared2,...) &
!$OMP PRIVATE(v_priv1,v_priv2,...)
!content
!$OMP DO
DO i=1,N
!more conent
ENDDO
!$OMP END DO
!$OMP END PARALLEL
END SUBROUTINE sub1
SUBROUTINE sub2...
!...
END SUBROUTINE sub2
END MODULE