CUDA学习----sp, sm, thread, block, grid, warp概念

2017-01-11 17:14:28|  分类: HPC&CUDA优化 |  标签:cuda  gpu  hpc   |举报 |字号 订阅

下载LOFTER 我的照片书  |

掌握部分硬件知识,有助于程序员编写更好性能的CUDA程序,本文目的是理清sp,sm,thread,block,grid,warp之间的关系。 
首先我们要明确:SP(streaming Process),SM(streaming multiprocessor)是硬件(GPU hardware)概念。而thread,block,grid,warp是软件上的(CUDA)概念。

从硬件看


  • SP:最基本的处理单元,streaming processor,也称为CUDA core。最后具体的指令和任务都是在SP上处理的。GPU进行并行计算,也就是很多个SP同时做处理。
  • SM:多个SP加上其他的一些资源组成一个streaming multiprocessor。也叫GPU大核,其他资源如:warp scheduler,register,shared memory等。SM可以看做GPU的心脏(对比CPU核心),register和shared memory是SM的稀缺资源。CUDA将这些资源分配给所有驻留在SM中的threads。因此,这些有限的资源就使每个SM中 active warps有非常严格的限制,也就限制了并行能力。
需要指出,每个SM包含的SP数量依据GPU架构而不同,Fermi架构GF100是32个,GF10X是48个,Kepler架构GK110都是192个,Maxwell都是128个。相同架构的GPU包含的SM数量则根据GPU的中高低端来定。
软件逻辑上是所有SP是并行的,但是物理上并不是所有SP都能同时执行计算,因为有些会处于挂起,就绪等其他状态。

从软件看


  thread,block,grid,warp是CUDA编程上的概念,以方便程序员软件设计,组织线程,同样的我们给出一个示意图来表示。

  • thread:一个CUDA的并行程序会被以许多个threads来执行。
  • block:数个threads会被群组成一个block,同一个block中的threads可以同步,也可以通过shared memory通信。
  • grid:多个blocks则会再构成grid。
  • warp:GPU执行程序时的调度单位,目前cuda的warp的大小为32,同在一个warp的线程,以不同数据资源执行相同的指令,这就是所谓 SIMT(单指令多线程)。

对应关系


GPU中每个sm都设计成支持数以百计的线程并行执行,并且每个GPU都包含了很多的SM,所以GPU支持成百上千的线程并行执行。当一个kernel启动后,thread会被分配到这些SM中执行。大量的thread可能会被分配到不同的SM,同一个block中的threads必然在同一个SM中并行(SIMT)执行。每个thread拥有它自己的程序计数器和状态寄存器,并且用该线程自己的数据执行指令,这就是所谓的Single Instruction Multiple Thread。

  一个SP可以执行一个thread,但是实际上并不是所有的thread能够在同一时刻执行。Nvidia把32个threads组成一个warp,warp是调度和运行的基本单元。warp中所有threads并行的执行相同的指令。一个warp需要占用一个SM运行,多个warps需要轮流进入SM。由SM的硬件warp scheduler负责调度。目前每个warp包含32个threads(NVIDIA保留修改数量的权利)。所以,一个GPU上resident thread最多只有 SM*warp个。

SIMT和SIMD


  CUDA是一种典型的SIMT架构(单指令多线程架构),SIMT和SIMD(Single Instruction, Multiple Data)类似,SIMT应该算是SIMD的升级版(SIMD < SIMT < SMT),更灵活,但效率略低,SIMT是NVIDIA提出的GPU新概念。二者都通过将同样的指令广播给多个执行单元来实现并行。一个主要的不同就是,SIMD要求所有的vector element在一个统一的同步组里同步的执行,而SIMT允许线程们在一个warp中独立的执行。SIMT有三个SIMD没有的主要特征:

  • 每个thread拥有自己的instruction address counter
  • 每个thread拥有自己的状态寄存器
  • 每个thread可以有自己独立的执行路径
前面已经说block是软件概念,一个block只会由一个sm调度,程序员在开发时,通过设定block的属性,告诉GPU硬件,我有多少个线程,线程怎么组织。而具体怎么调度由sm的warps scheduler负责,block一旦被分配好SM,该block就会一直驻留在该SM中,直到执行结束。一个SM可以同时拥有多个blocks,但需要序列执行。下图显示了软件与硬件方面的术语对应关系: 
需要注意的是,大部分threads只是逻辑上并行,并不是所有的thread可以在物理上同时执行。例如,遇到分支语句(if else,while,for等)时,各个thread的执行条件不一样必然产生分支执行,这就导致同一个block中的线程可能会有不同步调。另外,并行thread之间的共享数据会导致竞态:多个线程请求同一个数据会导致未定义行为。CUDA提供了cudaThreadSynchronize()来同步同一个block的thread以保证在进行下一步处理之前,所有thread都到达某个时间点。 
同一个warp中的thread可以以任意顺序执行,active warps被sm资源限制。当一个warp空闲时,SM就可以调度驻留在该SM中另一个可用warp。在并发的warp之间切换是没什么消耗的,因为硬件资源早就被分配到所有thread和block,所以该新调度的warp的状态已经存储在SM中了。不同于CPU,CPU切换线程需要保存/读取线程上下文(register内容),这是非常耗时的,而GPU为每个threads提供物理register,无需保存/读取上下文。 
SIMD、SIMT和SMT区别和联系:SIMT、SIMD、SMT区别

CUDA学习----sp, sm, thread, block, grid, warp概念相关推荐

  1. GPU的硬件结构中与CUDA相关的几个概念:thread block grid warp sp sm

    streaming processor(sp): 最基本的处理单元,streaming processor 最后具体的指令和任务都是在sp上处理的.GPU进行并行计算,也就是很多个sp同时做处理.现在 ...

  2. cuda笔记-初始化矩阵及thread,block,grid概念

    thread:一个CUDA的并行程序会被许多threads来执行: block:多个threads组成一个block,同一个block中threads可以使用_syncthreads()同步,也可以通 ...

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

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

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

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

  5. Cuda学习笔记(一)——sm流处理器簇对blocks的调度策略

    由于GPU目前在各行各业的广泛应用,无论是深度学习.大数据.云计算等都离不开GPU的并行加速,前阵子自学了Cuda-c编程,希望将来的研究工作能够用得上. Cuda系列总共有4篇,这里主要用于记录本人 ...

  6. Nvidia GPU架构 - Cuda Core,SM,SP等等傻傻分不清?

    背景   在深度学习大热的年代,并行计算也跟着火热了起来.深度学习变为可能的一个重要原因就是算力的提升.作为并行计算平台的一种,GPU及其架构本身概念是非常多的.下面就进行一个概念阐述,以供参考. G ...

  7. CUDA学习笔记(LU分解)

    最近在学习LU的并行加速,从paper中得到了一些idea,就想着用GPU来实现一下.学习CUDA的过程中踩了不少坑,不过最终还是完成了测试. 一.LU基本算法 1.LU 分解是计算机做矩阵运算过程中 ...

  8. CUDA学习3-GridBlock

    掌握如何组织线程是CUDA编程的重要部分.CUDA线程分成Grid和Block两个层次. 由一个单独的kernel启动的所有线程组成一个grid,grid中所有线程共享global memory.一个 ...

  9. 【CUDA学习】GPU硬件结构

    GPU的硬件结构,也不是具体的硬件结构,就是与CUDA相关的几个概念:thread,block,grid,warp,sp,sm. sp: 最基本的处理单元,streaming processor  最 ...

最新文章

  1. python使用matplotlib可视化使用subplots子图、subplots绘制子图、并为可视化的每个子图添加标题(title for each subplots)
  2. 手机息屏后停止_手机息屏还能这样玩?华为这几个隐藏小功能快学起来
  3. 加州无人车报告出炉,苹果表现垫底,国产车进前五
  4. HDU2044一只小蜜蜂(递推)
  5. Java8 LinkedHashMap 源码阅读
  6. OpenCASCADE绘制测试线束:拓扑命令之扫掠Sweeping
  7. sessionlistener方法中获取session中存储的值报空指针异常_从Golang实践中得到的教训...
  8. 继承 :5、程序设计 类:汽车类 属性:排量(outPut),颜色(color) 行为:驾驶(drive)
  9. LINUX中使用fdisk对SD卡磁盘进行格式化并重新分区
  10. 大白话Pyramid Vision Transformer
  11. 【NOI2002】【Luogu1196】银河英雄传说(并查集带边权)
  12. Java多线程实现-Thread类
  13. Multiple commands produce xxxxxxxxxx app/Info.plist':
  14. android 人脸识别边框_虹软人脸识别 - Android Camera实时人脸追踪画框适配
  15. 非IE内核浏览器支持activex插件
  16. linux 中的 usr 是什么含义
  17. PART 1:基于大数据人才岗位招聘情况对数据进行清洗、初步分析
  18. 原生JS JavaScript实现懒加载效果
  19. CCS中调试DM6467高清视频采集(TVP7002输入)
  20. NumberPicker

热门文章

  1. 【l转】VS2015下解决:无法解析的外部符号 __imp___vsnprintf 及__iob_func
  2. WPF无边框拖动、全屏、缩放
  3. 洛谷 1351 联合权值——树形dp
  4. 富盛Sbo生产管理简介
  5. Hadoop入门进阶步步高(一)-环境准备
  6. Android生成Xml文件
  7. 网站安全狗V3.0—— .NET安全设置及保护实战教程
  8. 关于citrix 负载及WI的一些问题
  9. poj 1584(凸包+点在凸多边形内+圆在凸多边形内)
  10. hdu 1147(线段相交)