デフォルトでは、インテル® MKL は n スレッド使用します (n はシステムの物理コアの数)。 この演習では、スレッド数を制限して 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 K = 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 ",K," thread(s)"
30 FORMAT(A,I2,A)
CALL MKL_SET_NUM_THREADS(K)
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,P,ALPHA,A,M,B,P,BETA,C,M)
PRINT *, "Measuring performance of matrix product using "
PRINT 40, " Intel® MKL DGEMM subroutine on ",K," thread(s)"
40 FORMAT(A,I2,A)
PRINT *, ""
S_INITIAL = DSECND()
DO R = 1, LOOP_COUNT
CALL DGEMM('N','N',M,N,P,ALPHA,A,M,B,P,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 ",K," 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] タブで確認することができます。