CUDA编程基础知识整理

前言:最近在尝试通过CUDA加速Swin Transformer,第一次接触CUDA的相关知识,将这些天学习到的内容做一个小小的梳理,如果有理解不准确的地方,欢迎大家指正!

CUDA编程和GPU架构基本概念

CUDA编程中的基本名词:grid、block、(warp)、thread,它们主要是逻辑意义上的名词。grid是block的集合,block是thread的集合,在编写程序时,grid和block的维度可以是1-3维。在GPU实际运行中,为了提高运行效率,在block内又将32个threads分为1个warp。

CUDA中的逻辑之所以有三层,是因为在GPU架构中,硬件也是三个层次:Device、SM(streaming multiprocessor)、SP。CUDA编程首先需要分清的概念就是Host(CPU)和Device(GPU),我们的CUDA程序运行在CPU上,当运行到Device的相关程序时才会驱动GPU运行,所以可以将GPU当作CPU的外设。在核函数启动时,逻辑意义上的grid被放到device上运行,对于grid中的每一个线程块(block),会被放到SM中运行(一个block只能放到1个SM上运行,但是1个SM可以运行多个block,单SM可同时运行的block数量取决于block所占用的寄存器和共享内存大小),然后block中的thread会被放到SM中SP里的计算核心(core)上运行,计算核心core数量视为等于FP32计算核心,也叫做CUDA core,在Tesla V100中1个SM中有64个FP32 cores,总共有5120个FP32 cores,也就是5120 CUDA cores。

对于Tesla V100来说,它的相关信息如下:
GpuInfo
80个SM,每个SM最多同时处理64 warps,即2048 threads。1个block 最多包含1024 threads,三个维度的最大值分别为(1024,1024,64),要注意不管block取几个维度,其总量不能超过1024。共享内存在block内的threads间可以共享,1个block的共享内存为48KB,而1个SM的共享内存为96KB,合理利用好grid和block分块以及共享内存可以进一步优化CUDA程序。

CUDA核函数调度方式

核函数:

kernel << < gridSize, blockSize >> >(param);
  1. 该核函数会被指定到GPU上,也就是上面所说的将grid放到device上运行;
  2. gridSize会告诉GPU所需要调度的block数量,所有的block会被放到SM上,为了保证SM负载平衡,block会按顺序映射到SM上,比如对于Tesla V100来说,block0、80、160…会被放到SM1上,block1、81、161会被放到SM2上,以此类推,block79、159、239会被放到SM80上。
  3. 当SM接收到1个block之后,它会通过blockSize知道该block内有多少thread,并将threads按32切分为warps,如果threads不够32整除,那么最后一个warp会补齐成32,但是在运行时对应的core不会对运算产生影响,因此浪费了硬件资源,所以block内的threads最好为warp的整数倍,同理,grid内的block也最好为SM数量的整数倍。

下面以1个例子更具体地梳理一下1个block的运行流程:
Tesla V100中,单SM有4个warp scheduler,分配了1个可划分为64 warps的block,即每个warp scheduler需要并行处理16 warps,这16 warps统称为Active warp。
周期1,warp0首先开始从内存读取计算所需值(这需要一段时钟周期),周期2,在warp0的数据还没到时,SM warp scheduler将warp0挂起来,调度warp1,以此类推。所以在我的理解中,1个SM所能并发的warp最大数目,取决于在一个warp从内存得到数据所花费的时间内能够调度warp的数量。当warp0的数据到来之前,如果所有的warp都调度完了,都在等内存传来数据,此时SM就会闲置。当warp0的数据到了之后,此时SM的32个core如果可以利用,那么warp0就会映射到这32个core上开始运行。

所以SM能够并行2048 threads,在我的理解中,并不是真正意义上的同步,而是隐藏了访问内存延时意义上的同步。真正意义上能够同步运行的thread数量取决于SM中有多少SP。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值