CUDA 学习(七)、线程束

一、概述

       线程束是GPU的基本执行单元。GPU是一组SIMD 向量处理器的集合。每一组线程或线程束中的线程同时执行。在理想状态下,获取当前指令只需要一次访存,然后将指令广播到这个线程所占用的所有SP中。

      当使用GPU进行编程时,必须使用向量类型指令,因为GPU采用的是向量体系结构,只有让代码在成千上万个线程上运行才能充分高效利用GPU的资源。

      当前,GPU上的一个线程束的大小为32,即 wrapSize = 32; 


二、为什么关注线程束

          那我们为什么会如此关注线程束大小呢?具体原因如下:

(1)、分支

      一个线程束是一个单独的执行单元,使用分支(例如,if、else、for、while、do、switch)可以产生不同的执行流。在CPU上使用分支很复杂,因为它需要根据之前的运行情况来预测下一次执行到底执行哪一块代码。在CPU上,指令流通常会被预提取,然后放入CPU指令管线中。假设预测是准确的,那么CPU就避免了一次失速事件。如果预测错误,CPU则需要重新执行预测指令,然后获取另一个分支的指令,再将其添入管线之中。

       相比之下,GPU 对分支的处理就没有这么复杂。GPU在执行完分支结构的一个分支后接着另一个分支。对不满足分支条件的线程,GPU在执行这块代码的时候会将它们设置未激活状态。当这块代码执行完毕后,GPU继续执行另外一个分支,这时,刚刚不满足分支条件的线程如果满足当前的分支条件,那么它们将被激活,然后执行这一段代码。最后,所有的线程聚合,继续向下执行。代码如下:

       

(2)、GPU 利用率

       我们关注线程束的另一个原因就是防止GPU未被充分利用。CUDA 的模式是用成千上万个线程来隐藏内存操作的延迟(从发出存储请求到完成访存操作所花的时间)。比较经典的,如对全局内存访问的延迟一般是400-600个时钟周期。在这个时间里,GPU会忙于其他任务,而不是空闲地等待访存操作的完成。


   





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值