2

みなさん、こんにちは。例として、2 つの openCL カーネルを考えてみましょう。

追加カーネルは

__kernel void add(global int *output1,global int *input1,global int *input2
    /* Put other parameters here */
    ) 
       {
    int i = get_global_id(0);
    output1[i] = input1[i] + input2[i];
       }

サブカーネルは

__kernel void add(global int *output2,global int *input1,global int *input2
    /* Put other parameters here */
    ) 
        {
    int i = get_global_id(0);
    output2[i] = input1[i] - input2[i];
       }

2 つの入力が同じであるこれら 2 つのカーネルの場合、同じ入力 (input1 と input2) をホスト メモリからデバイスに 2 回コピーする必要があり、パフォーマンスの点でコストがかかる場合があります。
データを一度コピーして、メモリを解放しないまで任意の関数で再利用できる方法はありますか?

4

2 に答える 2

4

質問に完全に答えているように見えるので、これを答えにします。

通常はデバイスメモリにバッファを作成し、clSetKernelArg()を介してカーネル引数を再定義することでこれらのバッファを再利用できます(もちろん、同時に使用したい場合を除きます。これは難しいですが、よくわかりません。実際にはOpenCL標準でも許可されています)。

于 2012-11-26T23:36:12.490 に答える
0

GL_interopeting能力を使用する必要があります。これは、openclとopengl間の通信に使用します。openCLは、終了後にopenGL頂点バッファオブジェクト(VBO)を削除しませんか?しかし、この種のカーネルは作成が難しく、joglファイルも必要になる可能性があります。

cl_mem clCreateFromGLBuffer(cl_context context, cl_mem_flags flags, 
                        GLuint vbo_desc, cl_int *err)

gl-cl共有用のオブジェクトを作成します。

glFinish();
clEnqueueAcquireGLObjects(queue, 1, &buff, 0, NULL, NULL);

clEnqueueNDRangeKernel(queue, proc, 1, NULL, global_size, local_size, 0, NULL, NULL);

clEnqueueReleaseGLObjects(queue, 1, &buff, 0, NULL, NULL);
clFinish();

この実行の例です。取得元:http ://www.dyn-lab.com/articles/cl-gl.html

したがって、毎回ホストするバッファをコピーする必要はありません。

于 2012-11-26T12:15:53.837 に答える