(四)、硬件实现——CUDA Programming Guide

4.1 SIMT架构

多个线程执行同一条指令

当thread block分配到SM上时,SM会将block中的连续id的thread按照32个为一组划分成多个warp。

SM创建、管理、调度和执行warp。
同一warp中的32个threads都有各自的instruction address counter和register state,因此可以独立地进行分支和执行。

在Volta之前,一个warp内的线程共用一个PC(程序计数器),并配备一个32位的active mask来标识某个线程是否处于active状态。但是,来自相同warp内的不同分支内的线程之间不能通信或者交换数据,因为使用锁(或互斥锁)时会导致死锁。

从Volta开始,独立线程调度(Independent Thread Scheduling)允许线程之间完全并发。GPU维护每个线程的执行状态(包括PC和调用栈)。但是仍旧采用warp划分方式。

4.2 硬件多线程

由SM处理的每个warp的执行上下文(包括PC和寄存器等)在维护在on-chip。因此,从一个执行上下文切换到另一个执行上下文是没有成本的,并且在每次指令发出时,warp调度程序都会选择一个有准备好线程的warp执行其下一条指令(warp的活动线程),并向这些线程发出指令。

特别是,每个多处理器都有很多个32位的寄存器,这些寄存器被划分给在warp。一个并行数据缓存或共享内存,被划分给在线程块。

对于给定的kernel,可以驻留在SM上的Block和warp的数量取决于kernel使用的register和shared memory的数量,以及SM上可用的register和shared memory的数量。每个SM还有最的驻留block数和最大的驻留warp数。如果每个SM没有足够的register和shared memory来处理至少一个block,kernel将无法启动。

一个Block中的warp总数:
在这里插入图片描述

  • T T T是Block中的线程总数,
  • W s i z e W_{size} Wsize是warp大小,等于32,
  • c e i l ( x , y ) ceil (x,y) ceil(x,y)等于x向上取整到y的倍数。

你可能感兴趣的:(CUDA,硬件架构)