cuda - NVIDIA GPU的任务调度

标签 cuda gpu gpgpu

我对nvidia GPU的任务调度有些疑惑。

(1)如果一个 block (CTA)中的线程束已经完成,但仍有其他线程在运行,这个线程会等待其他线程完成吗?换句话说,当所有线程都完成时, block (CTA)中的所有线程都会释放它们的资源,可以吗?我认为这一点应该是正确的,因为 block 中的线程共享共享内存和其他资源,这些资源在 CTA 大小管理器中分配。

(2)如果一个 block (CTA)中的所有线程都挂起一些长延迟,例如全局内存访问?一个新的 CTA 线程会占用资源,哪种方法像 CPU?换句话说,如果一个 block (CTA)已经被调度到一个 SM(流处理器),它是否会占用资源直到它完成?

如果有人向我推荐一些有关 GPU 架构的书籍或文章,我将不胜感激。谢谢!

最佳答案

只有当 SM 有足够的资源用于线程 block (共享内存、warp、寄存器、屏障等)时,计算工作分配器才会在 SM 上调度线程 block (CTA)。分配诸如共享内存之类的线程 block 级资源。分配为线程 block 中的所有线程创建了足够的扭曲。资源管理器将warp 循环分配给SM 子分区。每个 SM 子分区都包含一个 warp 调度程序、寄存器文件和执行单元。一旦一个 warp 被分配给一个子分区,它将保留在子分区上,直到它完成或被上下文切换(Pascal 架构)抢占。在上下文切换恢复时,warp 将恢复到相同的 SM 相同的 warp-id。

当 warp 中的所有线程都完成时,warp 调度程序等待 warp 发出的所有未完成的指令完成,然后资源管理器释放 warp 级别的资源,包括 warp-id 和 register 文件。

当线程 block 中的所有 warp 完成时, block 级资源被释放,并且 SM 通知 Compute Work Distributor 该 block 已完成。

一旦一个 warp 被分配给一个子分区并且所有的资源都被分配,这个 warp 被认为是活跃的,这意味着 warp 调度程序正在积极地跟踪这个 warp 的状态。在每个周期,warp 调度器确定哪些事件的 warp 被停止,哪些有资格发出指令。 warp 调度程序选择最高优先级的合格 warp 并从 warp 发出 1-2 个连续指令。双重问题的规则特定于每个架构。如果 warp 发出内存加载,它可以继续执行独立指令,直到它到达依赖指令。然后,warp 将报告停止,直到加载完成。对于从属数学指令也是如此。 SM 架构旨在通过在 warp 之间切换每个周期来隐藏 ALU 和内存延迟。

这个答案没有使用术语 CUDA 核心,因为这引入了一个不正确的心智模型。 CUDA 内核是流水线单精度浮点/整数执行单元。问题率和依赖延迟因每个架构而异。每个 SM 子分区和 SM 都有其他执行单元,包括加载/存储单元、 double 浮点单元、半精度浮点单元、分支单元等。

关于cuda - NVIDIA GPU的任务调度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44176707/

相关文章:

gpgpu - 将 Tensorflow 与 GPU 一起使用时出错

opencl - 使用 NVIDIA 的 nvcc 编译器编译和构建 .cl 文件?

c++ - 从命令行编译 CUDA 代码

ffmpeg 编译因 cuda 失败,找不到 libnpp

cuda - CUDA Thrust 与原始内核相比如何?

c++ - CUDA 共享内存编程不起作用

python-3.x - 使用 xgb 和 XGBclassifier 的 CPU 比 GPU 快

c++ - CUDA 'dot product' 内核能否加速批量 RMS 计算?

cuda - 有没有在 cuda 上使用只读 HashMap 的好方法?

iphone - Opengl 中的重复状态更改