2

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 です (これは当てはまりません)。

私は自分の間違いを診断することができません。これに関するご意見をいただければ幸いです。

4

1 に答える 1

5

識別子 OMP_GET_THREAD_NUM が明示的に宣言されていません。デフォルトの暗黙の型付け規則は、実数型になることを意味します。これは、その名前の関数に対する OpenMP 仕様の宣言と一致しません。

追加USE OMP_LIBすると、その問題が修正されます。さらに、暗黙の型付け ( IMPLICIT NONE) を使用しないことで、これおよび多数の同様の問題を回避できます。

于 2012-09-28T20:27:47.830 に答える