我正在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
Run Code Online (Sandbox Code Playgroud)
注意:
我已确认以下内容:
我无法诊断我的错误.我很感激有关此的任何意见.
未明确声明标识符OMP_GET_THREAD_NUM.默认的隐式输入规则意味着它将是真实的类型.这与OpenMP规范中该名称功能的声明不一致.
添加USE OMP_LIB
将解决该问题.此外,不使用隐式类型(IMPLICIT NONE
)可以避免这种情况和大量类似的问题.