CUDA入门编程感悟

从初见cuda编程到现在已过去许久时间,也曾试图钻研一番,奈何网上资料太少,无法对cuda编程有深刻与形象的认知,于是迟迟未能入门。近来,在公司闲来无事,拿cuda打发时间,经过几番小痛,对cuda编程有了些许形象的认识。
我想,用过python的都知道线城池,那线程池的工作细节我们大多数人不知道,也没有必要过于关注线程池内部每个线程是如何运作的,而以我最近几天的认识,我感悟到,我们使用cuda编程,就像我们在指挥线城池内部的线程如何运作。

cuda将线程布局为 grid block 每个block内的线程索引是局部索引,每个grid内的块索引也是局部索引,但是我们在操纵这些线程时,要从全局出发,也就是所有格子内的所有block中的所有线程被统一布局,相当于每个线程即有局部索引也有全局索引,我们使用局部索引得到全局索引,通过全局索引,我们操纵每一个待处理数据中的元素。这一段内容我也是琢磨了一段时间才总结出来。
那么一般在使用cuda编程时有2中情况:
1)线程数大于待处理的数据中的元素
2)线程数小于待处理的数据中的元素

对于第一种情况:
比如,我们设置 grid=1,block=32, threads=256,那么我们一共有132256个线程,假设我们的数据中的元素只有线程个数的一半,那我们在核函数(核函数就是被__global__声明的函数)中可以使用if判断语句,丢掉多余的线程,只用与数据元素个数相匹配的线程数量即可。
对于第二种情况:
比如,我们设置 grid=1,block=32, threads=256,那么我们一共有132256个线程,假设我们的数据中的元素是线程个数的几倍,甚至几十倍。那么我们就要求线程的步长了,因为待处理的元素多余我们的线程个数,那么单个线程肯定要处理1个以上的数据,那究竟都要处理那几个数据呢?这就要靠步长了,什么是步长,现在可以粗浅的理解为数据元素个数除以总线程个数,这就是步长。所有线程处理完若干数据后,将所有线程索引移动1个步长,处理下一批数据,就是这样。
我简单做了3组实验,2个5000000的数组对应元素相加,分别在python,pytorch调用cuda和c语言在cuda上编程。
对应计算时间分别为,2ms, 0.15ms,0.25ms,可以看出pytorch对cuda计算的优化做的还是很好的,我用c语言自己写cuda程序比pytorch慢了不少,但是应该还有可优化的空间。另外使用c语言对cuda编程,可以深入更底层,更加灵活,可以指挥成千上万的线程整齐运作,也可以在所有线程中操纵单一线程做特殊任务,比使用pytorch和线程池灵活多了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值