如何将线程块分配给 NVIDIA GPU 上的多处理器?
How are thread blocks are assigned to multiprocessors on NVIDIA GPUs?
假设我有 8 个线程块需要执行,我的 GPU 上有 8 个 SM(流式多处理器),8 个线程块可以放入一个 SM。我想知道线程块是如何分配给 SM 的。会不会所有的线程块都分配给一个SM,而其他7个是空的?还是将每个线程块分配给一个单独的 SM?
这些信息基本上是CUDA未指定的。没有块调度程序将遵循的规则的描述。
根据经验,不难证明 CUDA 块调度器会优先将块存放在空的 SM 上,然后再将块存放在已经存在一个或多个块的 SM 上。
这种优惠行为的原因很明显。这是充分利用分布在设备上的 GPU 资源的方法;对于任何给定的 GPU,它可以在一系列网格大小上实现最高性能。
假设我有 8 个线程块需要执行,我的 GPU 上有 8 个 SM(流式多处理器),8 个线程块可以放入一个 SM。我想知道线程块是如何分配给 SM 的。会不会所有的线程块都分配给一个SM,而其他7个是空的?还是将每个线程块分配给一个单独的 SM?
这些信息基本上是CUDA未指定的。没有块调度程序将遵循的规则的描述。
根据经验,不难证明 CUDA 块调度器会优先将块存放在空的 SM 上,然后再将块存放在已经存在一个或多个块的 SM 上。
这种优惠行为的原因很明显。这是充分利用分布在设备上的 GPU 资源的方法;对于任何给定的 GPU,它可以在一系列网格大小上实现最高性能。