CUDA 学习之路(1)
来源:互联网 发布:怎么用国外网络 编辑:程序博客网 时间:2024/06/10 17:47
什么是cuda?
随着显卡的发展,GPU越来越强大,而且GPU为显示图像做了优化。在计算上已经超越了通用的CPU。如此强大的芯片如果只是作为显卡就太浪费了,因此NVidia推出CUDA,让显卡可以用于图像渲染(渲染可以简单理解为绘画)和计算以外的目的,这里提到的通用并行计算。
CUDA,Compute Unified Device Architecture的简称,是由NVIDIA公司创立的基于他们公司生产的图形处理器GPUs(Graphics Processing Units,可以通俗的理解为显卡)的一个通用并行计算平台。
开发人员可以通过调用CUDA的API,来进行并行编程,达到高性能计算目的。NVIDIA公司为了吸引更多的开发人员,对CUDA进行了编程语言扩展,如CUDA C/C++,CUDA Fortran语言。
计算行业正在从只使用CPU的“中央处理”向CPU与GPU并用的“协同处理”发展。CUDA的编程模型,是想在应用程序中充分利用CPU和GPU各自的优点。CPU负责逻辑性强的事务处理,GPU负责高度线程化的并行计算。
什么类型的程序适合在GPU上运行?
(1)计算密集型的程序。所谓计算密集型(Compute-intensive)的程序,就是其大部分运行时间花在了寄存器运算上,寄存器的速度和处理器的速度相当,从寄存器读写数据几乎没有延时。可以做一下对比,读内存的延迟大概是几百个时钟周期;读硬盘的速度就不说了,即便是SSD, 也实在是太慢了。
(2)易于并行的程序。GPU其实是一种SIMD(Single Instruction Multiple Data)架构, 他有成百上千个核,每一个核在同一时间最好能做同样的事情。
CPU和GPU的设计区别?
GPU采用了数量众多的计算单元和超长的流水线,但只有非常简单的控制逻辑并省去了Cache。而CPU不仅被Cache占据了大量空间,而且还有有复杂的控制逻辑和诸多优化电路,相比之下计算能力只是CPU很小的一部分
计算单元可以分成:通用计算单元(CPU),专用计算单元(GPU/DSP)等
CPU 和 GPU之间浮点运算能力之所以存在很大差异,原因就在于CPU具有复杂的控制逻辑和大容量的缓存,适合进行控制转移,处理分支繁杂的任务,而GPU专为计算密集型、高度并行化的计算而设计。因而GPU具有更多ALU(算术运算单元)和高显存带宽的设计能使更多晶体管用于数据处理,而非数据缓存和流控制。更具体地说,GPU专用于解决可表示为数据并行计算的问题——在许多数据元素上并行执行的程序,具有极高的计算密度(数学运算与存储器运算的比率)。由于所有数据元素都执行相同的程序,因此对精密流控制的要求不高;由于在许多数据元素上运行,且具有较高的计算密度,因而可通过计算隐藏存储器访问延迟,而不必使用较大的数据缓存。如下图所示。
什么是异构计算?
简单点说,由一个或若干个通用计算单元加一个或若干个专用计算单元构建的系统就是异构计算系统,由两者协同起来共同执行通用计算任务就是异构计算,目前在PC上最常见的组合就是CPU+GPU。
异构计算的目的一般是加速和节能,过去依靠工艺和频率来提高CPU的计算性能,目前已经遇到了瓶颈,加速的任务已经由过去依赖工艺和功耗转向依靠架构的改变。在过去GPU只能执行图形任务,不能执行通用计算,所以还称不上异构计算,现在的GPU已经具备了执行通用计算的能力,GPU和CPU协同工作就组成了一个异构计算系统。
主机
将CPU及系统的内存(内存条)称为主机。
设备
将GPU及GPU本身的显示内存称为设备。
线程(Thread)
一般通过GPU的一个核进行处理。(可以表示成一维,二维,三维,具体下面再细说)。
线程块(Block)
1. 由多个线程组成(可以表示成一维,二维,三维,具体下面再细说)。
2. 各block是并行执行的,block间无法通信,也没有执行顺序。
3. 注意线程块的数量限制为不超过65535(硬件限制)。
线程格(Grid)
由多个线程块组成(可以表示成一维,二维,三维,具体下面再细说)。
线程束
在CUDA架构中,线程束是指一个包含32个线程的集合,这个线程集合被“编织在一起”并且“步调一致”的形式执行。在程序中的每一行,线程束中的每个线程都将在不同数据上执行相同的命令。
核函数(Kernel)
1. 在GPU上执行的函数通常称为核函数。
2. 一般通过标识符__global__修饰,调用通过<<<参数1,参数2>>>,用于说明内核函数中的线程数量,以及线程是如何组织的。
3. 以线程格(Grid)的形式组织,每个线程格由若干个线程块(block)组成,而每个线程块又由若干个线程(thread)组成。
4. 是以block为单位执行的。
5. 叧能在主机端代码中调用。
6. 调用时必须声明内核函数的执行参数。
7. 在编程时,必须先为kernel函数中用到的数组或变量分配好足够的空间,再调用kernel函数,否则在GPU计算时会发生错误,例如越界或报错,甚至导致蓝屏和死机。
- CUDA 学习之路(1)
- CUDA学习之旅2009.11.9---《深入浅出CUDA》学习1
- CUDA学习--内存处理之概述(1)
- CUDA学习之二
- CUDA学习之三
- CUDA学习之四
- CUDA之学习资料
- CUDA之学习资料
- CUDA学习(1)--CUDA简介
- CUDA学习笔记之 CUDA存储器模型
- CUDA学习笔记之 CUDA存储器模型
- CUDA学习之CUDA程序优化
- CUDA学习笔记之CUDA初步理解
- CUDA学习笔记之CUDA存储器模型
- CUDA学习笔记之 CUDA存储器模型
- CUDA学习笔记之 CUDA存储器模型
- CUDA学习笔记之 CUDA存储器模型
- CUDA学习笔记之 CUDA存储器模型
- Android studio与windows系统兼容问题
- js+php小错误
- Nginx+Tomcat搭建高性能负载均衡集群
- BZOJ 2150: 部落战争 二分图最小路径覆盖
- 【总结】Bandit算法与推荐系统
- CUDA 学习之路(1)
- 安装mysql5.7.18
- 谨以此文献给正在面临选择的你
- 前端面试题<1>
- 关于我博客中翻译文章的说明
- 如何退出vim编辑器
- 大众点评 cat 项目访问监控 部署(windows环境)
- <编程之法>1.1 字符串旋转
- 【Linux】线程(概念、特点、线程控制代码--创建/等待/终止、分离与结合属性)