cuda入门知识点

  1. nvidia-smi是Nvidia系统管理接口(System Management Interface)的缩写,它是Nvidia GPU驱动程序附带的一个命令行工具,用于监控和管理Nvidia显卡在系统中的状态、性能和资源使用情况。nvidia-smi命令用于查询和监控 Nvidia 显卡状态,nvidia-smi -q查看详细信息。
  2. GPU不能进行单独计算,CPU+GPU组成异构计算架构。CPU起到控制作用,一般称为主机,GPU可以看做CPU的协处理器,一般称为设备。CPU和GPU都有动态随机存储器,CPU和GPU之间内存访问一般通过PCIe总线链接。
  3. .bashrc文件是Bash shell的一个配置文件,用于配置Bash shell的环境变量、别名、函数以及其他一些设置。它通常位于用户的家目录下,文件路径是~/.bashrc(~表示用户的家目录)。这个文件对当前用户有效,它会在用户登录时被加载,并在每次打开新的Bash终端时生效。在终端中执行source ~/.bashrc这个命令时,会读取并执行.bashrc文件中的所有配置,从而使得新的配置立即生效,而无需注销或重新启动终端。
  4. nvcc -V命令用于显示 Nvidia CUDA 编译器的版本信息,包括 CUDA 版本号、驱动版本号以及编译器构建信息等。
  5. lscpu可以查看当前cpu的核心数、线程、物理地址空间大小、虚拟地址空间大小等信息。
  6. cuda文件后缀名为.cu,在cuda文件中将cuda代码和C++代码写在一起,cuda编译器nvcc会编译cuda部分,而将C++代码交给gcc编译。
  7. 核函数:核函数在GPU上并行执行(这种并发是由GPU硬件自发执行的)。核函数用限定词__global__修饰(双下划线开头和结尾),返回值必须是void。核函数只能访问GPU内存(CPUGPU互相访问内存是通过PCIe总线进行的,CPUGPU是无法直接访问各自内存的),核函数不能使用变长参数,不能使用静态变量,不能使用函数指针,核函数具有异步性。核函数不支持C++iostream,只能用Cprintf打印输出。在调用核函数时,需要明确指定设备的线程模型,如:gpu_func<<<4, 4>>>(),第一个数字指的是线程块个数,第二个数字指的是每个线程块的线程数量。
  8. NVIDIA显卡架构:Fermi 架构(发布于 2010 年)、Kepler 架构(发布于 2012 年)、Maxwell 架构(发布于 2014 年)、Pascal 架构(发布于 2016 年)、Turing 架构(发布于 2018 年)、Ampere 架构(发布于 2020 年)
  9. GPUs负责并行计算:并行计算能力上,GPUs比CPUs强十倍以上;CPUs负责串行计算:串行计算能力上,CPUs比GPUs强十倍以上。
  10. CUDA C:是一种基于NVIDIAGPU架构的并行计算平台,是C/C++的扩展。使用CUDA C可以直接在GPU上编写并行程序,通过CUDA API访问GPU设备,开发者需要手动编写CUDA kernel函数来实现并行计算,然后在主机代码中调用这些 kernel 函数来执行GPU加速的计算任务,适用于需要对GPU进行细粒度控制、进行高度优化或实现特定算法的程序,如深度学习框架、科学计算、图形处理等。CUDA LibrariesCUDA Libs):是 NVIDIA 提供的一系列GPU加速库,用于实现各种常见的数学运算、图像处理、并行计算等功能,开发者可以通过调用CUDA Libraries中提供的函数来实现对GPU的加速,无需编写复杂的CUDA kernel代码,大大简化了GPU加速的实现流程,适用于需要利用GPU加速实现特定功能的程序,如线性代数运算等。OpenACC:是一种并行编程模型,适用于多核CPUGPU,通过指令注释实现并行化处理,适合于对代码修改较少的情况。Thrust是一个高级的并行编程库,基于CUDA C/C++,提供了高级算法和数据结构的实现,适合于快速开发并行程序,尤其是对算法和数据结构的高级抽象需求较大的情况。
  11. 线程层次化结构:线程(Thread):由CUDA运行时分发(通过threadIdx识别);线程束(Warp):一个最多32个线程的调度单元,在一个线程束中,所有的线程按照单指令多线程(SIMT)方式执行;也就是说,所有线程都执行相同的指令,每个线程在私有数据上进行操作;线程块(Block):一个由用户定义的1到512个线程组(通过 blockIdx 识别),相对于其他线程块,每个线程块能以任何顺序执行,硬件可以随时自由地将线程块分配给任何处理器;线程网格(Grid):包含一个或多个线程块,为每个CUDA核函数创建一个网格。
  12. SM是指Streaming Multiprocessor(流处理器),是NVIDIA GPU中的基本执行单元。SM扮演着调度和执行并行计算任务的角色,它包含了多个CUDA 核心(CUDA Cores)以及一些共享的硬件资源,如寄存器文件、共享内存等。线程块内所有线程分配到同一个SM中执行,但是每个SM上可以被分配多个线程块,当一个线程块被分配好SM后就不能再分配到其他SM上了。
  13. 线程束(Warp):每个线程块被分为多个包含32线程的线程束(warp)执行,Warp是一种硬件执行的策略,不是CUDA编程模型的一部分,线程束是SM中的基本调度单元,未来的GPU可能在每个线程束中有不同数量的线程。线程束被选中时,其中所有线程都执行相同的指令,应尽量避免在同一线程束内出现分支(线程束中的线程所采用的分支一次遍历一条,直到不再有新的分支,这会导致原本的并行执行变为串行执行)。每个线程束中只能包含同一线程块中的线程,线程束是GPU硬件上真正的做到了并行。SM 实现零开销的线程束调度:下一条指令的操作数已准备好可供使用的线程束才有资格执行,基于优先调度策略,选择合格的线程束执行。SM中的SP数量(即cuda核心)远大于warp数量并不是为了实现warp的切换,而是为了提高GPU的并行处理能力,尽管每个SM一次只能处理一个warp,但是在任何时候都有多个warp在等待被处理,通过创建大量的warp和线程,可以最大限度地利用GPU并行处理能力。
  14. CUDA 平台具有三种主要的内存类型:寄存器:用于自动变量和寄存器溢出的每个线程内存。共享内存:一种特殊类型的内存,其内容在内核源代码中明确定义和使用,每个SM中有1个共享内存,较之全局内存,有着更高的访问速度(在延迟和吞吐量方面),允许块内数据共享和同步,生命周期为线程块,对应线程完成终止执行后内容会消失,线程可以通过这块内存安全地共享数据,并且可以通过__syncthreads()进行屏障同步,。全局内存——可以在线程块或线程网格之间共享的设备级内存。

  15. cudaMalloc()在设备全局内存中分配一个对象,cudaFree()从设备全局内存中释放对象,cudaMemcpy()内存数据转移。
  16. 计算/通信比 CGMA ratioCompute to Global Memory Access ratio):每次访问 CUDA 内核区域内的全局内存时执行的浮点计算次数。计算/通信比越大,表示在GPU上的性能越好。
  17. __syncthreads()函数是CUDA中用于实现线程同步的重要函数之一,它的作用是在当前线程块(Block)中的所有线程之间同步执行,确保在某个线程执行到该函数时,其他线程都会等待直到所有线程都执行到这个函数为止。换句话说,当一个线程块中的某个线程调用__syncthreads()函数时,这个线程块中的所有线程都会被阻塞,直到所有线程都达到__syncthreads()函数的位置为止,然后这些线程才能继续向下执行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值