チュートリアル: インテル® MKL 2018 を使用した行列乗算 (Fortran 言語)

インテル® MKL サポート関数を使用したパフォーマンスの測定

インテル® MKL には、パフォーマンスを測定する関数が用意されています。ここでは、このチュートリアルでインテル® MKL ルーチンを使用したことによりどの程度パフォーマンスが向上したかを測定する方法を示します。

dgemm のパフォーマンスの測定

dsecnd ルーチンを使用して経過 CPU 時間を秒で返します。

dgemm ルーチンは迅速に実行されるため、大きな行列を計算した場合でも、速度を測定することは困難です。このため、演習では乗算を複数回実行します。合計実行時間が約 1 秒になるように LOOP_COUNT 定数の値を設定します。

*      Fortran ソースコードは dgemm_with_timing.f を参照

      PRINT *, "Making the first run of matrix product using "
      PRINT *, "Intel® MKL DGEMM subroutine to get stable "
      PRINT *, "run time measurements"
      PRINT *, ""
      CALL DGEMM('N','N',M,N,K,ALPHA,A,M,B,K,BETA,C,M)

      PRINT *, "Measuring performance of matrix product using "
      PRINT *, "Intel® MKL DGEMM subroutine"
      PRINT *, ""
      S_INITIAL = DSECND()
      DO R = 1, LOOP_COUNT
        CALL DGEMM('N','N',M,N,K,ALPHA,A,M,B,K,BETA,C,M)
      END DO
      S_ELAPSED = (DSECND() - S_INITIAL) / LOOP_COUNT
      PRINT *, "== Matrix multiplication using Intel® MKL DGEMM =="
      PRINT 50, " == completed at ",S_ELAPSED*1000," milliseconds =="
 50   FORMAT(A,F12.5,A)
      PRINT *, ""

dgemm を使用しない場合のパフォーマンスの測定

dgemm を使用した場合のパフォーマンスの向上を示すため、三重に入れ子にしたループを使用して同じ行列乗算を行った結果を測定します。

*       Fortran ソースコードは matrix_multiplication.f を参照

      PRINT *, "Making the first run of matrix product using "
      PRINT *, "triple nested loop to get stable run time"
      PRINT *, "measurements"
      PRINT *, ""
      DO I = 1, M
        DO J = 1, N
          TEMP = 0.0
          DO L = 1, K
            TEMP = TEMP + A(I,L) * B(L,J) 
          END DO
          C(I,J) = TEMP
        END DO
      END DO
      
      PRINT *, "Measuring performance of matrix product using "
      PRINT *, "triple nested loop"
      PRINT *, ""
      S_INITIAL = DSECND()
      DO R = 1, LOOP_COUNT
        DO I = 1, M
          DO J = 1, N
            TEMP = 0.0
            DO L = 1, K
              TEMP = TEMP + A(I,L) * B(L,J) 
            END DO
            C(I,J) = TEMP
          END DO
        END DO
      END DO
      S_ELAPSED = (DSECND() - S_INITIAL) / LOOP_COUNT
      PRINT *, "== Matrix multiplication using triple nested loop =="
      PRINT 50, " == completed at ",S_ELAPSED*1000," milliseconds =="
 50   FORMAT(A,F12.5,A)
      PRINT *, ""
 

dgemm を使用した最初の演習の結果と、dgemm を使用しない 2 つ目の演習の結果を比較します。

インテル® MKL のパフォーマンス測定の詳細については、インテル® MKL ナレッジベースの記事、「A simple example to measure the performance of an Intel MKL function (インテル® MKL 関数のパフォーマンスを測定する単純なサンプル)」を参照してください。

最適化に関する注意事項

インテル® コンパイラーでは、インテル® マイクロプロセッサーに限定されない最適化に関して、他社製マイクロプロセッサー用に同等の最適化を行えないことがあります。これには、インテル® ストリーミング SIMD 拡張命令 2、インテル® ストリーミング SIMD 拡張命令 3、インテル® ストリーミング SIMD 拡張命令 3 補足命令などの最適化が該当します。インテルは、他社製マイクロプロセッサーに関して、いかなる最適化の利用、機能、または効果も保証いたしません。本製品のマイクロプロセッサー依存の最適化は、インテル® マイクロプロセッサーでの使用を前提としています。インテル® マイクロアーキテクチャーに限定されない最適化のなかにも、インテル® マイクロプロセッサー用のものがあります。この注意事項で言及した命令セットの詳細については、該当する製品のユーザー・リファレンス・ガイドを参照してください。

注意事項の改訂 #20110804

戻る次へ

関連情報