Computer vision 正映射与逆映射

Computer vision 正映射与逆映射,computer-vision,opencl,gpu,Computer Vision,Opencl,Gpu,我必须做一个图像映射的gpu实现(opencl) 我似乎记得在什么地方读到过,前向映射更适合于并行实现,为什么 还有谁有关于如何进行这些映射的示例代码(最好是在gpu上)?对我来说,并行实现的直观选择是反向映射,而不是正向映射 考虑多个源像素映射到单个目标像素的实例。在正向映射中,如果将每个源像素作为一个不同的工作项进行计算,则必须在目标像素上实现某种同步,以协调多个写入操作。在反向映射中,没有同步开销,因为保证每个像素只写入一个工作项 反向映射内核代码示例,利用OpenCL的image2d_t

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

我似乎记得在什么地方读到过,前向映射更适合于并行实现,为什么


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

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

考虑多个源像素映射到单个目标像素的实例。在正向映射中,如果将每个源像素作为一个不同的工作项进行计算,则必须在目标像素上实现某种同步,以协调多个写入操作。在反向映射中,没有同步开销,因为保证每个像素只写入一个工作项

反向映射内核代码示例,利用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或_本地地址空间中的段数据将其拆分为工作项或工作组。如果事先不了解映射函数,反向映射可能需要访问源映像的任何部分,这可能会限制您访问全局内存