CUDA学习笔记(四)GPU架构
GPU架构
SM(Streaming Multiprocessors,流式多处理器)是GPU架构中非常重要的部分,GPU硬件的并行性就是由SM决定的。
以Fermi架构为例,其包含以下主要组成部分:
- CUDA cores
- Shared Memory/L1Cache
- Register File
- Load/Store Units
- Special Function Units
- Warp Scheduler
GPU中每个SM都设计成支持数以百计的线程并行执行,并且每个GPU都包含了很多的SM,所以GPU支持成百上千的线程并行执行,当一个kernel启动后,thread会被分配到这些SM中执行。大量的thread可能会被分配到不同的SM,但是同一个block中的thread必然在同一个SM中并行执行。
CUDA采用Single Instruction Multiple Thread(SIMT)的架构来管理和执行thread,这些thread以32个为单位组成一个单元,称作warps。warp中所有线程并行的执行相同的指令。每个thread拥有它自己的instruction address counter和状态寄存器,并且用该线程自己的数据执行指令。
SIMT和SIMD(Single Instruction, Multiple Data)类似,SIMT应该算是SIMD的升级版,更灵活,但效率略低,SIMT是NVIDIA提出的GPU新概念。二者都通过将同样的指令广播给多个执行官单元来实现并行。一个主要的不同就是,SIMD要求所有的vector element在一个统一的同步组里同步的执行,而SIMT允许线程们在一个warp中独立的执行。SIMT有三个SIMD没有的主要特征:
- 每个thread拥有自己的instruction address counter
- 每个thread拥有自己的状态寄存器
- 每个thread可以有自己独立的执行路径
更细节的差异可以看这里。
一个block只会由一个SM调度,block一旦被分配好SM,该block就会一直驻留在该SM中,直到执行结束。一个SM可以同时拥有多个block。下图显示了软件硬件方面的术语:
需要注意的是,大部分thread只是逻辑上并行,并不是所有的thread可以在物理上同时执行。这就导致,同一个block中的线程可能会有不同步调。
并行thread之间的共享数据回导致竞态:多个线程请求同一个数据会导致未定义行为。CUDA提供了API来同步同一个block的thread以保证在进行下一步处理之前,所有thread都到达某个时间点。尽管如此,我们是没有什么原子操作来保证block内部的同步的。
同一个warp中的thread可以以任意顺序执行,active warps被SM资源限制。当一个warp空闲时,SM就可以调度驻留在该SM中另一个可用warp。在并发的warp之间切换是没什么消耗的,因为硬件资源早就被分配到所有thread和block,所以该新调度的warp的状态已经存储在SM中了。
SM可以看做GPU的心脏,寄存器和共享内存是SM的稀缺资源。CUDA将这些资源分配给所有驻留在SM中的thread。因此,这些有限的资源就使每个SM中active warps有非常严格的限制,也就限制了并行能力。所以,掌握部分硬件知识,有助于CUDA性能提升。
Fermi架构
Fermi是第一个完整的GPU计算架构。
- 512个accelerator cores即所谓CUDA cores(包含ALU(Arithmetic Logical Unit ,算术逻辑部件运算器)和FPU(Float Point Unit,浮点运算单元))
- 16个SM,每个SM包含32个CUDA core
- 六个384位 GDDR5 DRAM,支持6GB global on-board memory
- GigaThread engine(图左侧)将thread blocks分配给SM调度
- 768KB L2 cache
- 每个SM有16个load/store单元,允许每个clock cycle为16个thread(即所谓half-warp,不过现在不提这个东西了)计算源地址和目的地址
- Special function units(SFU)用来执行sin cosine 等
- 每个SM两个warp scheduler(warp 程序调度)两个instruction dispatch unit(指令调度单位),当一个block被分配到一个SM中后,所有该block中的thread会被分到不同的warp中。
- Fermi(compute capability 2.x)每个SM同时可处理48个warp共计1536个thread。
每个SM由一下几部分组成:
- 执行单元(CUDA cores)
- 调度分配warp的单元
- shared memory,register file,L1 cache
Kepler 架构
Kepler相较于Fermi更快,效率更高,性能更好。
- 15个SM
- 6个64位memory controller
- 192个单精度CUDA cores,64个双精度单元,32个SFU,32个load/store单元(LD/ST)
- 增加register file到64K
- 每个Kepler的SM包含四个warp scheduler、八个instruction dispatchers,使得每个SM可以同时issue(发布)和执行四个warp。
- Kepler K20X(compute capability 3.5)每个SM可以同时调度64个warp共计2048个thread。
Dynamic Parallelism
Dynamic Parallelism(动态并行)是Kepler的新特性,允许GPU动态的启动新的Grid。有了这个特性,任何kernel内都可以启动其它的kernel了。这样直接实现了kernel的递归以及解决了kernel之间数据的依赖问题。也许D3D中光的散射可以用这个实现。
Hyper-Q
Hyper-Q是Kepler的另一个新特性,增加了CPU和GPU之间硬件上的联系,使CPU可以在GPU上同时运行更多的任务。这样就可以增加GPU的利用率减少CPU的闲置时间。Fermi依赖一个单独的硬件上的工作队列来从CPU传递任务给GPU,这样在某个任务阻塞时,会导致之后的任务无法得到处理,Hyper-Q解决了这个问题。相应的,Kepler为GPU和CPU提供了32个工作队列。
不同arch的主要参数对比
CUDA学习笔记(四)GPU架构相关推荐
- 深度学习(三十六)异构计算CUDA学习笔记(1)
异构计算CUDA学习笔记(1) 原文地址:http://blog.csdn.net/hjimce/article/details/51506207 作者:hjimce 近日因为感觉自己在深度学习工程化 ...
- Cuda学习笔记(一)——sm流处理器簇对blocks的调度策略
由于GPU目前在各行各业的广泛应用,无论是深度学习.大数据.云计算等都离不开GPU的并行加速,前阵子自学了Cuda-c编程,希望将来的研究工作能够用得上. Cuda系列总共有4篇,这里主要用于记录本人 ...
- CUDA学习笔记(持续更新——蜗速)
CUDA学习笔记(持续更新--蜗速) 1.CUDA 程序实现流程如下 2.内存管理 3.核函数 4.全局数据访问唯一索引 5.设备管理 附录代码 1.CUDA 程序实现流程如下 将数据从CPU内存拷贝 ...
- C#可扩展编程之MEF学习笔记(四):见证奇迹的时刻
前面三篇讲了MEF的基础和基本到导入导出方法,下面就是见证MEF真正魅力所在的时刻.如果没有看过前面的文章,请到我的博客首页查看. 前面我们都是在一个项目中写了一个类来测试的,但实际开发中,我们往往要 ...
- CUDA学习笔记之 CUDA存储器模型
CUDA学习笔记之 CUDA存储器模型 标签: cuda存储bindingcache编程api 2010-12-14 01:33 1223人阅读 评论(0) 收藏 举报 分类: CUDA(26) GP ...
- CUDA学习笔记之程序优化
CUDA学习笔记之程序优化 标签: cuda优化conflict存储算法数学计算 2010-01-05 17:18 5035人阅读 评论(4) 收藏 举报 分类: CUDA(6) 版权声明:本文为博主 ...
- cuda学习笔记5——CUDA实现图像形态学腐蚀、膨胀
cuda学习笔记5--CUDA实现图像形态学腐蚀.膨胀 代码 linux如何编译cuda和opencv代码 耗时情况 代码 #include "cuda_runtime.h" #i ...
- Unity3D学习笔记8——GPU实例化(3)
文章目录 1. 概述 2. 详论 2.1. 自动实例化 2.2. MaterialPropertyBlock 3. 参考 1. 概述 在前两篇文章<Unity3D学习笔记6--GPU实例化(1) ...
- motan学习笔记 二 motan架构分析
motan学习笔记 一 微博轻量级RPC框架Motan motan学习笔记 二 motan架构分析 motan学习笔记 三 motan Demo 分析 motan学习笔记 四 motan Demo 之 ...
- MySQL高级学习笔记(四)
文章目录 MySQL高级学习笔记(四) 1. MySql中常用工具 1.1 mysql 1.1.1 连接选项 1.1.2 执行选项 1.2 mysqladmin 1.3 mysqlbinlog 1.4 ...
最新文章
- Redis 笔记(12)— 单线程架构(非阻塞 IO、多路复用)和多个异步线程
- Sybase IQ导出文件的几种方式
- OCQ亮相中国移动办公峰会 荣获2017中国移动办公创新品牌
- 初识 Knative: 跨平台的 Serverless 编排框架
- python3 多重列表推导式
- MySQL实战课程---通过录像手把手带您学会当前互联网流行架构
- Python基础:对象的深拷贝和浅拷贝的区别
- spark-sql执行时报错:
- spring-boot注解详解(七)
- 携程Apollo(阿波罗)配置中心在.NET Core项目快速集成
- java cxf 调用wcf接口_JAVA 调用 WCF 服务流程
- Nginx快速搭建和基本使用
- java 面向对象继承的思想_Java面向对象思想!
- 腾讯广告算法大赛 | 第三周周冠军心得分享
- 初学SQL Server 2016
- 5G无线技术基础自学系列 | 5G组网方式
- flutter友盟统计
- [js插件开发教程]定制一个手风琴插件(accordion)
- 混合模式程序集是针对“v1.1.4322”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集。
- [软件工程] 面向对象分析
热门文章
- Freyja2版本对分库分表的处理方式
- 如何在腾讯云服务器部署web项目
- 生活计算机的模拟环境中,惊人发现:人类生活在高等文明创建的模拟环境中!...
- 51单片机 程序 红外发射 红外接收 红外双机通信 红外遥控器 控制 灯 系统 proteus 仿真
- 11、权重残差图、RLE和NUSE
- DPDK NFV 性能提升
- 【题解】LuoGu5369:[PKUSC2018]最大前缀和
- popperjs V2 之应用库 tippy.js 源码阅读
- 【Python基础】制作一个汇率换算程序
- 面试时如何做自我介绍?聪明的应聘者只聚焦1点