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