インテル® Fortran コンパイラー 19.0 デベロッパー・ガイドおよびリファレンス
このトピックは、インテル® メニー・インテグレーテッド・コア (インテル® MIC) アーキテクチャーをターゲットとする場合にのみ適用されます。
コードのオフロード領域の実行時間と実行中のデータ転送量を測定することができます。
ホストとターゲットで実行が進むと、オフロードに関する情報を含むオフロードレポートを取得することができます。オフロードレポートには次の情報が含まれます。
コードのオフロード領域の実行時間
ホストとターゲット間のデータ転送量
デバイスの初期化と個々の変数の転送を含む詳細
次のメカニズムを使用してオフロードレポートを有効または無効にすることができます。
OFFLOAD_REPORT 環境変数
_Offload_report API
コンパイラー・オフロード・レポートの行は、(インテル® MKL からのオフロードのようなほかのオフロードとは異なり) コンパイラーのオフロードからの出力であることを明確に示すために [オフロード] で始まります。
ホスト上の処理は [ホスト] と表記され、ターゲット上の処理は [MIC n] (n はオフロードされるコプロセッサーの論理番号) と表記されます。レポートの先頭に、論理デバイスと物理デバイスの割り当てが表示されます。
OFFLOAD_DEVICES 環境変数を指定すると、オフロードされたプログラムは物理デバイスのサブセットを使用できます。
複数のホストスレッドでオフロードを開始する場合、もしくは非同期オフロードが指定された場合、複数のオフロードが同時に行われることがあるため、特定の offload ディレクティブに関連する出力すべてにタグを付ける必要があります。タグがない場合、同時に進行する複数のオフロードからの情報が混在し、どの行がどのオフロードから出力されたものか判断できなくなります。[タグ n] 形式のタグは、特定のオフロードに属するオフロードレポートの行を識別します。
レポートの最初の 2 つの行は各オフロードのソースファイル名と offload ディレクティブの行番号です。その後、そのオフロードにタグを割り当てる行が出力されます。そのオフロード用に出力される後のレポート行では、そのオフロードに関連する行に、[タグ n] が使用されます。
レポートの残りの部分には、主要な処理の行が含まれます。これらの行では、処理がどのオフロードに属するか識別するタグの後に、処理のアノテーションが続きます。アノテーションは次のとおりです。
行マーカー | 説明 |
---|---|
[状態] | オフロードの一部として実行されている処理。 |
[変数] | 転送された変数名および転送の向き。 |
[CPU 時間] | ホスト上の offload ディレクティブの実行時間。 |
[MIC 時間] | ターゲット上のオフロード実行時間。 ホストとターゲット間のデータ転送時間を除く、ターゲット上の実行時間のみカウントされます。 |
[CPU->MIC データ] | ホストからターゲットへ転送されたデータのバイト数。 |
[MIC->CPU データ] | ターゲットからホストへ転送されたデータのバイト数。 |
[状態] の後に出力されるさまざまな情報は、オフロード・ライブラリーの内部処理に関する説明で、ランタイムエラーが発生する可能性のあるポイントの診断に役立ちます。ほとんどの場合、この情報から処理について知ることができます。
この例 example.F90 のオフロードレポートは次のようになります。
1 integer function Hysum(abc,efg,siz)
2 use mic_lib
3
4 integer, dimension(:) :: abc
5 integer, dimension(:) :: efg
6 integer :: siz
7
8 integer :: sumT
9 integer :: k
10
11 !DIR$ OFFLOAD BEGIN target(mic:0) &
12 IN(abc : length(siz )) &
13 OUT(efg : length(siz/2)) &
14 nocopy(k)
15
16 if (OFFLOAD_GET_DEVICE_NUMBER() > -1) then
17 print "(A,I0)","On device : ",OFFLOAD_GET_DEVICE_NUMBER()
18 endif
19
20 sumT = 0
21 do k=1,(siz/2)
22 efg(k) = abc(k) + abc(k + (siz/2))
23 sumT = sumT + efg(k)
24 enddo
25 !DIR$ END OFFLOAD
26
27 Hysum = sumT
28
29 return
30 end function Hysum
31
32 program example
33
34 integer, allocatable, dimension(:) :: tuv
35 integer, allocatable, dimension(:) :: xyz
36
37 integer :: j = 10
38 integer :: i = 0
39 integer :: n
40
41 interface
42 integer function Hysum(abc,efg,siz)
43 integer, dimension(:) :: abc
44 integer, dimension(:) :: efg
45 integer :: siz
46 end function Hysum
47 end interface
48
49 allocate( tuv(j) )
50 allocate( xyz(j/2) )
51
52 do n = 1, j
53 tuv(n) = n - 1
54 enddo
55 xyz = 0
56
57 i = Hysum(tuv,xyz,j)
58
59 do n = 1, (j/2)
60 print "(3X,2(A,I0),$)","xyz(",n,")=",xyz(n)
61 enddo
62 print "(/,3X,A,I2)","sum total=",i
63
64 end program example
offload キーワードを指定して [Q]opt-report-phase コンパイラー・オプションを使用すると、ホストとターゲット間のデータ転送に関するサマリー情報が得られます。ソースコードで定義されているオフロード領域ごとに 2 つのレポートが出力されます。1 つ目のレポートは、ターゲット MIC へのオフロード情報で、ホスト向けのコンパイルにより出力されます。2 つ目のレポートは、オフロード領域の概要で、ターゲット向けのコンパイルにより出力されます。 このレポートには、OFFLOAD_REPORT 環境変数を 3 に設定した場合と似た情報が含まれます。
$ ifort example.F90 -o exampleF_exe -qopt-report-phase=offload example.F90(11-11):OFFLOAD:hysum_: ターゲットへのオフロード MIC <expr> hysum_$SUMT_V$31, INOUT のデフォルトが OUT に変更されました。 hysum_$SIZ_V$2f, INOUT のデフォルトが IN に変更されました。 hysum_$SUMT_V$31, INOUT のデフォルトが OUT に変更されました。 hysum_$SIZ_V$2f, INOUT のデフォルトが IN に変更されました。 ホストからターゲットへ送られたデータ hysum_$ABC_V$2d, (<expr>) 要素数を含むドープベクトルへのポインター hysum_$SIZ_V$2f, (<expr>) 要素へのポインター ホストがターゲットから受け取ったデータ hysum_$EFG_V$2e, (<expr>) 要素数を含むドープベクトルへのポインター hysum_$SUMT_V$31, スカラーサイズ 4 バイト example.F90(11-11):OFFLOAD:hysum_: アウトライン・オフロード領域 hysum_$SUMT_V$31, INOUT のデフォルトが OUT に変更されました。 hysum_$SIZ_V$2f, INOUT のデフォルトが IN に変更されました。 hysum_$SUMT_V$31, INOUT のデフォルトが OUT に変更されました。 hysum_$SIZ_V$2f, INOUT のデフォルトが IN に変更されました。 ターゲットがホストから受け取ったデータ hysum_$ABC_V$2d, (<expr>) 要素数を含むドープベクトルへのポインター hysum_$SIZ_V$2f, (<expr>) 要素へのポインター ターゲットからホストへ送られたデータ hysum_$EFG_V$2e, (<expr>) 要素数を含むドープベクトルへのポインター hysum_$SUMT_V$31, スカラーサイズ 4 バイト
ここからは、上記のソースプログラムのオフロードレポートについて説明します。
ホストとターゲットはそれぞれ独立して実行するため、いったんオフロードが開始されると、ホスト出力とターゲット出力を予測することはできず、実行ごとに異なります。ただし、すべてのホスト出力とすべてのターゲット出力はそれぞれ同じシーケンスになります。
ターゲットデバイスが初期化され、論理デバイスと物理デバイス間の割り当てが示されています。
[オフロード] [ホスト] [状態] 初期化 論理カード 0 = 物理カード 0 [オフロード] [ホスト] [状態] 初期化 論理カード 1 = 物理カード 1
example.F90 のオフロードコードは、行 11 でターゲットにオフロードされます。
[オフロード] [MIC 0] [ファイル] example.F90 [オフロード] [MIC 0] [行] 11
このオフロードに関するレポートを識別できるように、このオフロードにタグ値 Tag0 が割り当てられます。
[オフロード] [MIC 0] [タグ] Tag0
ホストでオフロードが開始されます。
[オフロード] [ホスト] [タグ 0] [状態] オフロードを開始
オフロードするターゲット関数を初期化します。
[オフロード] [ホスト] [タグ 0] [状態] 関数を初期化 __offload_entry_example_F90_11hysum_
ポインターデータのデータ転送バッファーを作成します。
abc (4 つのバッファー; ドープベクトルに 2 つ、メモリーに 2 つ)。
efg (4 つのバッファー; ドープベクトルに 2 つ、メモリーに 2 つ)。
sumt (2 つのバッファー)。この変数はデフォルトで OUT 節に追加されます。sumt 変数はオフロード領域で使用されます。
[オフロード] [ホスト] [タグ 0] [状態] ホストメモリーからバッファーを作成 [オフロード] [ホスト] [タグ 0] [状態] MIC メモリーからバッファーを作成 [オフロード] [ホスト] [タグ 0] [状態] ホストメモリーからバッファーを作成 [オフロード] [ホスト] [タグ 0] [状態] MIC メモリーからバッファーを作成 [オフロード] [ホスト] [タグ 0] [状態] ホストメモリーからバッファーを作成 [オフロード] [ホスト] [タグ 0] [状態] MIC メモリーからバッファーを作成 [オフロード] [ホスト] [タグ 0] [状態] ホストメモリーからバッファーを作成 [オフロード] [ホスト] [タグ 0] [状態] MIC メモリーからバッファーを作成 [オフロード] [ホスト] [タグ 0] [状態] ホストメモリーからバッファーを作成 [オフロード] [ホスト] [タグ 0] [状態] MIC メモリーからバッファーを作成
DMA を使用して、2 つのドープベクトル、abc および siz 変数のポインターデータがホストからターゲットへ送られます。
[オフロード] [ホスト] [タグ 0] [状態] ポインターデータを送信 [オフロード] [ホスト] [タグ 0] [状態] CPU->MIC ポインターデータ 188
収集され、ホストからターゲットへ送られる非ポインターデータはありません。
[オフロード] [ホスト] [タグ 0] [状態] コピーインデータを集約 [オフロード] [ホスト] [タグ 0] [状態] CPU->MIC コピーインデータ 0
ターゲット上でオフロードされたコード (行 11) が開始されます。
[オフロード] [ホスト] [タグ 0] [状態] MIC のタスクを計算
オフロードが完了しました。ターゲットからデータの受信を開始します。
DMA を使用してターゲットの efg 変数からポインターデータを受け取ります。
[オフロード] [ホスト] [タグ 0] [状態] ポインターデータを受信 [オフロード] [ホスト] [タグ 0] [状態] MIC->CPU ポインターデータ 20
これはターゲットからの出力です。ターゲット上でオフロードコードが呼び出されます。
[オフロード] [MIC 0] [タグ 0] [状態] ターゲット関数を開始 __offload_entry_example_F90_11hysum_
このオフロードで abc 変数は IN です。2 つのエントリーは整合配列 abc のドープベクトルと abc のメモリーの結果です。
[オフロード] [MIC 0] [タグ 0] [変数] hysum_$ABC_V$2d IN [オフロード] [MIC 0] [タグ 0] [変数] hysum_$ABC_V$2d IN
このオフロードで efg 変数は OUT です。ターゲットに転送される整合配列 efg のドープベクトル (2 つのエントリー) です。
[オフロード] [MIC 0] [タグ 0] [変数] hysum_$EFG_V$2e IN [オフロード] [MIC 0] [タグ 0] [変数] hysum_$EFG_V$2e OUT
このオフロードで sumT 変数は OUT です。
[オフロード] [MIC 0] [タグ 0] [変数] hysum_$SUMT_V$31 OUT
このオフロードで siz 変数は IN です。
[オフロード] [MIC 0] [タグ 0] [変数] hysum_$SIZ_V$2f IN
ターゲット上で、非ポインターデータがターゲットメモリーにコピーされます。
[オフロード] [MIC 0] [タグ 0] [状態] コピーインデータを分散
ユーザープログラムの出力:
On device : 0
ターゲット上で非ポインターデータ sumT 変数が収集され、ターゲットからホストへ送られます。
[オフロード] [MIC 0] [タグ 0] [状態] コピーアウト・データを集約 [オフロード] [MIC 0] [タグ 0] [状態] MIC->CPU コピーアウト・データ 4
非ポインターデータがターゲットメモリーにコピーされます。
[オフロード] [ホスト] [タグ 0] [状態] コピーアウト・データを分散
ターゲット上のホスト時間はゼロです。
[オフロード] [ホスト] [タグ 0] [CPU 時間] 0.865673 (秒)
ホストからターゲットに転送されたポインターデータと非ポインターデータ (abc 変数と siz 変数) の合計が出力されます。
[オフロード] [MIC 0] [CPU->MIC データ] 188 (バイト)
ターゲット上での実行時間が出力されます。
[オフロード] [MIC 0] [MIC 時間] 0.000918 (秒)
ターゲットからホストに転送されたポインターデータと非ポインターデータ (efg 変数と sumT 変数) の合計が出力されます。
[オフロード] [MIC 0] [MIC->CPU データ] 24 (バイト)
ユーザープログラムの出力:
xyz(1)=5 xyz(2)=7 xyz(3)=9 xyz(4)=11 xyz(5)=13 sum total=45
プログラムの最後にクリーンアップされます。
[オフロード] [MIC 1] [状態] データテーブルを登録解除 [オフロード] [MIC 0] [状態] データテーブルを登録解除 [オフロード] [ホスト] [状態] データテーブルを登録解除