コンパイラーによるオフロード支援のパフォーマンスを向上させるためのヒント

インテル® メニー・インテグレーテッド・コア (インテル® MIC) アーキテクチャー・ベースのコプロセッサーでインテル® MKL の最高のパフォーマンスを実現するには、転送されるデータの量を最小限にして計算の量を最大限にします。コプロセッサーのメモリーにすでに存在するデータを再利用すると、パフォーマンスの向上に役立ちます。次の C 言語の例は、単一セットの入力行列で複数の演算を実行する方法を示しています。Fortran でも同様のアプローチを使用できます。

単一セットの入力行列で複数の演算を実行する

__declspec(target(mic)) static float *A, *B, *C, *C1;

// 行列 A、B、C をインテル(R) MIC アーキテクチャー・コプロセッサーに転送して
// 行列 A と B の割り当てを解除しない
#pragma offload target(mic) \
	in(transa, transb, M, N, K, alpha, beta, LDA, LDB, LDC) \
	in(A:length(NCOLA * LDA) free_if(0)) \
	in(B:length(NCOLB * LDB) free_if(0)) \
	inout(C:length(N * LDC))
{
    sgemm(&transa, &transb, &M, &N, &K, &alpha, A, &LDA, B, &LDB, &beta, C, &LDC);
}

// 行列 C1 をインテル(R) MIC アーキテクチャー・コプロセッサーに転送して行列 A と B を再利用する
#pragma offload target(mic) \
	in(transa1, transb1, M, N, K, alpha1, beta1, LDA, LDB, LDC1) \
	nocopy(A:length(NCOLA * LDA) free_if(0)) \
	nocopy(B:length(NCOLB * LDB) free_if(0)) \
	inout(C1:length(N * LDC1))
{
    sgemm(&transa1, &transb1, &M, &N, &K, &alpha1, A, &LDA, B, &LDB, &beta1, C1, &LDC1);
}

// インテル(R) MIC アーキテクチャー・コプロセッサーの行列 A と B の割り当てを解除する
#pragma offload target(mic) \
	nocopy(A:length(NCOLA * LDA) free_if(1)) \
	nocopy(B:length(NCOLB * LDB) free_if(1)) \
{
}

重要

  • 行列 A、B、C、C1 をスタティックとして宣言し、適切な target 属性でマークします。 詳細は、『インテル® コンパイラー・ユーザー・リファレンス・ガイド』を参照してください。
  • 常に #include "mkl.h" を追加して C 構文を使用します。

最適化に関する注意事項

インテル® コンパイラーは、互換マイクロプロセッサー向けには、インテル製マイクロプロセッサー向けと同等レベルの最適化が行われない可能性があります。これには、インテル® ストリーミング SIMD 拡張命令 2 (インテル® SSE2)、インテル® ストリーミング SIMD 拡張命令 3 (インテル® SSE3)、ストリーミング SIMD 拡張命令 3 補足命令 (SSSE3) 命令セットに関連する最適化およびその他の最適化が含まれます。インテルでは、インテル製ではないマイクロプロセッサーに対して、最適化の提供、機能、効果を保証していません。本製品のマイクロプロセッサー固有の最適化は、インテル製マイクロプロセッサーでの使用を目的としています。インテル® マイクロアーキテクチャーに非固有の特定の最適化は、インテル製マイクロプロセッサー向けに予約されています。この注意事項の適用対象である特定の命令セットの詳細は、該当する製品のユーザー・リファレンス・ガイドを参照してください。

改訂 #20110804

関連情報


このヘルプトピックについてのフィードバックを送信