我正在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
注意:
我已确认以下内容:
我无法诊断我的错误。我对此表示感谢。
答案 0 :(得分:5)
未明确声明标识符OMP_GET_THREAD_NUM。默认的隐式输入规则意味着它将是真实的类型。这与OpenMP规范中该名称功能的声明不一致。
添加USE OMP_LIB
可以解决该问题。此外,不使用隐式类型(IMPLICIT NONE
)可以避免这种情况和许多类似的问题。