2

大家好,以两个openCL内核为例,一个内核让我们说add,另一个是sub。

添加内核是

__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];
       }

对于这两个输入相同的两个内核,我需要将相同的输入(输入 1 和输入 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 回答