将几个OpenCL缓冲区组合到一个大缓冲区中

时间:2011-08-31 01:33:39

标签: c arrays memory buffer opencl

我有一个2D阵列,我将其分成几个1D阵列,并将这些1D阵列转换为OpenCL缓冲区。有时候我需要一个内核函数来获取整个2D数组,但由于它的大小是在运行时确定的,因此我不能只生成足够的内核参数,因为有1D数组(加上可能有超过1000个1D数组)。我希望有一些方法可以让1D数组保存OpenCL缓冲区并将它们组合成一个包含整个数据的大缓冲区并将其发送到我的内核。现在,我能看到这样做的唯一方法是,如果我将1D缓冲区中的数据读回我的程序,将它们排列成一个巨大的1D阵列,并将新缓冲区写回我的计算设备,这似乎是非常的慢,还有其他办法吗?

2 个答案:

答案 0 :(得分:3)

以下是一些想法(虽然我承认它们并不理想)。

不是将缓冲区复制回程序,然后从中构建新缓冲区,而是可以使用clEnqueueCopyBuffer()方法(或clEnqueueCopyBufferRect(),根据您的具体情况)从一个缓冲区复制数据到另一个。我相信(但我不会发誓)这个副本的执行方式依赖于实现,但似乎驻留在设备内存中的缓冲区可以复制到设备内存中的另一个缓冲区,而无需返回总线托管记忆。

当然(如果我理解正确的话),复制并不是你想要的。如何使用clCreateSubBuffer()方法?此方法可以创建一个新缓冲区,它只是指向现有缓冲区的子区域(实际上没有自己的副本)。为此,(根据我对你所描述的内容的理解)你需要制作大型2D缓冲区,然后创建一些指向该存储区域的轻量级1D子缓冲区。

这样,您可以在必要时传递表示整个2D数组的缓冲区,但只需传递一个或多个1D子缓冲区即可。

答案 1 :(得分:0)

我测试了clCreateSubBuffer(他的发布)并看到它比复制慢,比创建/发布更好,但...... :( 系统: OpenCL 1.1 AMD-APP-SDK-v2.5(684.212)FULL_PROFILE Radeon 5870