Fortran OpenMP子例程中没有线程

Fortran OpenMP子例程中没有线程,fortran,openmp,Fortran,Openmp,我正在用Fortran写一个矩阵乘法子程序。我正在使用英特尔Fortran编译器。我已经编写了一个简单的静态计划并行do循环。不幸的是,它只在一个线程上运行。代码如下: SUBROUTINE MATMULT(A,B,C,L,M,N) REAL*8 A,B,C INTEGER NCORES, CHUNK, TID DIMENSION A(L,N),B(L,M),C(M,N) PARAMETER (NCORES=8) CHUNK

我正在用Fortran写一个矩阵乘法子程序。我正在使用英特尔Fortran编译器。我已经编写了一个简单的静态计划并行do循环。不幸的是,它只在一个线程上运行。代码如下:

      SUBROUTINE MATMULT(A,B,C,L,M,N)
      REAL*8 A,B,C
      INTEGER NCORES, CHUNK, TID
      DIMENSION A(L,N),B(L,M),C(M,N)
      PARAMETER (NCORES=8)
      CHUNK=(L/(NCORES+1))+1
      TID=0
!$OMP PARALLELDO SHARED(A,B,C,L,M,N,CHUNK) PRIVATE(I,J,K,TID)
!$OMP+DEFAULT(NONE) SCHEDULE(STATIC,CHUNK)
      DO I=1,L
         TID = OMP_GET_THREAD_NUM()
         PRINT *, "THREAD ", TID, " ON I=", I
         DO K=1,N
            DO J=1,M
               A(I,K) = A(I,K) + B(I,J)*C(J,K)
            END DO
         END DO
      END DO
!$OMP END PARALLELDO
      RETURN
      END
注:

  • 主程序中没有调用例程的并行指令
  • 数组A、B、C在主程序中串行初始化。A被初始化为零
  • 我在编译期间强制使用Fortran固定源代码形式
我已确认以下事项:

  • 另一个示例程序可以使用8个线程正常工作(因此没有硬件问题)
  • 我使用了-openmp编译器参数
  • OMP_GET_NUM_PROCS()和OMP_GET_MAX_THREADS()都返回0
  • 对于I上的每个迭代,TID都是0(不应该是这种情况)

我无法诊断我的错误。如果您能提供任何相关信息,我将不胜感激。

未明确声明标识符OMP\u GET\u THREAD\u NUM。默认的隐式类型规则意味着它将是real类型。这与OpenMP规范中该名称函数的声明不一致


添加
使用OMP_LIB
可以解决这个问题。此外,不使用隐式类型(
implicit NONE
)可以避免这一问题和大量类似问题。

如果使用ntel Fortran,为什么不使用MKL的线程BLAS例程?使用这种简单的循环方法,您自己永远不会获得类似的性能。即使是普通的优化BLAS也比你的OpenMP子程序快,我也不会感到惊讶。是的,我还在尝试。DGEMM的运行速度比循环慢一点。我仍然需要研究编译器优化选项。嗨,我有一个fortran的大代码,其中包含几个模块,每个模块都有许多子例程。我编译了带有-fopenmp标志的代码,并在一个子例程中放置了$OMP并行指令。然后,我放入子程序“use omp_lib”。问题是当我写“write(6,*)OMP\u GET\u THREAD\u NUM()”时。它总是显示1(1个线程),即使我使用export-OMP\u-NUM\u-THREADS=4。我应该在哪里写“使用omp_库”?在每个子程序中?在主程序中?谢谢