CUDA编程(一) —— 相关概念基础知识
CUDA(Compute Unified Device Architecture)的中文全称为计算统一设备架构。做图像视觉领域的同学多多少少都会接触到CUDA,毕竟要做性能速度优化,CUDA是个很重要的工具,CUDA是做视觉的同学难以绕过的一个坑,必须踩一踩才踏实。CUDA编程真的是入门容易精通难,具有计算机体系结构和C语言编程知识储备的同学上手CUDA编程应该难度不会很大
GPU架构
现在的计算机体系架构中,要完成CUDA并行计算,单靠GPU一人之力是不能完成计算任务的,必须借助CPU来协同配合完成一次高性能的并行计算任务。
一般而言,并行部分在GPU上运行,串行部分在CPU运行,这就是异构计算。具体一点,异构计算的意思就是不同体系结构的处理器相互协作完成计算任务。CPU负责总体的程序流程,而GPU负责具体的计算任务,当GPU各个线程完成计算任务后,我们就将GPU那边计算得到的结果拷贝到CPU端,完成一次计算任务。
所以应用程序利用GPU实现加速的总体分工就是:密集计算代码(约占5%的代码量)由GPU负责完成,剩余串行代码由CPU负责执行。
CUDA线程模型
我们都知道,线程是程序执行的最基本单元,CUDA的并行计算就是通过成千上万个线程的并行执行来实现的。下面的结构图说明了GPU的不同层次的结构。
CUDA的线程模型从小往大来总结就是:
①Thread: 线程,并行的基本单位
②Thread Block: 线程块,互相合作的线程组。
线程块有如下几个特点:
- 允许彼此同步
- 可以通过共享内存快速交换数据
- 以1维、2维或3维组织
③Grid: 一组线程块
- 以1维、2维组织
- 共享全局内存
④Kernel:在GPU上执行的核心程序,这个kernel函数是运行在某个Grid上的。
- One kernel 对应 One Grid
每一个block和每个thread都有自己的ID,我们通过相应的索引找到相应的线程和线程块。
- threadIdx,blockIdx
- Block ID: 1D or 2D
- Thread ID: 1D, 2D or 3D
理解kernel,必须要对kernel的线程层次结构有一个清晰的认识。
首先GPU上很多并行化的轻量级线程。kernel在device上执行时实际上是启动很多线程,一个kernel所启动的所有线程称为一个网格(grid),同一个网格上的线程共享相同的全局内存空间,grid是线程结构的第一层次,而网格又可以分为很多线程块(block),一个线程块里面包含很多线程,这是第二个层次。线程两层组织结构如上图所示,这是一个gird和block均为2-dim的线程组织。grid和block都是定义为dim3类型的变量,dim3可以看成是包含三个无符号整数(x,y,z)成员的结构体变量,在定义时,缺省值初始化为1。因此grid和block可以灵活地定义为1-dim,2-dim以及3-dim结构,kernel调用时也必须通过执行配置<<<grid, block>>>来指定kernel所使用的网格维度和线程块维度。
举个例子,我们以上图为例,分析怎么通过<<<grid,block>>>>这种标记方式索引到我们想要的那个线程。CUDA的这种<<<grid,block>>>其实就是一个多级索引的方法,第一级索引是(grid.xIdx, grid.yIdy),对应上图例子就是(1, 1),通过它我们就能找到了这个线程块的位置,然后我们启动二级索引(block.xIdx, block.yIdx, block.zIdx)来定位到指定的线程。这就是我们CUDA的线程组织结构
SP & SM
①SP:最基本的处理单元,streaming processor,也称为CUDA core。
最后具体的指令和任务都是在SP上处理的。GPU进行并行计算,也就是很多个SP同时做处理。②SM:多个SP加上其他的一些资源组成一个streaming multiprocessor。也叫GPU大核。
SM还包含其他资源如warp scheduler,register,shared memory等。SM可以看做GPU的心脏(对比CPU核心),register和shared memory是SM的稀缺资源。CUDA将这些资源分配给所有驻留在SM中的threads。因此,这些有限的资源就使每个SM中active warps有非常严格的限制,也就限制了并行能力。
简而言之,SP是线程执行的硬件单位,SM中包含多个SP,一个GPU可以有多个SM(比如16个),最终一个GPU可能包含有上千个SP。这么多核心“同时运行”,速度可想而知,这个引号只是想表明实际上,软件逻辑上是所有SP是并行的,但是物理上并不是所有SP都能同时执行计算(比如我们只有8个SM却有1024个线程块需要调度处理),因为有些会处于挂起,就绪等其他状态,这有关GPU的线程调度。
每个SM包含的SP数量依据GPU架构而不同,Fermi架构GF100是32个,GF10X是48个,Kepler架构都是192个,Maxwell都是128个。
下面从硬件角度和软件角度展示CUDA的线程模型。
- 每个线程由每个线程处理器(SP)执行
- 线程块由多核处理器(SM)执行
- 一个kernel其实由一个grid来执行,一个kernel一次只能在一个GPU上执行
block是软件概念,一个block只会由一个sm调度,程序员在开发时,通过设定block的属性,告诉GPU硬件,我有多少个线程,线程怎么组织。而具体怎么调度由sm的warps scheduler负责,block一旦被分配好SM,该block就会一直驻留在该SM中,直到执行结束。一个SM可以同时拥有多个blocks,但需要序列执行。
GPU内部的硬件架构
CUDA内存模型
CUDA中的内存模型分为以下几个层次:
- 每个线程都用自己的registers(寄存器)
- 每个线程都有自己的local memory(局部内存)
- 每个线程块内都有自己的shared memory(共享内存),所有线程块内的所有线程共享这段内存资源
- 每个grid都有自己的global memory(全局内存),不同线程块的线程都可使用
- 每个grid都有自己的constant memory(常量内存)和texture memory(纹理内存),),不同线程块的线程都可使用
线程访问这几类存储器的速度是register > local memory >shared memory > global memory
下面这幅图表示就是这些内存在计算机架构中的所在层次。
https://www.cnblogs.com/skyfsm/p/9673960.html
CUDA编程(一) —— 相关概念基础知识相关推荐
- c #include如何找到文件_UNIX系统上程序员需要掌握的C编程环境的基础知识
这是一份非常简短的文档,可以帮助你熟悉UNIX系统上C编程环境的基础知识.它不是面面俱到或特别详细,只是给你足够的知识让你继续学习. 关于编程的几点一般建议:如果想成为一名专业程序员,需要掌握的不 ...
- 数控技术复习(二):数控编程必备的基础知识
文章首发于个人博客,欢迎访问:数控技术复习(二):数控编程必备的基础知识 数控机床加工零件:零件图代码->程序单->控制介质->数控装置->伺服电机->机床自动加工.从零 ...
- PLC编程入门-01基础知识介绍
PLC编程入门-01基础知识介绍 PLC的组成结构 PLC编程语言: PLC输入输出的特点 输入 输出 PLC的组成结构 简图 明细图 CPU:控制器和运算器本身就是CPU主要组成部分,和PC的CPU ...
- cuda编程以及GPU基本知识
目录 CPU与GPU的基本知识 CPU特点 GPU特点 GPU vs. CPU 什么样的问题适合GPU? GPU编程 CUDA编程并行计算的整体流程 CUDA编程术语:硬件 CUDA编程术语:内存模型 ...
- day01--java基础编程:计算机基础知识 ,java语言概述,java开发环境搭建,eclipse概述,创建简单java项目,JDK JRE JVM的关系,java开发中的命名规范,编程风格
1 Day01–Java开发环境+HelloWorld 1.1 计算机基础知识 资料下载网址:刘沛霞 18600949004 code.tarena.com.cn tarenacode code_20 ...
- 《openssl编程》之基础知识
第一章 基础知识 1.1 对称算法 对称算法使用一个密钥.给定一个明文和一个密钥,加密产生密文,其长度和明文大致相同.解密时,使用读密钥与加密密钥相同. 对称算法主要有四种加密模式: (1) 电子密码 ...
- tcp丢包率_网络编程 | TCP/IP基础知识
在2017年10月深圳 Cocos 沙龙上,有幸结识了社区中大名顶顶的Colin,Shawn在论坛上第一次看到Colin的团队用CocosCreator制作的<热血暗黑>时就被深深地震撼到 ...
- UNIX环境高级编程——1.UNIX基础知识
UNIX基础知识 UNIX体系结构 严格意义上来说,可以将操作系统定义为一种软件,控制计算机硬件资源,提供程序运行环境.通常把这种软件成为内核. 内核的接口被成为系统调用(system call).公 ...
- 【Linux网络编程】网络基础知识
00. 目录 文章目录 00. 目录 01. 网络基础知识 02. 附录 01. 网络基础知识 1)什么是链接? 链接是指两个设备之间的连接.它包括用于一个设备能够与另一个设备通信的电缆类型和协议. ...
最新文章
- HP 服务器使用 SmartStart CD 引导安装 windows 2008 操作系统
- vue.js 发布后路径引用问题
- linux下json数据解析,Linux下使用jq简单解析json的方法
- 【idea】IDEA中TODO以及FIXME等关键字不高亮显示修复
- 1.5(java学习笔记)this关键字
- SecureCRT 绝佳配色方案
- 缺失索引自动创建语句
- php抓取访客国旗,爬取世界各国和地区数据国旗和国徽的高清图标和图片
- mujoco win7下载安装
- Fastdb安装与使用
- 动态规划法 第5关:矩阵连乘问题
- centos7 C++ 使用libjpeg-turbo (让jpg 转bmp以及bmp转jpg)
- android停止蓝牙音乐服务,蓝牙音乐播放状态一直为暂停态
- leedcode每日一题:860. 柠檬水找零
- 系统分析与设计期末课程总结
- 4G低功耗摄像头秒级快速唤醒休眠应用方案
- 什么是G.654E光纤?
- V2X前装量产的现状与挑战 | 车联网百家谈
- 打印机总提示更换墨盒该怎么办?
- Source Maps介绍