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

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

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

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

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

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

/* C ソースコードは dgemm_with_timing.c を参照 */

    printf (" Making the first run of matrix product using Intel® MKL dgemm function \n"
            " via CBLAS interface to get stable run time measurements \n\n");
    cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, 
                m, n, k, alpha, A, k, B, n, beta, C, n);

    printf (" Measuring performance of matrix product using Intel® MKL dgemm function \n"
            " via CBLAS interface \n\n");
    s_initial = dsecnd();
    for (r = 0; r < LOOP_COUNT; r++) {
        cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, 
                    m, n, k, alpha, A, k, B, n, beta, C, n);
    }
    s_elapsed = (dsecnd() - s_initial) / LOOP_COUNT;

    printf (" == Matrix multiplication using Intel® MKL dgemm completed == \n"
            " == at %.5f milliseconds == \n\n", (s_elapsed * 1000));

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

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

/* C ソースコードは matrix_multiplication.c を参照 */

    printf (" Making the first run of matrix product using triple nested loop\n"
            " to get stable run time measurements \n\n");
    for (i = 0; i < m; i++) {
        for (j = 0; j < n; j++) {
            sum = 0.0;
            for (l = 0; l < k; l++)
                sum += A[k*i+l] * B[n*l+j];
            C[n*i+j] = sum;
        }
    }

    printf (" Measuring performance of matrix product using triple nested loop \n\n");
    s_initial = dsecnd();
    for (r = 0; r < LOOP_COUNT; r++) {
        for (i = 0; i < m; i++) {
            for (j = 0; j < n; j++) {
                sum = 0.0;
                for (l = 0; l < k; l++)
                    sum += A[k*i+l] * B[n*l+j];
                C[n*i+j] = sum;
            }
        }
    }
    s_elapsed = (dsecnd() - s_initial) / LOOP_COUNT;
    
    printf (" == Matrix multiplication using triple nested loop completed == \n"
            " == at %.5f milliseconds == \n\n", (s_elapsed * 1000));

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

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

戻る次へ

関連情報