【cuda by example学习笔记】-2023.7.25

矢量求和

add<<<N,1>>>(&a,&b,&c)

第一个参数代表要使用的线程块的数量,第二个参数代表每个线程块中线程的数量。将实现方式由并行线程块改为并行线程时需要修改两个地方:1.修改尖括号内的参数 2.修改索引方法,即改为int id = threadIdx.x

对更长矢量求和

每个线程块对线程的数量也有限制,如果需要对很长的矢量求和,就必须将线程块和线程结合。这里也需要改变两个地方:核函数的索引计算方法和核函数的调用方式。1.索引方法为int  tid = threadIdx.x + blockIdx.x * blockDim.x,其中blockDim.x表示的是线程块中每一维的线程数量。这里的意思就相当于使用多个线程块,每个线程块中也会有多个线程。2.将函数调用改写为add<<<(N+127)/128,128>>>,第一个参数若是N/128会出现N<128时,分配0个线程块的错误。第二个参数是一个常数,如果N不是128的整数倍,会不会启动过多的线程呢,当然不会,因为在访问之前,会先检查偏移量是否位于0-N之间。

对任意长度矢量求和

每一维的线程格对线程块数量也有限制,需要如下所示采用新的索引方法

tid += blockDim.x * gridDim.x。其中gridDim.x代表的是线程格中的线程块数量。

变量blcoks代表线程格中包含的并行线程块数量,变量threads代表每个线程块中包含的线程数量。

共享内存和同步

在GPU上启动的每个线程块,CUDA C编译器都将创建该变量的一个副本。同一个线程块上的每个线程都共享这块内存,但无法看到或修改其他线程块上的变量副本。__share__可以让变量驻存在共享内存中,并且共享内存缓冲区驻留在物理GPU上,而不是在GPU之外的系统内存中,这使得共享内存使用起来很高效。这样就实现了线程间的通信,但需要考虑新的问题,要实现线程间的同步。方法为:__syncthreads();这个函数保证每个线程都执行完函数前边的语句时,才能执行下一条语句。需要注意的是,该函数不能出现在if()语句中,因为该函数所在的分支可能不会执行,但又要确保每个线程执行完__syncthreads()后才能执行下一条语句,结果就是会使GPU一直等待。

点积运算

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值