共有メモリーの使用

このトピックは、インテル® メニー・インテグレーテッド・コア (インテル® MIC) アーキテクチャーにのみ適用されます。

共有メモリーの使用について

オフロード・ランタイム・システムは CPU とコプロセッサーの同じ仮想アドレスでメモリーのセクションを保持します。_Cilk_shared キーワードを使用することで、この共有メモリーを次のように使用できます。

共有変数について

コンパイラーは、次のような共有変数を割り当てます。

共有変数のアドレスは同じであるため、同じアドレス共有変数へのポインターには CPU とコプロセッサーで同じ値が含まれます。このため、オフロードコードをリンクされたデータ構造で容易に操作できます。メモリーは、オフロードの呼び出し位置でのみ CPU とコプロセッサー間で同期されます。

共有変数の条件付き制御

インテル® MIC アーキテクチャー上で実行するようにコンパイルする場合は、共有変数を条件付きで制御できません。

変数が _Cilk_shared とマークされると、変数のメモリー割り当てはスタティックではなくダイナミックで行われます。ホストが割り当てるメモリーは、ホストとコプロセッサーが共有するメモリー空間内のみです。 プログラムをコンパイルすると、ホストは共有メモリーをダイナミックに作成するコードを生成します。このため、ホストが共有変数を見ない場合、変数のメモリーを割り当てません。メモリーが共有空間に割り当てられないため、コプロセッサーがこのメモリーにアクセスしようとすると、不正なアクセスが発生します。

ホストは共有変数にメモリーを割り当てるため、ホストが変数を使用しない場合でも、ホストが変数を見えるようにする必要があります。

例えば、次のコードは変数がコプロセッサー用に条件付きでコンパイルされているため正しくありません。このため、ホストで変数のメモリーを割り当てるコードは生成されません。

#ifdef __MIC__
_Cilk_shared int res;
#endif

変数をコプロセッサー用に条件付きでコンパイルすると、ホストは変数にアクセスしないため、_Cilk_shared キーワードは必要ありません。 ホストとコプロセッサー間でデータを共有する場合のみ、_Cilk_shared を使用します。

共有関数について

no-offload オプションを使用しない場合、コンパイラーは 2 つのバイナリーファイルをビルドします。

共有メモリー管理関数

_Cilk_shared および _Cilk_offload キーワードで操作する共有メモリーの割り当てと解放には、次の関数を利用します。 これらの関数は、インテル® MIC アーキテクチャー・ベースのハードウェアがシステムにない場合、またはインテル® MIC アーキテクチャー・ドライバーがロードされていない場合、標準の malloc または free バージョンを使用します。

関連情報


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