fortran - OpenMP 子程序中没有线程

标签 fortran openmp

我正在用 Fortran 语言编写一个矩阵乘法子例程。我正在使用英特尔 Fortran 编译器。我编写了一个简单的静态调度并行 do-loop。不幸的是,它只在一个线程上运行。代码如下:

      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_GET_THREAD_NUM。默认的隐式类型规则意味着它将是 real 类型。这与 OpenMP 规范中对该名称的函数的声明不一致。

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

关于fortran - OpenMP 子程序中没有线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12646504/

相关文章:

python - 如何使用模块将 Python 回调公开给 Fortran

c++ - OpenMP、QTextEdit 和 QPlainTextEdit

c - OpenMP 并行化效率不高

fortran - 调用 gfortran 而不是 mpif90

fortran - 将内部过程作为参数传递

integer - 在 fortran 中访问无符号整数值

linux - 寻找丢失的共享库

cmake - CMake找不到OpenMP

c++ - 使用 vector 中的每 2 个元素进行计算的嵌套循环中的段错误

替换 openmp 关键区域的汇编指令