インテル® MKL 11.3 を使用した行列乗算チュートリアル

dgemm によるスレッド化の効果の測定

デフォルトでは、インテル® MKL は n スレッド使用します (n はシステムの物理コアの数)。 この演習では、スレッド数を制限して dgemm のパフォーマンスの変化を測定することで、スレッド化がパフォーマンスに与える影響を説明します。

dgemm で使用するコアの数を制限する

この演習では、mkl_set_num_threads ルーチンを使用してデフォルトのスレッド数を変更し、mkl_get_max_threads ルーチンを使用して最大スレッド数を決定します。

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

      PRINT *, "Finding max number of threads Intel® MKL can use for"
      PRINT *, "parallel runs"
      PRINT *, ""
      MAX_THREADS = MKL_GET_MAX_THREADS()

      PRINT 20," Running Intel® MKL from 1 to ",MAX_THREADS," threads"
 20   FORMAT(A,I2,A)
      PRINT *, ""
      DO L = 1, MAX_THREADS
        DO I = 1, M
          DO J = 1, N
            C(I,J) = 0.0
          ENDDO
        ENDDO

        PRINT 30, " Requesting Intel® MKL to use ",L," thread(s)"
 30     FORMAT(A,I2,A)
        CALL MKL_SET_NUM_THREADS(L)

        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 40, " Intel® MKL DGEMM subroutine on ",L," thread(s)"
 40     FORMAT(A,I2,A)
        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 =="
        PRINT 60, " == using ",L," thread(s) =="
 50     FORMAT(A,F12.5,A)
 60     FORMAT(A,I2,A)
        PRINT *, ""
      END DO

結果から、スレッド数が増加するとともに行列乗算の時間が減少していることが分かります。この演習を、mkl_get_max_threads で返されたスレッド数よりも多くのスレッド数で実行すると、物理コアよりも多くのスレッド数を使用したときにパフォーマンスが低下します。

dgemm の特定のパフォーマンス結果は、http://software.intel.com/en-us/articles/intel-mkl (英語) の [Details] タブで確認することができます。

戻る次へ

関連情報