在 GPU 架构中,所有非活动扭曲的数据存储在哪里?
Posted
技术标签:
【中文标题】在 GPU 架构中,所有非活动扭曲的数据存储在哪里?【英文标题】:In GPU architecture, where is the data for all the non-active warps stored? 【发布时间】:2014-01-06 09:28:57 【问题描述】:根据我对 NVIDIA CUDA 架构的理解,线程的执行以大约 32 个称为“warps”的组进行。一次调度多个 warp,并从任何一个 warp 发出指令(取决于某些内部算法)。
现在,如果我说设备上有 16KB 的共享内存,并且每个线程使用 400 字节的共享内存,那么一个 warp 将需要 400*32 = 12.8 KB。这是否意味着 GPU 一次实际上不能调度超过 1 个 warp,而不管我在给定块内启动了多少线程?
【问题讨论】:
简而言之,资源仅在它们激活后才分配给扭曲/块。如果内核可以让编译器至少找到一个活动块,那么你就可以开始了。 【参考方案1】:从资源的角度来看(寄存器、共享内存等),重要的单元是 threadblock,而不是 warp。
为了调度线程块执行,SM 上必须有足够的空闲资源来满足整个线程块的需求。网格中的所有线程块将具有完全相同的资源需求。
如果 SM 当前没有正在执行的线程块(例如在内核启动时),那么 SM 应该至少有足够的资源来满足单个线程块的需求。如果不是这种情况,内核启动将失败。例如,如果每个线程的寄存器数乘以每个块的线程数,超过 SM 中的寄存器数,就会发生这种情况。
在 SM 调度了单个线程块后,可以根据可用资源调度额外的线程块。所以为了扩展寄存器类比,如果每个线程块需要 30K 寄存器(regs/thread * threads/block),并且 SM 最多有 64K 寄存器,那么最多可以调度两个线程块(即它们的 warp 可能被带入由 SM 执行)。
通过这种方式,任何可能被执行的 warp 都已经有足够的资源分配给它。这是调度机制的主要部分,它允许 SM 以零延迟(快速上下文切换)将执行从一个 warp 切换到另一个 warp。
【讨论】:
以上是关于在 GPU 架构中,所有非活动扭曲的数据存储在哪里?的主要内容,如果未能解决你的问题,请参考以下文章