インテル® マス・カーネル・ライブラリー 11.2 ユーザーズガイド
以下に、コンパイラーによるオフロード支援の例を示します。詳細は、『インテル® コンパイラー・ユーザー・リファレンス・ガイド』を参照してください。
これらの例は、インテル® MIC アーキテクチャー・ベースのコプロセッサー上で実行するオフロード領域からインテル® MKL を呼び出す方法、およびコプロセッサーのメモリーに既に存在するデータを再利用してデータ転送を最小限にする方法を示しています。
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 )
/* カードに 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); }