Fortran で行列乗算サブルーチンを作成しています。Intel Fortran コンパイラを使用しています。簡単な静的スケジュール並列 do ループを作成しました。残念ながら、それは 1 つのスレッドでしか実行されていません。コードは次のとおりです。
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 を返します
- TID は、I のすべての反復で 0 です (これは当てはまりません)。
私は自分の間違いを診断することができません。これに関するご意見をいただければ幸いです。