Sep 26, 2018 原创文章

  CUDA并行编程学习(3)-- 将CUDA并行模型扩展到二维空间

基于CUDA的并行编程学习笔记

分享到: 0

请保证您的浏览器支持MathJax插件,以免数学公式无法显示


二维内核的启动方法

设一幅图像有w列,h行。在x方向使用TX个线程,在Y方向使用TY个线程

指定二维线程块的大小


dim3 blockSize(TX , TY);

计算x,y方向上的线程块数


int bx = (w + blockSize.x - 1)/blockSize.x;
int by = (h + blockSize.y - 1)/blockSize.y;

启动内核


kernelName<<<gridSize,blockSize>>>(args)

二维内核函数

典型的二维内核函数


__global__
void kernel2D(float *d_out, int w, int h, ....)
{
  const int c = blcokIdx.x * blockDim.x + threadIdx.x;
  const int r = blcokIdx.y * blockDim.y + threadIdx.y;
  const int i = r*w + c;

  if((c >= w)||(r >= h))
    return;

  d_out[i] = Some Code;
}

计算图像数据的二维内核函数

对于图像数据一般使用uchar4类型存储。uchar4类型存储了四个无符号字符的向量,每个向量占用一个字节的存储空间。实际上,可以用uchar4存储图像数据的四个通道。x,y,z,w 四个成员分别对用图像数据的RGB通道和Alpha通道每个通道值的范围为0~255。


__global__
void kernel2D(uchar4 *d_out, int w, int h, ....)
{
  const int c = blcokIdx.x * blockDim.x + threadIdx.x;
  const int r = blcokIdx.y * blockDim.y + threadIdx.y;
  const int i = r*w + c;

  if((c >= w)||(r >= h))
    return;

  d_out[i].x = Red;
  d_out[i].y = Green;
  d_out[i].z = Blue;
  d_out[i].w = Alpha;
}


打赏


感谢您的支持,我会继续努力的!

扫码支持

长按识别二维码或打开支付宝扫一扫 完成打赏
或 使用<支付宝链接>打赏


关闭

分享到: 0