用于图像过滤的3d CUDA内核索引?

时间:2013-02-17 12:11:19

标签: image-processing cuda filtering

我有一个图像特征矩阵 A是n * m * 31矩阵填充用于过滤,我有 B作为对象过滤器k * l * 31 。我想获得一个输出矩阵C是p * r * 31,图像A的大小没有填充。我尝试编写一个CUDA代码来运行A上的过滤器B并获得C。

我假设A上的每个过滤操作都有一个线程块占用过滤器B,因此每个线程块内都会有k * l操作。并且每个移位的滤波操作将在不同的线程块完成。对于A(0,0),过滤将在thread_block(0,0)上,而A(0,1)将在thread_block(1,0)上,依此类推。此外,我的第三维为31.第三维的每个空间都将自行计算。因此,通过对矩阵进行正确的3d索引,我可能能够以非常平行的形式进行所有操作。

所以操作是

A n*m*31 X B k*l*31 = C p*r*31 

如何有效地为操作进行内核索引?

1 个答案:

答案 0 :(得分:9)

以下是我编写的一些代码,大致按照您的描述进行操作。

它会创建一个3D数据集(称为cell,但它与您的数组A相当),用随机数据填充它,然后计算结果3D输出数组(称为{{ 1}},但根据node中的数据,它可与您的数组C进行比较。 A的数据大小大于A的大小(在您调用时为“填充”),以允许将函数C传递给B的边界元素。在我的例子中,函数B只是找到与{B}的大小相关的A的3D立方体积内的最小值(我称之为A,创建一个3D区域WSIZE x WSIZE x WSIZE)并将结果存储在WSIZE

此特定代码尝试通过将输入A的某个区域复制到每个块的共享内存来利用数据重用。每个块计算多个输出点(即它计算B次数以填充C的区域),以便利用B的相邻计算的数据重用机会。

这可能有助于您入门。你显然必须用你想要的B函数替换B(我的最小查找代码)。此外,在我的情况下,您需要将B域从立方体修改为与B尺寸对应的任何类型的矩形棱镜。这也会影响共享内存操作,因此您可能希望在第一次迭代时省去共享内存以使功能正常,然后添加共享内存优化以查看可以获得的好处。

C