前向映射与反向映射

时间:2012-11-14 10:18:13

标签: computer-vision opencl gpu-programming

我必须执行图像映射的gpu实现(opencl)。

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

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

1 个答案:

答案 0 :(得分: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内存。

相关问题