推出这个系列的目的呢,主要是因为CUDA学习的一个主要用途就是对图像处理进行加速,而处理图像的过程中经常要用到卷积。卷积的计算有多种形式,本系列主要研究的是二维矩阵的卷积计算。从最原始的计算方法(就是本科教科书上的那种)再到优化后的适用于大型数据的算法,均提供并行化的设计思路。
考虑到机器学习很火,很多人也用python来做图形处理。但不好的地方在于python目前还不支持GPGPU编程,这就很尴尬。所以说编程语言掌握全面一点总归是好的嘛!
下面是普通版的CUDA进行卷积的操作方法,是对卷积最初始的算法进行的GPU平台的移植。我们称之为版本二(版本一就是原始版的嘛)。算法本身不难,但他考验了一些CUDA的基本功,对以后的深入学习有着铺垫作用。
那么利用计算机计算卷积最原始的版本呢,莫过于离散乘积求和,即对f[n-m]g[m]求和。那么整个卷积就只需要几个循环便可以做出来了。
那么这里我们也提供对上述过程最简单的CUDA程序给大家看:
__global__ void conv_kernel(const float *ina, const float *inb, float *out, size_t len_a, size_t len_b, size_t len_out)
{
const int tid = blockIdx.x * blockDim.x + threadIdx.x;
if (tid >= len_out)
{
return;
}
float sum = 0.0f;
for (int m = 0; m < len_b; ++m)
{
int k = tid - m;
if (