CUDA计算实列:浅析n(n等于1或大于1)维数组计算方法与grid、block、thread之间关系(上篇)

2021-07-28 10:56

阅读:802

标签:cout   ref   编写   rgb   void   值拷贝   index   tps   dev       本文主要针对与我一样的小白想使用CUDA加速方法,而经过Visual Studio编译器对cuda代码反复试验与调整得到以下成果。 目前本文主要使用一维数组对CUDA的grid与block的组合尝试,已实现CUDA一维数组的计算,将其记录如下。 而我也将会在下篇继续使用多维数组使用CUDA计算。   本文可以帮助大家尽快上手CUDA实现简单代码编写,了解如何利用CUDA 线程实现每个元素处理(若为图片则是像素处理)。   本文结构:1.基本原理;2.一维数组代码;3.实现结果展示。   1.基本原理 原理引用博客为https://blog.csdn.net/tiao_god/article/details/107181883 CUDA会把线程分为Block和Grid:       这里方便介绍我们用的都是二维的结构,其实Block和Grid也可以设置成三维的。 blockDim.x:Block的x方向的维度,这里是5,即每行5个线程。 blockDim.y:Block的y方向的维度,这里是3,即每列3个线程。 blockIdx.x:Block在x方向的位置,图中放大的Block是2,即为第2个。 blockIdx.y:Block在y向的位置,图中放大的Block是2,即为第2个。 注意blockIdx中的Idx是表示index的缩写,而不是表示x方向的ID。 在CUDA里计算线程索引一般都是: const int X = blockIdx.x * blockDim.x + threadIdx.x; const int Y = blockIdx.y * blockDim.y + threadIdx.y;对应图中放大的区域的Thread(3,1): 计算式:X = 2*5+3 Y = 2*3+1   2.一维数组代码 // 一个维度的计算方法 __global__ void one_vector_add(float* a_device, float* b_device, float* c_device) { int tid = threadIdx.y+blockDim.x*threadIdx.x; c_device[tid] = a_device[tid] + b_device[tid]; } // 一维数组相加 void OneDim_add() { const int length = 4; // 数组长度为16 float a[length], b[length], c[length]; // host中的数组 // 变量初始化赋值 for (int i = 0; i


评论


亲,登录后才可以留言!