CUDA系列一、CUDA简介
CUDA系列一、CUDA简介
一、概述
本人由于工作中经常使用CUDA进行数据处理,深知道学习CUDA的过程并不轻松,因此,我决定开启这个CUDA系列文章,希望能将自己的所学、所感悟、所悟分享出来,后续我将持续输出,从基础概念到进阶应用,带你一步步掌握CUDA这门强大的技术,也算是给自己的学习之路留下一份记录。
维基百科中是这样对CUDA进行描述的:CUDA(Compute Unified Devices Architectured,统一计算架构)是由英伟达(NVIDIA)所推出的一种软硬件集成技术,是该公司对于GPGPU的正式名称。透过这个技术,用户可利用NVIDIA的GPU进行图像处理之外的运算,亦是首次可以利用GPU作为C-编译器的开发环境。
通俗的讲,CUDA就是直接能让开发者利用GPU的强大算力进行大规模的并行计算,那么CPU和GPU运算上有什么区别呢,请看下方CPU和GPU的硬件架构示意图
一块典型的CPU拥有少数几个快速的计算核心,而一个典型的GPU拥有几百到几千个不那么快速的计算核心,如下图,黄色是控制器,绿色是算数逻辑单元,橙色是存储器,CPU和GPU之间通过PCIe总线连接通信。
之所以如此设计,是由于其对应于不同的应用场景,CPU需要很强的通用性来处理各种不同的数据类型,同时又要逻辑判断引入大量的分支跳转和中断处理,所以CPU的更多晶体管用于数据缓存和流程控制。而GPU则是用于处理类型高度统一,相互无依存的大规模数据,所以更多的晶体管用于算数逻辑单元。
二、CUDA +Visual Studio环境配置
工欲利其器,必先善其事,想要写好代码,环境的配置是第一步。
1、确认硬件支持,确保电脑配置NVIDIA的GPU,且GPU的计算能力符合CUDA要求,可在NVIDIA官网查询对应GPU的计算能力(一般来说现在绝大多数的N卡都是支持CUDA的)。
2、Visual Studio安装,需要注意的是如果你没有安装过Visual Studio,需要先安装Visual Studio再安装CUDA,否则环境配置会出现一些问题,修改起来较为麻烦,已经安装好了CUDA但是没安装Visual Studio的也可以重新安装一下CUDA来解决。 Visual Studio可以从官网 https://visualstudio.microsoft.com/zh-hans/ 中下载安装,也可以从其他可靠渠道下载安装。
3、CUDA安装,CUDA官方安装教程 https://docs.nvidia.com/cuda/cuda-installation-guide-microsoft-windows/index.html
4、安装完成后可以在cmd或PowerShell界面上输入nvidia-smi验证,当出现如下界面的时候说明CUDA安装成功,上面显示了你的显卡型号,利用率等一些信息
三、 CUDA的核心概念
3.1 CUDA线程层次结构
线程:线程是CUDA中最基本的执行单元,每个线程都可以独立执行相同的核函数,但是处理的数据元素不同。
线程块:由多个线程组成,线程块内的线程可以通过共享内存和同步机制进行高效合作。
网格:由多个线程块组成,是CUDA并行执行的最高层次结构。线程的组织结构由执行配置 <<<grid, block >>> 决定,分别是网络大小和线程块大小,网格和线程块定义可以如下
dim3 block(32, 32);
dim3 grid(1024, 1024);
表示线程块的总大小为32x32=1024,网格大小为1024x1024,需要注意的是线程块的总大小不能超过1024。
3.2 编程模型
CUDA编程模型是一种基于GPU并行计算的模型,主要包含几个关键要素。
主机:指CPU及其内存,负责调用传统的串行代码比如调用核函数、处理GPU结果等。
设备:指GPU及其内存,用于执行并行的核函数。
核函数:是在GPU执行并行的函数,用 global 声明,并使用3.1中所说的<<<grid, block >>>分配线程数。
3.3 内存模型
全局内存:所有线程都可以访问,容量大,速度相对较慢
共享内存:位于每个SM上,每个线程块有独立的共享内存空间,同一个线程块中的线程可以快速访问,访问效率高于全局内存。
常量内存:在核函数执行期间只读,数据在所有线程共享,访问效率较高。
纹理内存:主要用于对内存中的数据进行采样,具有特殊的硬件差值功能。
本地内存:每个线程独有,用于存储线程私有临时数据,当局部变量无法存放在寄存器中时会使用本地内存。
3.4 流与并发
流的并行执行:多个流可以在GPU上并行执行,不同流中的操作可以重叠进行,实现计算和数据传输的并行,提高整体性能。
流内与流间同步:流内通过事件可以实现操作之间的精确同步,确保某些操作在其他操作完成后再执行;流间也可以通过事件进行同步,协调不同流之间的执行顺序和数据依赖关系。
注。1
本文仅供学习参考,未经允许,拒绝转载或者用作他用。