重新利用openCL内存

重新利用openCL内存,opencl,pyopencl,Opencl,Pyopencl,大家好,, 作为一个例子,考虑两个OpenCL内核一个内核,让我们说ADD和其他是S.< /P> 添加内核是 __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

大家好,, 作为一个例子,考虑两个OpenCL内核一个内核,让我们说ADD和其他是S.< /P> 添加内核是

__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)从主机内存复制两次到设备,这可能会增加性能方面的成本。

是否有任何方法可以让我复制数据一次,并在任何功能中重新使用它,直到我不释放内存?

您应该使用GL\u互操作能力。您可以使用它在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();
是此执行的一个示例。摘自:


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

您应该使用GL\u互操作能力。您可以使用它在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();
是此执行的一个示例。摘自:


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

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


您通常在设备内存中创建缓冲区,并且可以通过clSetKernelArg()重新定义内核参数来重用这些缓冲区(当然,除非您想同时使用它们,这更为棘手,而且我不确定OpenCL标准实际上是否允许这样做).

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


您通常在设备内存中创建缓冲区,并且可以通过clSetKernelArg()重新定义内核参数来重用这些缓冲区(当然,除非您想同时使用它们,这比较棘手,而且我不确定OpenCL标准实际上是否允许这样做)。

为什么需要复制相同的输入两次?您可以在设备内存中创建缓冲区,并通过clSetKernelArg()重新定义内核参数来重用它们(当然,除非您想同时使用它们,这更为棘手,而且我不确定OpenCL标准实际上是否允许)。为什么您需要复制相同的输入两次?你在设备内存中创建缓冲区,你可以通过clSetKernelArg()重新定义内核参数来重用它们(当然,除非你想同时使用它们,这更棘手,而且我不确定OpenCL标准实际上是否允许)。。。谢谢你的评论,我在Thomas的帮助下解决了它…我希望它在opencl中没有openGL的帮助。。。谢谢你的评论,我在托马斯的帮助下解决了这个问题……是的,只需使用1个内存缓冲区。设置两个内核以将其用作输入“clSetKernelArgs()”。我已经做了很多次了,一点问题也没有。是的,只需要使用一个内存缓冲区。设置两个内核以将其用作输入“clSetKernelArgs()”。我已经做了很多次了,一点问题也没有。