重新利用openCL内存
大家好,, 作为一个例子,考虑两个OpenCL内核一个内核,让我们说ADD和其他是S.< /P> 添加内核是重新利用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
__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()”。我已经做了很多次了,一点问题也没有。