インテル® C++ コンパイラー 18.0 デベロッパー・ガイドおよびリファレンス
このトピックは、インテル® グラフィックス・テクノロジーをターゲットとする場合にのみ適用されます。
インテル® グラフィックス・テクノロジー・ランタイムは、プロセッサー・グラフィックスやドライバー・オブジェクト (バッファー、イメージ・オブジェクト、タスク・オブジェクトなど) に対応するさまざまな内部オブジェクトを管理します。そのようなオブジェクトのライフタイム管理における一般的な規則を次に示します。
ランタイムは、対応する GFX API 呼び出しからオブジェクトの作成要求があると、そのオブジェクトを使用するオフロードタスクがキューに追加される前に、オブジェクトを作成します。
オブジェクトは、少なくともランタイムが次のことを判断できるまで存続します。
オブジェクトへのハンドルがオープンではなく、ホストコードによって保持されていない。
オブジェクトがオフロードタスクで使用されていない。
内部タスク・オブジェクトは、対応するオフロードタスクをキューに追加する _GFX_offload 呼び出しから、そのタスクまたはキューにあるそれ以降のタスクの _GFX_wait 呼び出しが成功するまで存続します。
リファレンス・マネージド・オブジェクトには、バッファー・オブジェクトやイメージ・オブジェクトなどがあります。
ランタイムは、各タスクで使用されるリファレンス・マネージド・オブジェクトへのすべての参照と、ユーザーコードからの参照を記録します。リファレンス・マネージド・オブジェクトは、次のいずれかによる少なくとも 1 つの参照が存在する限り存続します。
オブジェクトを使用する (またはその可能性がある) 既存のオフロードタスク。ランタイムは、オブジェクトが使用されているかどうかを慎重に判断します。判断の正確さはオブジェクトとその実装に依存します。
コードからオブジェクトへの参照。参照方法はオブジェクトによって異なります。
ランタイムは、バッファー・オブジェクトを作成し、_GFX_share 呼び出しで定義される共有領域を割り当てます。_GFX_share 呼び出しで共有され、_GFX_unshare 呼び出しで共有解除されていないメモリー領域は、それが割り当てられているバッファーへの参照として記録されます。
バッファー・オブジェクトの存続期間について次に説明します。
GFX_share は、共有領域の内部グローバルリストに共有する領域を登録します。
_GFX_offload は、内部ロックを保持している間、バッファー・オブジェクトがすべての共有領域を利用できることを保証します。
ランタイムは、タスクごとに各共有領域に対して 1 つの共有バッファーを作成するため、各タスクで共有領域が複数のバッファーに分割されることはありません。
共有領域のセットに変更があった場合は、バッファーへの割り当ても変更する必要があります。例えば、既存のバッファーには、変更後の共有領域の一部しか割り当てられていない可能性があります。この場合、そのような "無効な割り当て" を持つバッファーへの参照が共有領域からすべて削除され、そのバッファーを使用するタスクがキューに存在する間だけ、バッファーは存続します。そして、共有領域は、上記の条件を満たす新しいバッファーに割り当てられます。
_GFX_wait はオフロードタスクの完了を検出すると、そのタスク・オブジェクトによって保持されているすべてのバッファーへの参照を削除します。その結果、共有領域を介してホストコードから参照されていないバッファーは破棄されます。
完了したタスクのセットには、_GFX_wait が待機していたタスクと、現在存在するそれ以前に追加されたタスクが含まれます。
_GFX_unshare は、共有領域リストから領域を削除し、その共有領域が割り当てられたバッファーへの参照も削除します。その結果、既存のタスクから参照されていないバッファーは破棄されます。
タスクに対する _GFX_offload 呼び出し時に存在する共有メモリー領域 (および共有領域が割り当てられたバッファー) は、タスクによって使用される可能性があると想定されます。
イメージ・オブジェクトは、次のいずれかによる 1 つ以上の参照がある限り存続します。
イメージ・オブジェクトが引数として渡される既存のオフロードタスク。
C++ コンストラクター GfxImage2D または GfxSharedImage2D、あるいは C 言語の _GFX_create_image_2d API 呼び出しのいずれかによって返される、ホストコード中のイメージ・リソース・ハンドル。
バッファー・オブジェクトの存続期間について次に説明します。
C++ コンストラクター GfxImage2D または GfxSharedImage2D、あるいは C 言語の _GFX_create_image_2d API 呼び出しはいずれも、内部イメージ・オブジェクトを作成し、そのハンドルを返します。
GfxImage2D オブジェクトと GfxSharedImage2D オブジェクトは、イメージ・リソース・ハンドルに対するラッパーです。
イメージ・オブジェクトを使用するオフロードタスクごとに、ランタイムはイメージ・オブジェクトへの追加の参照を記録します。ランタイムは、次の場合にイメージ・オブジェクトを破棄します。
ホストコードが、C++ オブジェクト GfxImage2D または GfxSharedImage2D、あるいは GfxResourceHandle でイメージハンドルを保持していない。
イメージがオフロードタスクで使用されていない。
このような状況は、_GFX_wait、GfxImage2D、GfxSharedImage2D コンストラクターまたは _GFX_destroy_image_2d API 呼び出し中に発生することがあります。あるいは、遅延クリーンアップ・ポリシーが原因で発生することもあります。