CUDA编程入门(一):以图片运算看线程的组织和核函数的使用

CUDA编程入门(一):以图片运算看线程的组织和核函数的使用

《大规模并行处理器编程实战》学习,其他章节关注专栏 CUDA C

初次接触 CUDA C 编程不建议直接阅读,友情链接:

  • 第三章 CUDA 简介-CUDA C编程向量加法
  • 第四章 CUDA数据并行执行模型
  • 第五章 CUDA 存储器
  • 第六章 CUDA性能优化(内附原书链接)

理解本文后,可进行卷积优化学习:CUDA卷积计算及其优化——以一维卷积为例

1. 线程块的组织

以二维图片处理为例,明确一下线程的组织与核函数调用时的使用。
现在需要对某一个图片(矩阵)的值进行运算,假设图片大小为ImgSize=ImgHeightImgWidth,则需要ImgSize个线程进行处理。
假如使用二维的线程块,则线程块数据结构为dim3 Block(BLOCK_SIZE,BLOCK_SIZE),表示线程块中线程数量为BLOCK_SIZE
BLOCK_SIZE, 取BLOCK_SIZE=16。dim3 Block(x,y,z)为dim3数据结构的参数,此时x=y=16,z默认为1;
于是,多个线程块组成的线程网格可与这个图片映射起来,如下图,线程块横向col为x,对应ImgWidth;纵向row为y,对应ImgHeight,如果有z维度,对应即可
CUDA编程入门(一):以图片运算看线程的组织和核函数的使用_第1张图片
因此,对于ImgWidth*ImgHeight大小的图,需要的线程块的数量为 [ImgWidth/BLOCK_SIZE](向上取整,即 (ImgWidth - 1 + BLOCK_SIZE)/BLOCK_SIZE),[ImgHeight/BLOCK_SIZE],z维度同样为1。则dim3 Grid((ImgWidth - 1 + BLOCK_SIZE)/BLOCK_SIZE, (ImgHeight- 1 + BLOCK_SIZE)/BLOCK_SIZE)),与前面一直,dim3的数据结构都是(x,y,z)形式。
于是网格和线程块的数据结构便具有了。

2. 核函数的调用

图片的地址为float* pin,输出地址为float* out,则对于其函数__global__ void PicKernel(float* pin, float* pout, int width, int height);进行调用
PicKernel <<< Grid, Block >>> (pin, pout, ImgWidth, ImgHeight)
如果还没懂,可以多读一读这段话:
CUDA编程入门(一):以图片运算看线程的组织和核函数的使用_第2张图片

3. 核函数的编写

在核函数里需要把线程与P_in, P_out中其处理的数据相映射:

CUDA编程入门(一):以图片运算看线程的组织和核函数的使用_第3张图片

4.完整的程序

完整的程序需要在主函数中调用Kernel函数,对p_in进行处理。在调用前后还需进行内存的分配回收和数据的拷贝。
还需进行内存的分配回收和数据的拷贝。

你可能感兴趣的:(CUDA,C)