我有一个图像特征矩阵 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
如何有效地为操作进行内核索引?
答案 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