1. 引言
前序博客:
- CUDA简介——基本概念
- CUDA简介——编程模式

kernel相关语法定义为:
- kernel函数定义,与常规C函数定义类似。
- 不同之处在于,有__global__关键字。- 为说明符,告诉编译器该函数应编译运行在device上,由device调用。
 
- kernel函数范围类型必须为void:kernel中计算的任何结果都存储在device内存中。- 传递给kernel操作的变量,必须为reference(引用)。
 
- C中函数的“pass-by-value”,即以值为参数: - 函数会接收其参数的copies。
- 实际并不修改这些函数的参数。
 
- kernel函数为“pass-by-reference”,即将变量地址作为参数传递给kernel。

当kernel launch之后,该kernel函数结构体内的操作,将在每个Thread内并行运行。
 
 如上图所示,所有thread都访问的是相同位置的数据,并无实际意义。实际,不同的thread应区分使用不同位置的数据,为此,需引入thread index。
实际launch kernel时,都希望能有大量的threads:
- 每个Thread都有其thread index。 - 在Kernel中,可通过内置的threadIdx变量来获取其thread index。threadIdx为三维的,有相应的(x,y,z)。
 
- 在Kernel中,可通过内置的
- Thread Blocks最多有3个维度,因此,每个维度都有相应的index: - threadIdx.x
- threadIdx.y
- threadIdx.z
 
如:
 
接下来将展示如何使用threadIdx来对for 循环实现Threads并行化。
以CPU for循环程序为例:
 
 由于该for循环中的所有迭代是相互独立的,很容易将其分解为以CUDA threads实现的并行化计算。
 
 其中:
- kernel程序中的if(i < N)判断,用于确保Kernel执行的Threads数不超过array length。
- kernel程序启动配置为:单个block,每个block有N个Threads。
- 上述CUDA程序中,未展示将device结果拷贝回host的代码。
接下来,再以vector addition为例:
 

参考资料
[1] Intro to CUDA (part 3): Parallelizing a For-Loop