インテル® MKL 11.3 ユーザーズガイド

コンパイラーによるオフロード支援の例

以下に、コンパイラーによるオフロード支援の例を示します。詳細は、『インテル® コンパイラー・ユーザー・リファレンス・ガイド』を参照してください。

これらの例は、インテル® MIC アーキテクチャー・ベースのコプロセッサー上で実行するオフロード領域からインテル® MKL を呼び出す方法、およびコプロセッサーのメモリーに既に存在するデータを再利用してデータ転送を最小限にする方法を示しています。

Fortran

c     カードに A と B をアップロードします。プラグマの後で A と B の割り当てを
c     解除しません。C はアップロードされダウンロードされますが、割り当てられた
c     メモリーは保持されます。
      !DEC$ ATTRIBUTES OFFLOAD : MIC :: SGEMM
      !DEC$ OFFLOAD TARGET( MIC:0 ) IN( N ), &
      !DEC$ IN( A: LENGTH( N * N ) ALLOC_IF(.TRUE.) FREE_IF(.FALSE.)), &
      !DEC$ IN( B: LENGTH( N * N ) ALLOC_IF(.TRUE.) FREE_IF(.FALSE.)), &
      !DEC$ INOUT( C: LENGTH( N * N ) ALLOC_IF(.TRUE.) FREE_IF(.FALSE.))
      CALL SGEMM( 'N', 'N', N, N, N, 1.0, A, N, B, N, 1.0, C, N )

c     ここで C を変更します。

c     カードの A と B を再利用して新しい C をアップロードします。カードの
c     メモリーをすべて解放します。
      !DEC$ ATTRIBUTES OFFLOAD : MIC :: SGEMM
      !DEC$ OFFLOAD TARGET( MIC:0 ) IN( N ), &
      !DEC$ NOCOPY( A: LENGTH( N * N ) ALLOC_IF(.FALSE.) FREE_IF(.TRUE.)), &
      !DEC$ NOCOPY( B: LENGTH( N * N ) ALLOC_IF(.FALSE.) FREE_IF(.TRUE.)), &
      !DEC$ INOUT( C: LENGTH( N * N ) ALLOC_IF(.FALSE.) FREE_IF(.TRUE.))
      CALL SGEMM( 'N', 'N', N, N, N, 1.0, A, N, B, N, -1.0, C, N )

C

    /* カードに A と B をアップロードします。プラグマの後で A と B の割り当てを解除しません。
     * C はアップロードされダウンロードされますが、割り当てられたメモリーは保持されます。*/
#pragma offload target(mic:0) \
    in(A: length(matrix_elements) alloc_if(1) free_if(0)) \
    in(B: length(matrix_elements) alloc_if(1) free_if(0)) \
    in(transa, transb, N, alpha, beta) \
    inout(C:length(matrix_elements) alloc_if(1) free_if(0))
    {
        sgemm(&transa, &transb, &N, &N, &N, &alpha, A, &N, B, &N,
                &beta, C, &N);
    }

    /* ここで C を変更します。*/

    /* カードの A と B を再利用して新しい C をアップロードします。カードのメモリーをすべて
     * 解放します。*/
#pragma offload target(mic:0) \
    nocopy(A: length(matrix_elements) alloc_if(0) free_if(1)) \
    nocopy(B: length(matrix_elements) alloc_if(0) free_if(1)) \
    in(transa, transb, N, alpha, beta) \
    inout(C:length(matrix_elements) alloc_if(0) free_if(1))
    {
        sgemm(&transa, &transb, &N, &N, &N, &alpha, A, &N, B, &N,
                &beta, C, &N);
    }

関連情報