このステップでは、ホストとターゲットの両方で実行するように定義されているコードのセクションを確認します。
次のソースコードを探します。
#pragma offload target(mic) mandatory \
in(all_Vals : length(MAXSZ)) \
inout(numEs) out(E_vals : length(MAXSZ/2))
for (k=0; k < MAXSZ; k++) {
if ( all_Vals[k] % 2 == 0 ) {
E_vals[numEs] = all_Vals[k];
numEs++;
}
}
このコードブロックは、最初の 10 個の偶数を検索して配列に格納します。コードブロックの先頭は offload プラグマです。 コンパイラーは、このプラグマで指定されたコードブロックを、ホストとターゲットの両方で実行するようにコンパイルします。
mandatory 節は、暗黙のデフォルトを明確にし、ターゲットでの実行を指定します。 ホストで実行することはできません。ターゲットが利用できない場合、プログラムは実行に失敗してエラーメッセージを出力します。
ホストとターゲットの命令セットは似ていますが、同じシステムメモリーを共有しません。このため、コードブロックで使用する変数は、ホストとターゲットの両方に存在していなければなりません 変数がホストとターゲットの両方に存在することを保証するため、offload プラグマは、パラメーター指定子を使用してホストとターゲット間でコピーする変数を定義します。
in 指定子は、ターゲットの入力に使用する変数を定義します。 変数はホストからターゲットにコピーされますが、ターゲットからホストにはコピーされません。
out 指定子は、ターゲットの出力に使用する変数を定義します。 変数はホストからターゲットにコピーされません。ターゲットからホストにコピーされるだけです。
inout 指定子は、ホストとターゲット間でコピーする変数を定義します。
デフォルトでは、コンパイラーはホストとターゲットの両方で実行するアプリケーションを生成しますが、同じコードを使用してホストでのみ実行するアプリケーションを生成することもできます。次のステップでは、同じソースコードをコンパイルしてホストでのみ実行するアプリケーションを生成します。