このステップでは、ホスト CPU とコプロセッサーの両方で実行するように定義されているソースコードのセクションを確認します。
次のソースコードを探します。
#pragma offload target(mic : target_id) \
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 宣言子です。 コンパイラーは、この宣言子で指定されたコードブロックを、CPU とコプロセッサーの両方で実行するようにコンパイルします。
ホスト CPU とコプロセッサーの命令セットは似ていますが、同じシステムメモリーを共有しません。このため、コードブロックで使用する変数は、ホスト CPU とコプロセッサーの両方に存在していなければなりません。変数がホスト CPU とコプロセッサーの両方に存在することを保証するため、宣言子は、パラメーター指定子を使用してホスト CPU とコプロセッサー間でコピーする変数を定義しています。
in 指定子は、コプロセッサーの入力に使用する変数を定義します。 この変数はホスト CPU にコピーされません。
out 指定子は、コプロセッサーの出力に使用する変数を定義します。 ホスト CPU はこの変数をコプロセッサーにコピーしません。
inout 指定子は、ホスト CPU とコプロセッサー間でコピーする変数を定義します。
宣言子には、複数のコプロセッサーが含まれるシステムの特定のコプロセッサーを指定する target パラメーターも含まれています。
デフォルトでは、コンパイラーは CPU とコプロセッサーの両方で実行するアプリケーションを生成しますが、同じソースコードを使用して CPU でのみ実行するアプリケーションを生成することもできます。次のステップでは、同じソースコードをコンパイルして CPU でのみ実行するアプリケーションを生成します。