1

我对 GPU 中的扭曲有疑问。

我使用了以下配置:

  • GeForce 210
  • Cuda 能力主要/次要:1.2
  • 2 个多处理器,8 个 CUDA 核心/MP:16 个 CUDA 核心
  • 经纱尺寸:32

以下是运行时间(我使用了 nsight):

block,threads/block : time
--------------------------
1,32 : 5.1
8,32 : 5.4
16,32 : 5.7
32,32 : 8.9
64,32 : 14.8

Warps(=32 个线程)同时运行,并且有 2 个 MP。所以我认为这个 GPU 的最大能力是 64 线程,但是 16*32 线程几乎同时运行。考虑到warp scheduler,我无法理解这个结果。

我的问题是:

  1. 为什么 16*32 线程与 32 线程几乎同时运行?
  2. 为什么 64*32 运行时间不是 32*32 的两倍
  3. 我听说全局内存访问速度和寄存器一样快。这样对吗?(包括 3.5 GPU 或昂贵的 GPU)
4

2 回答 2

3

GPU 是一种延迟隐藏架构。执行单元是流水线的。管道的深度没有披露。对于这个答案,我们假设设备每个周期可以执行 1 条指令,相关指令延迟为 8 个周期。

假设一个非常简单的程序在指令之间具有依赖关系:

1. ADD     R0, R1, R2
2. ADD     R3, R1, R2
3. ADD     R0, R3, R4   read r3 after write r3
4. LD      R1, R0       read r0 after write r0
5. ADD     R1, R1, R2   read r1 after write r1

time in cycles -->
                0                                4
                0        1         2         3   0
                123456789012345678901234567890...01234567890
                --------------------------------------------
warp 0 issues   12.......3.......4............>>>5..........
warp 0 retires  ........12.......3............>>>4.......5..

该图显示了 warp 0 在什么周期发出指令以及指令在什么周期退出。在 370 个周期的时间线上存在不连续性,以覆盖全局内存访问的延迟,可能是 200-1000 个周期。

如果您添加更多经线,这些经线可以在时间线上的任何时间发出,其中经线 0 问题是 .

您的内核将在几乎不增加时间的情况下进行扩展,直到 warp 调度程序有足够的 warp 来发布每个周期。一旦达到这个阈值,warp 调度程序就会被超额订阅,执行时间将会增加。执行时间也可以通过增加数学管道或内存子系统的使用来增加。

如果您正在使用 Fermi 或更新的 GPU,您可以使用 Nsight VSE CUDA Profiler 问题效率实验来查看增加块/扭曲/线程的数量如何影响调度程序的效率,您还可以检查扭曲停滞的原因。

于 2014-05-08T05:15:01.510 回答
0

对于前 2 个问题,请验证 GPU 规格。它还取决于您的代码实现。根据正在实施的算法,您会获得不同的加速。这取决于算法与其顺序对应物相比的并行化程度。

对于第三个问题,。全局内存访问比访问寄存器和共享内存要慢得多。这就是我们使用共享内存优化的原因。经验法则是,如果全局内存中的某些内容被多次访问,最好只访问它并在共享内存或私有变量中获取它

于 2014-05-08T01:15:51.903 回答