Parallel processing fortran中的OMP:忽略子例程中的并行区域。

Parallel processing fortran中的OMP:忽略子例程中的并行区域。,parallel-processing,fortran,subroutine,openmp,Parallel Processing,Fortran,Subroutine,Openmp,我在fortran中使用OMP时遇到以下问题: 虽然我已经找到了很多关于在并行区域内调用子例程的文献,但我很难找到相反的过程。也就是说,在一个单独的文件中,我定义了一个包含两个子例程的模块。我希望这些子例程包含并行区域。每次我调用上述子例程时,这些区域应该并行执行 现在,像我在主程序中所做的那样,简单地在模块的子例程中添加OMP指令的天真方式似乎不起作用。该程序编译和执行得很好,但始终完全忽略OMP语句,-openmp report=2选项未将这些区域标识为并行,因此以串行方式运行。我想在其中使

我在fortran中使用OMP时遇到以下问题:

虽然我已经找到了很多关于在并行区域内调用子例程的文献,但我很难找到相反的过程。也就是说,在一个单独的文件中,我定义了一个包含两个子例程的模块。我希望这些子例程包含并行区域。每次我调用上述子例程时,这些区域应该并行执行

现在,像我在主程序中所做的那样,简单地在模块的子例程中添加OMP指令的天真方式似乎不起作用。该程序编译和执行得很好,但始终完全忽略OMP语句,-openmp report=2选项未将这些区域标识为并行,因此以串行方式运行。我想在其中使用这些子程序的主程序也包含并行区域,这些区域可以毫无问题地工作

在主程序中,我包含USE OMP_LIB,但在子例程中包含OMP_GET_THREAD_NUM等函数会导致错误,因为此名称没有类型。再次在子例程中显式地包含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

与冗长的描述相比,完全可编译的示例更好。您如何发现它不是并行运行的?我假设您是使用openmp标志编译的?如果您在子例程中使用omp函数,则必须在子例程中使用omp_lib或子例程知道omp_lib,以便子例程知道接口。您说“英特尔编译器openmp报告”不报告这些子例程。运行程序时,从OMP_get_THREAD_NUM得到什么值?子例程中的OMP应该可以正常工作。我已经做过很多次了。你能告诉我们你是如何编译这个程序的吗?我怀疑您只是在链接时才使用openmp标志,而不是在编译单个文件时。是的,就是这样,我在makefile中使用了openmp标志。将子例程复制到同一个文件中就成功了。