CUDA简介——For循环并行化

1. 引言

前序博客:

  • CUDA简介——基本概念
  • CUDA简介——编程模式

CUDA简介——For循环并行化_第1张图片

kernel相关语法定义为:

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

CUDA简介——For循环并行化_第2张图片

当kernel launch之后,该kernel函数结构体内的操作,将在每个Thread内并行运行。
CUDA简介——For循环并行化_第3张图片
如上图所示,所有thread都访问的是相同位置的数据,并无实际意义。实际,不同的thread应区分使用不同位置的数据,为此,需引入thread index。

实际launch kernel时,都希望能有大量的threads:

  • 每个Thread都有其thread index。
    • 在Kernel中,可通过内置的threadIdx变量来获取其thread index。threadIdx为三维的,有相应的(x,y,z)。
  • Thread Blocks最多有3个维度,因此,每个维度都有相应的index:
    • threadIdx.x
    • threadIdx.y
    • threadIdx.z

如:
CUDA简介——For循环并行化_第4张图片

接下来将展示如何使用threadIdx来对for 循环实现Threads并行化。

以CPU for循环程序为例:
CUDA简介——For循环并行化_第5张图片
由于该for循环中的所有迭代是相互独立的,很容易将其分解为以CUDA threads实现的并行化计算。
CUDA简介——For循环并行化_第6张图片
其中:

  • kernel程序中的if(i < N)判断,用于确保Kernel执行的Threads数不超过array length。
  • kernel程序启动配置为:单个block,每个block有N个Threads。
  • 上述CUDA程序中,未展示将device结果拷贝回host的代码。

接下来,再以vector addition为例:
CUDA简介——For循环并行化_第7张图片

CUDA简介——For循环并行化_第8张图片

参考资料

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

你可能感兴趣的:(基础理论,基础理论)