首先概括一下这几个概念。其中SM(Streaming Multiprocessor)SP(streaming Processor)是硬件层次的,其中一个SM可以包含多个SP。thread是一个线程,多个thread组成一个线程块block,多个block又组成一个线程网格grid。

现在就说一下一个kenerl函数是怎么执行的。一个kernel程式会有一个grid,grid底下又有数个block,每个block是一个thread群组。在同一个block中thread可以通过共享内存(shared memory)来通信,同步。而不同block之间的thread是无法通信的。

CUDA的设备在实际执行过程中,会以block为单位。把一个个block分配给SM进行运算;而block中的thread又会以warp(线程束)为单位,对thread进行分组计算。目前CUDA的warp大小都是32,也就是说32个thread会被组成一个warp来一起执行。同一个warp中的thread执行的指令是相同的,只是处理的数据不同。

基本上warp 分组的动作是由SM 自动进行的,会以连续的方式来做分组。比如说如果有一个block 里有128 个thread 的话,就会被分成四组warp,第0-31 个thread 会是warp 1、32-63 是warp 2、64-95是warp 3、96-127 是warp 4。而如果block 里面的thread 数量不是32 的倍数,那他会把剩下的thread独立成一个warp;比如说thread 数目是66 的话,就会有三个warp:0-31、32-63、64-65 。由于最后一个warp 里只剩下两个thread,所以其实在计算时,就相当于浪费了30 个thread 的计算能力;这点是在设定block 中thread 数量一定要注意的事!

一个SM 会根据其内部SP数目分配warp,但是SM 不见得会一次就把这个warp 的所有指令都执行完;当遇到正在执行的warp 需要等待的时候(例如存取global memory 就会要等好一段时间),就切换到别的warp来继续做运算,借此避免为了等待而浪费时间。所以理论上效率最好的状况,就是在SM 中有够多的warp 可以切换,让在执行的时候,不会有「所有warp 都要等待」的情形发生;因为当所有的warp 都要等待时,就会变成SM 无事可做的状况了。

实际上,warp 也是CUDA 中,每一个SM 执行的最小单位;如果GPU 有16 组SM 的话,也就代表他真正在执行的thread 数目会是32*16 个。不过由于CUDA 是要透过warp 的切换来隐藏thread 的延迟、等待,来达到大量平行化的目的,所以会用所谓的active thread 这个名词来代表一个SM 里同时可以处理的thread 数目。而在block 的方面,一个SM 可以处理多个线程块block,当其中有block 的所有thread 都处理完后,他就会再去找其他还没处理的block 来处理。假设有16 个SM、64 个block、每个SM 可以同时处理三个block 的话,那一开始执行时,device 就会同时处理48 个block;而剩下的16 个block 则会等SM 有处理完block 后,再进到SM 中处理,直到所有block 都处理结束

在CUDA 架构下,GPU芯片执行时的最小单位是thread。
若干个thread可以组成一个线程块(block)。一个block中的thread能存取同一块共享内存,可以快速进行同步和通信操作。
每一个block 所能包含的thread 数目是有限的。执行相同程序的block,可以组成grid。不同block 中的thread 无法存取同一共享内存,因此无法直接通信或进行同步。
不同的grid可以执行不同的程序(kernel)。

举个栗子:

1:一个SM有8个SP,SM执行一个Warp时有32个线程,这32各线程在8个SP上执行4次,实际上是8个8个轮替,严格意义上来讲不是同时执行,只是隐藏延迟,因为软件层我们是将其抽象出来,因此可以说是同时执行。
2:当一个SM中有更多的SP时,例如GP100这种,一个SM上有64个SP,线程也不一定是平摊的,看具体架构的官方文档。一般情况下还是8个sp执行4次,也就是说当你数据跑32个线程的时候,在有64个SP的SM里实际还是8个SP在跑,和一个SM里面只有8个SP的情况是一致的。所以一个SM有64个SP的时候,意味着最多同时可以并行8个warp,8×32线程即256和线程。此时通常情况来说已经满线程了,当架构能进一步降低延迟时,通过抽象可以跑1024个线程。

CUDA中grid、block、thread、warp与SM、SP的关系相关推荐

  1. [原]CUDA中grid、block、thread、warp与SM、SP的关系

    [原]CUDA中grid.block.thread.warp与SM.SP的关系 2015-3-27阅读209 评论0 首先概括一下这几个概念.其中SM(Streaming Multiprocessor ...

  2. CUDA里面GRID, BLOCK 边界检测

    dim3 block(BLOCK_X, BLOCK_Y); dim3 grid((roi.width + block.x - 1) / block.x, (roi.height + block.y - ...

  3. GPU软件抽象与硬件映射的理解(Grid、Block、Warp、Thread与SM、SP)

    GPU软件抽象与硬件映射的理解 1 从程序到软件抽象: 组成关系: GPU上运行函数kernel对应一个Grid,每个Grid内有多个Block,每个Block由多个Thread组成. 运行方式: B ...

  4. Cuda 程序设计中 Grid 和 Block 维度设置的注意事项

    1. Cuda 线程的 Grid 架构 Cuda 线程分为 Grid 和 Block 两个级别,Grid.Block.Thread 的关系如下图. 一个核函数目前只包括一个 Grid,也就是图中的 G ...

  5. CUDA学习第三天:Kernel+grid+block关系

    1. 理一理前两天学到的概念之间的关系 CUDA && GPU CUDA: NIVID的CPUs上的一个通用并行计算平台和编程模型: GPU: CPU+GPU的异构计算架构,CPU所在 ...

  6. CUDA中SM对线程块的调度

    sm流处理器簇对blocks的调度策略 在cuda中,GPU中的SM(比如GTX650有两个SM处理器)被CPU调度器把线程块逐个分配到SM上,每个SM同时处理这个被分配的线程块,但是每次每个时刻只能 ...

  7. CUDA中Occupancy相关知识

    文章目录 occupancy初步理解 occupancy具体分析 occupany的推导流程 Occupancy实际运用 occupancy 有啥用 前言 本篇文章只适合稍微有一些cuda基础的朋友阅 ...

  8. Cuda中Global memory中coalescing例程解释

    Global memory是cuda中最常见的存储类型,又叫做Device memory,位于Host主机区域上,它的生命周期是在整个Grid里面,大约具有500个cycle latency.在cud ...

  9. 解读SM, SP和Warp

    http://datamining.xmu.edu.cn/bbs/forum.php?mod=viewthread&tid=655 经常在阅读文档的时候会遇到这些名词.一般他们都会以tesla ...

最新文章

  1. 蚂蚁金服高级技术专家徐红星 :蚂蚁金服大数据开放式创新实践
  2. pythonsvc_sklearn-SVC实现与类参数详解
  3. 在Android中使用FlatBuffers - 简介
  4. 本地服务器的音乐如何才能播放视频文件夹,mx播放器如何添加本地文件 添加本地文件设置方法...
  5. 超干货!为了让你彻底弄懂MySQL事务日志,我通宵肝出了这份图解!
  6. [SQL] 常用查询脚本
  7. 关于Entity Data model掌握灵活的数据模型 EntityFramework(1)(翻译)
  8. 数值分析期末考试复习(引论)
  9. 一张图了解软件测试流程
  10. 机器人核心期刊及会议
  11. 进程间通信----共享内存
  12. Hyper-v安装和使用
  13. 一个普普通通的Windows简单开发环境搭建
  14. 五子棋双人对战的实现
  15. 开发这么多年!垃圾回收你真的了解吗?
  16. 电机调速matlab仿真书,双闭环直流电机调速的matlab仿真.doc
  17. 克隆别人的qq空间?
  18. 音视频文件码率与大小计算
  19. sso登录统一账号体系和集中认证授权,实现用户快速访问应用-哇谷云
  20. android 耳机图标显示图标,一种耳机图标的显示方法及终端与流程

热门文章

  1. 2022-2028年中国三氟化氮行业市场调查研究及前瞻分析报告
  2. WebGoat教程学习(三)--Ajax安全
  3. nonatomic, retain,weak,strong用法详解
  4. Android 知识杂记(MVP模式)
  5. MyEclipse安装Freemarker插件
  6. [PHP]php基础练习题学习随笔
  7. web.py下获取get参数
  8. 蜻蜓resin服务器虚拟目录的设置
  9. AlexNet中的局部响应归一化(LRN)
  10. usaco Hamming Codes