大模型开发之CUDA

2023-12-25 16:14:16

CUDA中线程也可以分成三个层次:线程、线程块和线程网络。

? 线程(Thread):CUDA 中基本执行单元,由硬件支持、开销很小,每个线程执 行相同代码;

? 线程块(Block):若干线程的分组,Block 内一个块至多512个线程、或1024个 线程(根据不同的 GPU 规格),线程块可以是一维、二维或者三维的;

? 线程网络(Grid):若干线程块 Block 的网格,Grid 是一维和二维的。

GPU 有很多线程,在 CUDA 里被称为 Thread,同时我们会把一组 Thread 归为一个 Block,而 Block 又会被组织成一个 Grid。

CUDA的执行流程

GPU 上有很多计算核心也就是 Streaming Multiprocessor (SM), SM 是一块硬件,包 含了固定数量的运算单元,寄存器和缓存。 在具体的硬件执行中,一个 SM 会同时执行一组线程,在 CUDA 里叫 warp,直接可以理 解这组硬件线程 warp 会在这个 SM 上同时执行一部分指令,这一组的数量一般为 32 或者 64 个线程。 一个 Block 会被绑定到一个 SM 上,即使这个 Block 内部可能有 1024 个线程,但这些线 程组会被相应的调度器来进行调度,在逻辑层面上我们可以认为 1024 个线程同时执行,但 实际上在硬件上是一组线程同时执行,这一点其实就和操作系统的线程调度一样。意思就是 假如一个 SM 同时能执行 64个线程,但一个 Block 有 1024 个线程,那这 1024 个线程 是分 1024/64=16 次执行。

GPU 在管理线程的时候是以 block 为单元调度到 SM 上执行。每个 block 中以 warp(一般32个线程或64线程) 作为一次执行的单位(真正的同时执行)。 1. 一个 GPU 包含多个 SM ,而每个 SM 又包含多个 Core,SM 支持并发执行多达几百 的 Thread 。 2. 一个 Block 只能调度到一个 SM 上运行,直到 Thread Block 运行完毕。一个 SM 可 以同时运行多个 Block (因为有多个 Core)。 写 CUDA kernel 的时候,跟 SM 对应的概念是 Block,每一个 Block 会被调度到某个 SM 执行,一个 SM 可以执行多个 block。CUDA 程序就是很多的 Blocks 均匀的喂给若 干 SM 来调度执行。

文章来源:https://blog.csdn.net/weixin_43882788/article/details/135198303
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。