2

我正在用 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(不应该是这种情况)

我无法诊断我的错误。我很感激对此的任何投入。

4

1 回答 1

5

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

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

于 2012-09-28T20:27:47.830 回答