第一篇 CUDA基础

基本概念

  • 主机: CPU+内存的组合;
  • 设备: GPU+显存的组合;
  • 运行时API: "CUDA运行时API"是在"驱动API"的基础上封装而成的,简化CUDA的开发;
  • 驱动API: "CUDA驱动API”,相比于"运行时API"更接近于设备,可灵活运用设备的特性开发CUDA,可实现运行时API无法实现的功能;
  • warp:多处理器激活、管理、调度和执行并行任务的单位。计算能力2.x的设备warp为32个线程。未来的设备可能不同,可以通过内置变量warpSize查询;
  • bank:为了获得较高的存储器带宽,共享存储器被划分为多个大小相等的存储器模块,成为存储体,这些存储体叫做bank,可以同步访问;
  • 函数类型限定符: CUDA C中特有,用来修饰是主机函数、设备调用的设备函数、还是主机调用的设备函数,有__device__、globalhost
  • 变量类型限定符:修饰设备变量,有__device__、constantshared
  • thread: 设备中的线程,与主机中的线程是同一个概念;
  • block:线程块,由一组线程组成。一个线程块中的所有线程会在同一个多处理器上执行,一个多处理器上可以同时执行多个线程块;
  • grid:所有线程块组成的网格;
  • 计算能力:是Nvidia GPU不同架构的计算能力;
  • SIMT:单指令多线程,与单指令多数据SIMD类似。一个指令多个线程一同执行,实现程序的并行化;
  • 内置变量:有threadIdx, blockDim, blockIdx, gridDim, warpSize. threadIdx表示此线程在线程块中的位置,blockDim指线程块维度;blockIdx指线程块在网格中的位置;gridDim指线程块网格维度;warpSize指一个warp多少个线程;
  • 纹理: 纹理参考、纹理绑定、纹理获取;
  • CUDA数组:区别于线性存储器,对数据进行了对齐等的处理,包括一维、二维和三维。其中的数据为:一元、二元或四元组;

线程thread(寄存器/本地存储器)->线程块block(共享存储器)->线程块网格grid(常量存储器/全局存储器/纹理存储器);

运行时API

运用“运行时API”开发CUDA程序需要了解:初始化、设备管理、存储器管理、流管理、事件管理、纹理参考管理、OpenGL互操作和Direct3D互操作;

参考文档

驱动API

驱动API是一种基于句柄、命令式的API,大多数对象都通过不透明的句柄引用。运用“驱动API”开发CUDA程序需要了解:初始化、设备管理、上下文管理、模块管理、执行控制、存储器管理、流管理、事件管理、纹理参考管理、OpenGL互操作、Direct3D互操作。

参考文档

注意:Cuda不支持windows的默认远程登录客户端mstsc登入远程主机执行设备,需要远程登录主机执行CUDA设备,可使用VNC工具。

性能优化

主要:warp中减少控制指令、合理使用共享内存、防止共享内存bank冲突、单个线程中寄存器的使用的量、block中线程数、常量存储器的合理利用、线程对全局存储器的合理访问等。

  • 多处理器是以warp为单位处理线程的,有控制指令时,会执行完所有的控制指令对应的指令后才会继续执行下面的命令。例如,if/else语句两个方向的线程在同一个warp中,线程1执行if方向,线程2执行else方向,他们可能的执行顺序为:线程1执行if方向,2等待;线程1执行if方向完毕等待,2执行else方向;线程2执行else方向完毕,线程1和2共同执行后面的指令。
  • 共享内存属于片上缓存,比全局存储器的读写速度快。将一部分全局存储器上的数据放入共享内存中处理可有效提高性能。共享存储器的访问速度和寄存器差不多,大约读写4B的数据需要两个时钟周期。共享存储器的读取是以半warp为单位的,当半warp中所有的线程都访问同一个bank中同一块4B的数据时也不会发生bank冲突,称为广播访问,此时只访问一次bank。每个多处理器中的共享存储器大小是有限的,应按照block的大小分配合适的共享存储器。Block的大小会影响多处理器每次激活的block数。
  • 每个多处理器寄存器数量是有些的,而且在每个线程中寄存器是线程私有的。按照每个多处理器激活的线程数,合理分配寄存器。如果每个线程分配太多线程,则每个多处理器同时激活的线程数就会减少,从而影响并行效果。
  • Block中的线程数(NThread)也会影响每个多处理器同时激活的线程数。每个多处理器有最大同时激活线程数(NMThread),且每个多处理器有最大同时激活block数(NMBlock)。Block中的线程数满足:NThread >= NMThread / NMBlock会激活在一个多处理器中可激活的所有block。在其他资源可充分利用的情况下,多处理器上同时激活的线程数越多,效率越高。
  • 常量存储器也是带片上缓存的存储器。充分利用常量存储器可有效提升性能。
  • 最新的设备,全局存储器都带有片上缓存。可以利用多处理器处理线程的特性合理访问全局存储器的数据,可使更多数据命中。

原文地址:https://www.cnblogs.com/imagezy/p/9297946.html

时间: 2024-10-07 21:23:13

第一篇 CUDA基础的相关文章

第一篇 网站基础知识 第1章 网站架构及其演变过程

第1章 网站架构及其演变过程 1.1 软件的三大类型:单机类型.C/S类型.B/S类型 C/S结构图 B/S结构图 1.2 基础的结构并不简单 B/S结构网络传输的分解方式有两种:一种是标准的OSI参考模型,另一种是TCP/IP参考模型.它们的分层方式及对应关系如下图所示. 对于TCP/IP的4层模型可以简单地理解为: 网络接入层:将需要相互连接的节点接入网络中,从而为数据传输提供条件. 网络互联层:找到要传输数据的目标节点. 传输层:实际传输数据. 应用层:使用接收到的数据. TCP/IP参考

MyBATIS插件原理第一篇——技术基础(反射和JDK动态代理)(转)

在介绍MyBATIS插件原理前我们需要先学习一下一些基础的知识,否则我们是很难理解MyBATIS的运行原理和插件原理的. MyBATIS最主要的是反射和动态代理技术,让我们首先先熟悉它们. 1:Java反射技术 在Java中反射技术已经大行其道,通过不断的优化性能得到了巨大的提高,而反射技术使得Java的可配置性大大提高.让我们来写一个服务打印hello + 姓名. import java.lang.reflect.InvocationTargetException; import java.l

linux设备驱动第一篇:基础知识点

首先,我们知道驱动是内核的一部分,那么驱动在内核中到底扮演了什么角色呢? 设备驱动程序在内核中的角色:他们是一个个独立的"黑盒子",使某个特定的硬件响应一个定义良好的内部编程接口,这些接口完全隐藏了设备的工作细节.(说白了,驱动程序除了对外提供特定的接口外,任何实现细节对应用程序都是不可见的.)用户的操作通过一组标准化的调用执行,而这些调用独立于特定的驱动程序.驱动程序的任务是把这些标准化调用映射到实际硬件的设备特有操作上. 在编写驱动程序时,程序员应该特别注意下面这个概念:编写访问硬

Django 【第一篇】基础

一个小问题: 什么是根目录:就是没有路径,只有域名..url(r'^$') 补充一张关于wsgiref模块的图片 一.MTV模型 Django的MTV分别代表: Model(模型):和数据库相关的,负责业务对象与数据库的对象(ORM) Template(模板):放所有的html文件 模板语法:目的是将白变量(数据库的内容)如何巧妙的嵌入到html页面中 View(视图):负责业务逻辑,并在适当的时候调用Model和Template 此外,Django还有一个URL分发器.它的作用是将一个个URL

Python开发【第一篇】基础题目二

1 列表题 l1 = [11, 22, 33] l2 = [22, 33, 44] # a. 获取l1 中有,l2中没有的元素 for i in l1: if i not in l2: print(i) # 11 # b. 获取l2 中有,l1中没有的元素列表 for i in l2: if i not in l1: print(i) # 44 # c. 获取l1 和 l2 中内容相同的元素 for i in l1: if i in l2: print(i, end=" ") # 22

第一篇 网站基础知识 第2章 常见协议和标准

第2章 常见协议和标准 2.1 DNS协议 DNS协议的作用是将域名解析为IP.在Windows中可以使用nslookup命令来查看DNS解析的结果,如使用nslookup命令查看淘宝的解析记录的结果如图所示. 直接访问的DNS服务器叫做本地DNS服务器,本身没有域名和IP的对应关系,在发出请求的时候它会从主DNS服务器获取然后保存到缓存中,下次再有相同的域名请求时直接从缓存中获取就可以了. 2.2 TCP/IP协议与Socket IP协议是用来查找地址的,对应着网际互联层,TCP协议是用来规范

第一篇 网站基础知识 第3章 DNS的设置

第3章 DNS的设置 3.1 DNS解析 3.2 Windows 7设置DNS服务器 3.3Windows设置本机域名和IP的对应关系 在自己的电脑里也可以设置域名和IP的对应关系,具体设置是在C:\windows\system32\drivers\etc\hosts文件中,设置的格式是“IP+空格+域名”,一行一条记录(空格可以有多个),比如下面的设置: 127.0.0.1 localhost? 127.0.0.1 www.test.com? 123.123.123.123www.123.co

Python开发【第一篇】基础题目

1.求1-2+3-4+5.....99的所有数的和 n = 1 s = 0 while n<100: temp = n%2 if temp == 0: #偶数 s = s-n else: s = s+n n = n+1 print(s) 2.求1-100的所有数的和 n = 1 s = 0 while n < 101: s = s+n n = n+1 print(s) #一行代码搞定 print (sum(range(101))) 3.九九乘法表 for i in range(1,10): f

Eclipse插件开发 学习笔记 PDF 第一篇到第四篇 免分下载 开发基础 核心技术 高级进阶 综合实例

<<Eclipse插件开发 学习笔记>>,本书由浅入深.有重点.有针对性地介绍了Eclipse插件开发技术,全书分为4篇共24章.第一篇介绍Eclipse平台界面开发的基础知识.包含SWT控件的使用.界面布局.事件处理等内容:第二篇是插件开发核心技术,主要介绍插件开发的核心知识要点,包含行为(Action).视图(ViewPart).编辑器(Editor).透视图(Perspective)等10章的内容.第三篇主要讲述插件开发的高级内容,包含开发高级内容.富client平台技术(R