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编程(一) —— 相关概念基础知识相关推荐

  1. c #include如何找到文件_UNIX系统上程序员需要掌握的C编程环境的基础知识

    ​ 这是一份非常简短的文档,可以帮助你熟悉UNIX系统上C编程环境的基础知识.它不是面面俱到或特别详细,只是给你足够的知识让你继续学习. 关于编程的几点一般建议:如果想成为一名专业程序员,需要掌握的不 ...

  2. 数控技术复习(二):数控编程必备的基础知识

    文章首发于个人博客,欢迎访问:数控技术复习(二):数控编程必备的基础知识 数控机床加工零件:零件图代码->程序单->控制介质->数控装置->伺服电机->机床自动加工.从零 ...

  3. PLC编程入门-01基础知识介绍

    PLC编程入门-01基础知识介绍 PLC的组成结构 PLC编程语言: PLC输入输出的特点 输入 输出 PLC的组成结构 简图 明细图 CPU:控制器和运算器本身就是CPU主要组成部分,和PC的CPU ...

  4. cuda编程以及GPU基本知识

    目录 CPU与GPU的基本知识 CPU特点 GPU特点 GPU vs. CPU 什么样的问题适合GPU? GPU编程 CUDA编程并行计算的整体流程 CUDA编程术语:硬件 CUDA编程术语:内存模型 ...

  5. day01--java基础编程:计算机基础知识 ,java语言概述,java开发环境搭建,eclipse概述,创建简单java项目,JDK JRE JVM的关系,java开发中的命名规范,编程风格

    1 Day01–Java开发环境+HelloWorld 1.1 计算机基础知识 资料下载网址:刘沛霞 18600949004 code.tarena.com.cn tarenacode code_20 ...

  6. 《openssl编程》之基础知识

    第一章 基础知识 1.1 对称算法 对称算法使用一个密钥.给定一个明文和一个密钥,加密产生密文,其长度和明文大致相同.解密时,使用读密钥与加密密钥相同. 对称算法主要有四种加密模式: (1) 电子密码 ...

  7. tcp丢包率_网络编程 | TCP/IP基础知识

    在2017年10月深圳 Cocos 沙龙上,有幸结识了社区中大名顶顶的Colin,Shawn在论坛上第一次看到Colin的团队用CocosCreator制作的<热血暗黑>时就被深深地震撼到 ...

  8. UNIX环境高级编程——1.UNIX基础知识

    UNIX基础知识 UNIX体系结构 严格意义上来说,可以将操作系统定义为一种软件,控制计算机硬件资源,提供程序运行环境.通常把这种软件成为内核. 内核的接口被成为系统调用(system call).公 ...

  9. 【Linux网络编程】网络基础知识

    00. 目录 文章目录 00. 目录 01. 网络基础知识 02. 附录 01. 网络基础知识 1)什么是链接? 链接是指两个设备之间的连接.它包括用于一个设备能够与另一个设备通信的电缆类型和协议. ...

最新文章

  1. HP 服务器使用 SmartStart CD 引导安装 windows 2008 操作系统
  2. vue.js 发布后路径引用问题
  3. linux下json数据解析,Linux下使用jq简单解析json的方法
  4. 【idea】IDEA中TODO以及FIXME等关键字不高亮显示修复
  5. 1.5(java学习笔记)this关键字
  6. SecureCRT 绝佳配色方案
  7. 缺失索引自动创建语句
  8. php抓取访客国旗,爬取世界各国和地区数据国旗和国徽的高清图标和图片
  9. mujoco win7下载安装
  10. Fastdb安装与使用
  11. 动态规划法 第5关:矩阵连乘问题
  12. centos7 C++ 使用libjpeg-turbo (让jpg 转bmp以及bmp转jpg)
  13. android停止蓝牙音乐服务,蓝牙音乐播放状态一直为暂停态
  14. leedcode每日一题:860. 柠檬水找零
  15. 系统分析与设计期末课程总结
  16. 4G低功耗摄像头秒级快速唤醒休眠应用方案
  17. 什么是G.654E光纤?
  18. V2X前装量产的现状与挑战 | 车联网百家谈
  19. 打印机总提示更换墨盒该怎么办?
  20. Source Maps介绍

热门文章

  1. 信创操作系统--麒麟Kylin桌面版 (项目二 桌面环境)
  2. php手绘功能,手绘之于游戏,不仅仅是一种风格
  3. ISP(图像信号处理)算法概述、工作原理、架构、处理流程
  4. 【路径规划】基于蝙蝠算法的无人机三维路径规划matlab源码
  5. ALTER TABLE 表结构变更
  6. 安卓系统好用的手机便签APP
  7. Delphi 11.2 安装 CnWizards 组件包
  8. 华为OpenEuler体验系列(16)-显卡驱动安装以及CUDA
  9. LoadCursor 函数
  10. 数据格式(计算机组成原理)