简介
最近接触到了 cudaStream,对于一个没写过 CUDA 的人来说,一时有点难理解。于是网上找了几篇文章,快速入门了一下。其实说白了 cudaStream 就是一个执行流,用以提高并行度。
下面是学习过程中见到的概念。概念真的太重要了。
核函数:CUDA 的执行单元。核函数用 __global__
符号声明,在调用时需要用 <<<grid, block>>>
来指定kernel要执行的线程数量
线程层次结构:grid -> block -> thread。一个 grid,多个 block,一个网格上的线程共享相同的全局内存。一个 block,多个 thread,一个 block 上的 thread 使用共享内存来通信。grid 和 block 都是三维的,在核函数中可以使用 blockDim
,gridDim
来获取维度大小。
流式处理器:一个 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:用以监视流的运行情况,或者精确计时。
总结
看了下面的参考资料,算是稍微认识了一下 CUDA。如何进一步学习呢?进一步 CUDA 做什么呢?我们用 CUDA 的目的无非就是利用并行计算来加速运算,本质就是算的更快。进一步学习 CUDA 的目的就是可以更快的计算,即性能优化,掌握各种 Trick,掌握硬件架构等。至于我,就不深入学习了... 我只不过是想知道 cudaStream 是干嘛的。
参考资料
[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