0

我必须做一个图像映射的 gpu 实现(opencl)。

我似乎记得在某处读到前向映射更适合并行实现,这是为什么呢?

有没有人有一些关于如何进行这些映射的示例代码(最好是在 gpu 上)?

4

1 回答 1

0

对我来说,并行实现的直观选择是反向映射,而不是正向映射。

考虑几个源像素映射到单个目标像素的情况。在前向映射中,如果每个源像素都被评估为一个不同的工作项,则必须在目标像素上实现某种同步以协调多次写入。在逆映射中没有同步开销,因为保证只有一个工作项写入每个像素。

示例逆映射内核代码,利用 OpenCL 的 image2d_t 和 sampler_t 概念进行图像处理:

__kernel void warp(__read_only image2d_t srcImage,
                   __write_only image2d_t dstImage,
                   sample_r sampler)
{
    int2 dstCoords = (int2){ get_global_id(0), get_global_id(1)};
    int2 srcCoords = my_warp_func_inverse(dstCoords);
    float4 srcPixel = read_imagef(srcImage, sampler, srcCoords);
    write_imagef(dstImage, dstCoords, srcPixel);
}

当然,也有一些例外情况,前向映射可能更可取。例如,如果您有一个非常大的源图像和一个小的目标图像,那么前向映射将允许您将源图像分割成段,然后将它们划分到工作项或工作组中,段数据缓存在 __private 或 __local地址空间。在没有映射函数的先验知识的情况下,逆映射可能需要访问源图像的任何部分,这可能会将您限制在 __global 内存中。

于 2012-11-14T18:36:39.380 回答