CUDA 概念汇总

简介

最近接触到了 cudaStream,对于一个没写过 CUDA 的人来说,一时有点难理解。于是网上找了几篇文章,快速入门了一下。其实说白了 cudaStream 就是一个执行流,用以提高并行度。

下面是学习过程中见到的概念。概念真的太重要了。

核函数:CUDA 的执行单元。核函数用 __global__ 符号声明,在调用时需要用 <<<grid, block>>> 来指定kernel要执行的线程数量

线程层次结构:grid -> block -> thread。一个 grid,多个 block,一个网格上的线程共享相同的全局内存。一个 block,多个 thread,一个 block 上的 thread 使用共享内存来通信。grid 和 block 都是三维的,在核函数中可以使用 blockDimgridDim 来获取维度大小。

流式处理器:一个 block 上的所有线程在一个 SM 上执行,多个线程对应多个 core,每个 core 有寄存器、局部内存(local memory),每个 SM 上又有内存(shared memory),整个 GPU 上又有另一个内存(global memory)。

线程束:SM 采用了 SIMT 架构,基本的执行单元是线程束,一个线程束 32 个线程,这些线程执行相同的指令。遇到分支情况,需要等待,因为单指令多线程,即每个线程上的指令都是一样的,所以分支情况性能会差。

显存的使用:设备上使用的内存和主机上使用的内存不是一个东西,所以如果要在设备上进行计算,需要将数据拷贝到设备上后计算。

统一内存:CUDA 6.0 引入的概念,使用一个托管内存共同管理 host 和 device 的内存,函数调用 cudaMallocManaged

Stream:利用 Stream 将内存读取和数值运算并行,从而提升数据的吞吐量。默认情况下,CUDA 使用一个 Default Stream 来进行数据拷贝。通常采用将数据分块的做法,将不同数据块分配给不同的 Stream 做数据传输和计算,这样多个数据块就并行起来了,提高了并行度,从而提升数据的吞吐量。相关的 API 有 cudaStreamCreate, cudaMemcpyAsync

Event:用以监视流的运行情况,或者精确计时。

参考资料

[1] https://zhuanlan.zhihu.com/p/34587739

[2] https://zhuanlan.zhihu.com/p/51402722

[3] https://zhuanlan.zhihu.com/p/75720006

[4] https://zhuanlan.zhihu.com/p/53773183

posted @ 2021-11-04 08:36  楷哥  阅读(856)  评论(0编辑  收藏  举报