CUDA 学习线程束

Posted tiemaxiaosu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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会忙于其他任务,而不是空闲地等待访存操作的完成。


   






以上是关于CUDA 学习线程束的主要内容,如果未能解决你的问题,请参考以下文章

CUDA 学习(十七)优化策略2:内存因素

CUDA学习5 常量内存与事件

深度学习部署(十三): CUDA RunTime API thread_layout线程布局

CUDA 学习常量内存

CUDA -- 规约求矩阵的行和

CUDA 学习(十九)优化策略4:线程使用计算和分支