我必须做一个图像映射的 gpu 实现(opencl)。
我似乎记得在某处读到前向映射更适合并行实现,这是为什么呢?
有没有人有一些关于如何进行这些映射的示例代码(最好是在 gpu 上)?
我必须做一个图像映射的 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 或 __local地址空间。在没有映射函数的先验知识的情况下,逆映射可能需要访问源图像的任何部分,这可能会将您限制在 __global 内存中。