Sep 26, 2018 原创文章
CUDA并行编程学习(3)-- 将CUDA并行模型扩展到二维空间
二维内核的启动方法
设一幅图像有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;
}