我正在用 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(不应该是这种情况)
我无法诊断我的错误。我很感激对此的任何投入。