1.
核函数是
cuda
编程的关键
2.
通过
xxx.cu
创建一个
cudac
程序文件,并把
cu
交给
nvcc
编译,才能识别
cuda
语法
3.
__global__
表示为核函数,由
host
调用。
__device__
表示为设备函数,由
device
调用
4.
__host__
表示为主机函数,由
host
调用。
__shared__
表示变量为共享变量
5.
host
调用核函数:
function<<<
gridDim
,
blockDim
,
sharedMemorySize
, stream>>>(
args
…);
6.
只有
__global__
修饰的函数才可以用
<<<>>>
的方式调用
7.
调用核函数是传值的,不能传引用
,
可以传递类、结构体等
,
核函数可以是模板
8.
核函数的执行,是异步的,也就是立即返回的
9.
线程
layout
主要用到
blockDim
、
gridDim
10.
核函数内访问线程索引主要用到
threadIdx
、
blockIdx
、
blockDim
、
gridDim
这些内置变量
这里详细解释一下(使用3个维度进行解释),gridDim是网格,,而网格是三维的分别对应x、y、z,假如gridDim(2,3,4),代表总共有2*3*4=24个网格,那么什么是网格呢?网格是对block的多少进行描述的,这里有24个网格,说明有24个block,那么什么是block呢?block是对线程的多少描述的,blockDim三维分别对应着x,y,z三个维度,假如blockDim(5,6,7),那么说明每个blok里有5*6*7=210个线程,此时有24个block,那么对应的总线程数就是210*24=5040。
dim3 gridDim(x,y,z);
dim3 blockDim(x,y,z);
总的线程数如何计算呢?
int nthreads = gridDim.x * gridDim.y * gridDim.z * blockDim.x * blockDim.y * blockDim.z;
那么多的线程,我怎么找到对应的索引的呢?这里就需要使用到cuda的内置变量了,如下:
![](https://img-blog.csdnimg.cn/1809b028560244718790a13f48b2b14b.png)
其中threadIdx和block相对应,threadIdx.x 对应blockDim.x的索引,threadIdx. 对应blockDim.的索引,threadIdx.z 对应blockDim.z的索引。
blockIdx和grid对应,即索引的是block,因此blockIdx.x对应gridDim.x维度的索引,blockIdx.y对应gridDim.y维度的索引,blockIdx.z对应gridDim.z维度的索引。因此想要获取索引,就要这样: