セカンドメモリーは普通に使ってます。メモリの共有は簡単です。各カーネルに同じバッファを渡すだけです。これはリアルタイム レイ トレーサーで行います。1 つのカーネルでレンダリングし、別のカーネルで後処理 (画像処理) を行います。
C++ バインディングを使用すると、次のようになります。
cl_input_mem = cl::Buffer(context, CL_MEM_WRITE_ONLY, sizeof(cl_uchar4)*npixels, NULL, &err);
kernel_render.setArg(0, cl_input_mem);
kernel_postprocess.setArg(0, cl_input_mem);
1 つのカーネルを配列/メモリの別のセグメントで動作させたい場合は、オフセット値をカーネル引数に渡し、それを各カーネルのグローバル メモリ ポインタなどに追加できます。
配列 (実際には出力を含む各バッファーの合計) がメモリに収まらない場合は、最初の方法を使用します。最初の方法を使用するもう 1 つの理由は、複数のデバイスで実行している場合です。私のレイ トレーサーでは、複数のデバイスでレンダリングするときに最初の方法を使用します。たとえば、1 つの GTX 580 が画面の上半分をレンダリングし、もう 1 つの GTX 580 が下半分をレンダリングするようにしています (実際にはこれを動的に行うため、1 つのデバイスが 30% をレンダリングし、他の 70% をレンダリングすることがありますが、それは重要ではありません)。各デバイスに出力の一部のみをレンダリングさせ、CPU で出力を組み立てます。PCI 3.0 では、1920x1080 の画像であっても、CPU と GPU 間の転送 (複数回) によるフレーム レートへの影響はごくわずかです。