我正在用 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/