我是cuda的新手,我想编写一个cuda内核,根据输入矩阵,卷积(或滤波器)和输出矩阵计算卷积。
注意:我希望cuda内核的每个线程在输出矩阵中计算一个值。
我该怎么做?
答案 0 :(得分:1)
如果过滤器覆盖矩阵的填充范围,则可以直接将其转换为 cublasSgemm 。
例如,假设矩阵的尺寸为5 * 4,并且您需要130个滤波器,则要训练的滤波器矩阵的尺寸为130 * 20,而5 * 4矩阵可以取为20 * 1 。
这样,计算速度最佳;它被转换为m1(130,20)和m2(20,1)之间的矩阵乘法。
答案 1 :(得分:1)
我想编写一个 cuda 内核来计算给定输入矩阵、卷积(或滤波器)和输出矩阵的卷积。
您可能对该主题的 this treatment 感兴趣(虽然它有点老了)。或者看CUDA卷积核示例程序:non-separable和separable
<块引用>我希望 cuda 内核的每个线程计算输出矩阵中的一个值。
如果您点击链接,您会意识到您并不完全想要那个。换句话说:不要对您的内核应该如何在线程之间分配工作做出严格的假设,您以后可能会改变主意。
答案 2 :(得分:0)
如果您正在寻找图像卷积内核,此链接可能会有所帮助(Two Dimensional (2D) Image Convolution in CUDA by Shared & Constant Memory: An Optimized way )。
就我而言,使用每个线程来计算输出中的像素或位置可能不是一个好主意。请考虑如何加载此卷积的子区域,或者同一warp中的线程是否在每次读取时读取连续内存。否则,即使有数百个线程可用,内核也可能会受到数据加载的影响。
因此,基本上您只需编写您描述的代码,并使用分析器(nvvp)进行进一步的优化建议。