在GPU架构中,存储的所有非活动扭曲的数据在哪里



根据我对NVIDIA的CUDA体系结构的理解,线程的执行以大约32个称为"warps"的组进行。一次安排多个扭曲,并从任何扭曲发出指令(取决于某些内部算法)。

现在,如果我在设备上有16KB的共享内存,并且每个线程使用400字节的共享内存的话,那么一个warp将需要400*32=12.8KB。这是否意味着GPU实际上一次不能调度超过1个warp,无论我在给定块内启动多少线程?

从资源的角度(寄存器、共享内存等)来看,重要的单元是线程块,而不是warp。

为了安排执行线程块,SM上必须有足够的可用资源来满足整个线程块的需要。网格中的所有线程块都将具有完全相同的资源需求。

如果SM当前没有正在执行的线程块(例如在内核启动时),则SM应该至少有足够的资源来满足单个线程块的需求。如果不是这样,内核启动将失败。例如,如果每个线程的寄存器数乘以每个块的线程数,超过SM中的寄存器数,就会发生这种情况

在SM调度了单个线程块之后,可以根据可用资源来调度额外的线程块。因此,为了扩展寄存器类比,如果每个线程块需要30K个寄存器(regs/thread*threads/block),而SM最多有64K个寄存器,那么最多可以调度两个线程块(即,SM可能会执行它们的扭曲)。

通过这种方式,任何可能被执行的扭曲都已经分配了足够的资源。这是调度机制的主要部分,允许SM以零延迟将执行从一个扭曲切换到另一个扭曲(快速上下文切换)。

最新更新