5

我知道在 CUDA 中,同一块中的 32 个相邻线程将被安排为一个 warp。但我经常发现一些教程 CUDA 代码有多个块,每个块有 1 个线程。在这个模型中,来自 32 个块的 32 个线程会被调度为一个 warp 吗?如果不是,我可以说这个模型不如每个块组织成 32 个线程那么有效吗?谢谢!

4

2 回答 2

6

不,来自不同块的线程不能被安排在同一个 warp 中。如果您只使用单个线程创建线程块网格,那么您肯定无法从机器中获得全部性能。它比每个块有 32 个(或 32 的整数倍)线程效率低。例如,Fermi SM 有 32 个可以使用的经线。如果您正在调度单个线程的块,那么这 32 个通道中只有 1 个通道可以在任何给定时间使用。

线程有一个线程 ID(threadIdx 内置变量),它在单个块中定义(并且仅对)单个块。

C 编程指南的硬件多线程部分给出了定义单个块中扭曲总数的公式

于 2012-12-04T03:26:24.750 回答
0

还要补充一点。CUDA 中的计算总是通过 warp 进行的,因此即使您为每个块分配少于 32 个线程(1、2..8、16),计算发生在一个 warp(32 个线程)上,该块的 32 个线程的资源也会停止。

如果您分配 32 个块,每个块有一个线程,那么您正在为 32X32 线程拖延资源。如果可以,请避免这种情况。

于 2017-02-08T06:53:50.170 回答