首先要搞清楚的cuda的三级线程(thread)的划分然后搞清楚
cuda的硬件层级划分只是逻辑上的划分和FPGA的硬件划分是完全不同的
举个例子,下面的汉是实现了图片卷积核的图像的一维化数据存储,核中每个单元参数是k float类型
如下:1*1*2*2的维度卷积核
k | k |
k | k |
// GPU内核函数,将数组所有元素设置为常数k //将卷积和设置为 常数k
__global__ void dev_const(float *px, float k) {
int tid = threadIdx.x + blockIdx.x * blockDim.x;
px[tid] = k;
}
在上面的代码中是在Host(cpu端)进行的矩阵数据内存数据与线程索引(ThreadIDx)的一一对应
dev_const<<<filt_w * filt_h, filt_k * filt_c>>>(filt_data, 1.f);
执行后得到卷积核如下
1 | 1 |
1 | 1 |
但是在运行的情况下却没有按照上面1*1*2*2的维度去划分grid 和block的参数
这是为什么呢?在内存允许的情况下
<<< >>> 中所定义的划分方案只是影响该函数的并行程度
真正的对应内存上的数据执行什么操作是和线程一一对应的,和<<< >>> 里的划分参数无关
通过选择合理的<<< >>> 参数可以得到不同的运算性能。。。。
上面如此划分一方面是为了提高并行度,另一方面是提高可读性
大部分的卷积核h*w远大于n*c