7

私のOpenCLプログラムでは、各カーネルがアクセスできるようにする必要がある60以上のグローバルメモリバッファーができあがります。各カーネルにこれらの各バッファの場所を知らせるための推奨される方法は何ですか?

バッファー自体は、アプリケーションの存続期間を通じて安定しています。つまり、アプリケーションの開始時にバッファーを割り当て、複数のカーネルを呼び出してから、アプリケーションの終了時にのみバッファーの割り当てを解除します。ただし、カーネルがそれらから読み取り/書き込みを行うと、それらの内容が変更される可能性があります。

CUDAでこれを行った方法は、CUDAコードに60以上のプログラムスコープグローバル変数を作成することでした。次に、ホスト上で、これらのグローバル変数に割り当てたデバイスバッファーのアドレスを書き込みます。次に、カーネルはこれらのグローバル変数を使用して、操作に必要なバッファーを見つけるだけです。

OpenCLでこれを行うための最良の方法は何でしょうか?CLのグローバル変数はCUDAのものとは少し異なるようですが、私のCUDAメソッドが機能するかどうか、そして機能する場合は、バッファーポインターをグローバル変数に転送する方法について明確な答えを見つけることができません。それがうまくいかない場合、それ以外の最善の方法は何ですか?

4

2 に答える 2

2

60個のグローバル変数は確かにたくさんあります! より小さなデータ チャンクを使用するためにアルゴリズムを少しリファクタリングする方法はありませんか? 各カーネルは、巨大なものではなく、最小の作業単位であるべきだということを覚えておいてください!

ただし、考えられる解決策が 1 つあります。60 個の配列が既知のサイズであると仮定すると、それらすべてを 1 つの大きなバッファーに格納し、オフセットを使用してその大きな配列のさまざまな部分にアクセスできます。以下は、3 つの配列を使用した非常に単純な例です。

A is 100 elements
B is 200 elements
C is 100 elements

big_array = A[0:100] B[0:200] C[0:100]
offsets = [0, 100, 300]

次に、big_array とオフセットをカーネルに渡すだけで、各配列にアクセスできます。例えば:

A[50] = big_array[offsets[0] + 50]
B[20] = big_array[offsets[1] + 20]
C[0] = big_array[offsets[2] + 0]

これが特定のデバイスのキャッシュにどのように影響するかはわかりませんが、私の最初の推測では「よくない」と思います。この種の配列へのアクセスも少し面倒です。それが有効かどうかはわかりませんが、各オフセットを抽出して元のポインターのコピーに追加するコードを使用して、各カーネルを開始できます。

ホスト側では、配列をよりアクセスしやすくするために、clCreateSubBuffer を使用できます: http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clCreateSubBuffer.htmlも許可しますオフセット配列なしで特定の配列への参照を渡すことができます。

このソリューションが 60 個のカーネル引数を渡すよりも優れているとは思いませんが、OpenCL 実装の clSetKernelArgs によっては、より高速になる可能性があります。これにより、引数リストの長さが確実に短縮されます。

于 2012-06-21T15:04:27.777 に答える
0

2 つのことを行う必要があります。まず、各グローバル メモリ バッファーを使用する各カーネルは、次のように、それぞれの引数を宣言する必要があります

kernel void awesome_parallel_stuff(global float* buf1, ..., global float* buf60)

そのカーネルで使用されている各バッファがリストされるようにします。次に、ホスト側では、パーティを開始するために呼び出す前に、各バッファーを作成しclSetKernelArg、特定のメモリ バッファーを特定のカーネル引数にアタッチするために使用する必要があります。clEnqueueNDRangeKernel

カーネルが各カーネル実行で同じバッファを使用し続ける場合は、カーネル引数を度だけ設定する必要があることに注意してください。ホスト側のパフォーマンスを低下させる可能性のあるよくある間違いは、clSetKernelArg完全に不要な状況で繰り返し呼び出すことです。

于 2012-06-16T21:23:41.997 に答える