在 OpenCL 中转置 image2d_t

Transpose an image2d_t in OpenCL

我从事图像处理代码库的工作,该代码库在任何地方都使用 image2d_t 对象。它们具有正式声明的形状(宽度和高度),使程序员能够使用内置边界检查等。

为了加速可分离的 2D 卷积,我想临时转置图像,所以两个 1D 卷积沿线访问内存。但是由于所有 image2d_t 缓冲区都具有相同的形状,我需要重塑其中的 2 个,而不是重新分配它们(如果我需要重新分配 + 转置,那么加速加起来几乎没有)。

有没有办法在 image2d_t 对象中切换宽度和高度属性?

转置 image2d_t 个对象没有意义。

image2d_t 个对象代表纹理内存。纹理内存是一种特殊的内存,hardware-optimized 适用于 warp/wavefront 的线程访问附近 2D 位置(x 和 y)中的元素的情况。

'nearby 2D locations' 我的意思是不一定在同一水平线 (x) 上,也不一定在离散的像素位置。

GPU 硬件特别支持 'texture sampling' - 允许您 'sample' 非离散位置的纹理并获得内插像素值。

实现纹理内存的确切方式取决于供应商,但一般的想法是让 2D 区域图块驻留在内存中的同一物理行中。

使用纹理内存的例子:

  • 计算机图形学中的纹理映射。对象中的相邻像素从输入图像中的相邻 2D 位置采样它们的颜色。

  • 图像处理中的图像变换 - 缩放、旋转、扭曲和取消扭曲图像。您 'sample' 在任意计算位置输入图像并将样本写入目标缓冲区/图像的情况。

对于图像处理应用程序的大多数情况,纹理内存没有意义。

许多图像处理算法以已知模式访问内存,使用线性内存(opencl 缓冲区)可以更好地优化这种算法,并且开销更少。

关于您的具体问题:

Is there a way to switch width and height properties in the image2d_t object?

没有。 image2d_t 个对象是 'immutable'。但是,如果您为它们分配适当的标志并将它们作为 __write_only.

传递给内核,则可以更改它们的内容

我建议您改用缓冲区对象。转置它们可以高效地完成,网上有一些很好的例子。