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。

在这里插入图片描述

当kernel launch之后,该kernel函数结构体内的操作,将在每个Thread内并行运行。
在这里插入图片描述
如上图所示,所有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

如:
在这里插入图片描述

接下来将展示如何使用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值