OpenCL clEnqueueCopyImageToBuffer with stride

Yur*_*ury 1 gpgpu opencl

我有一个包含2D图像的OpenCL缓冲区.此图像的宽度大于其宽度.我需要从这个缓冲区制作OpenCL图像.问题是函数clEnqueueCopyImageToBuffer不包含stride作为输入参数.是否可以从OpenCL缓冲区(步幅大于宽度)制作OpenCL图像,只需复制一次或更快?解决这个问题的一种方法是编写自己的内核,但也许还有更多简洁的解决方案?

jpr*_*ice 6

不幸的是,OpenCL规范中没有允许您在缓冲区数据的步幅不等于图像宽度时直接从缓冲区创建图像的方法.最有效的解决方案可能是编写自己的内核来执行此操作.

不涉及编写自己的内核的最简单的解决方案是一次复制一行clEnqueueCopyBufferToImage.如果你的图像足够大,那么这种技术的性能可能与手写内核相当,但你必须尝试一下才能看到.


我没有clEnqueueCopyBufferRect在原来的答案中包含这种方法,因为我的第一直觉是额外的副本会扼杀性能.然而,上面的评论让我进一步思考它,我有兴趣实现所有三种方法,看看性能实际上是什么样的.

表现结果

我怀疑,最快的方法是实现内核直接执行此操作.但是,逐行复制数据的速度明显慢于我的预期.将缓冲区复制到中间缓冲区clEnqueueCopyBufferRect实际上是性能和简单性的相当好的折衷,尽管仍然比内核实现慢几倍.

这个小实验的源代码可以在这里找到.我正在以1024的步幅复制1020x1020图像,并且时间平均超过8次.