重新利用openCL内存

时间:2012-11-26 12:01:54

标签: opencl pyopencl

大家好,             作为一个例子,考虑两个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];
       }

对于这两个输入相同的两个内核,我需要从主机内存中将相同的输入(input1& input2)两次复制到设备中,这可能会增加性能方面的成本。
有没有办法让我可以复制一次数据并在任何函数中重复使用它,直到我没有释放内存?

2 个答案:

答案 0 :(得分:4)

这是一个答案,因为它似乎完全回答了这个问题。

你通常在设备内存中创建缓冲区,你可以通过clSetKernelArg()重新定义内核参数来重用这些缓冲区(当然,除非你想在同一时间使用它们,这是更棘手的,我是不确定它甚至是OpenCL标准所允许的。)

答案 1 :(得分: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

因此,您不必每次都将缓冲区复制到主机。