OpenMP在子程序中没有线程

时间:2012-09-28 19:52:20

标签: 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=(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(不应该是这种情况)

我无法诊断我的错误。我对此表示感谢。

1 个答案:

答案 0 :(得分:5)

未明确声明标识符OMP_GET_THREAD_NUM。默认的隐式输入规则意味着它将是真实的类型。这与OpenMP规范中该名称功能的声明不一致。

添加USE OMP_LIB可以解决该问题。此外,不使用隐式类型(IMPLICIT NONE)可以避免这种情况和许多类似的问题。