Cuda:经线和运行时间

时间:2014-05-07 19:24:37

标签: cuda gpu-warp

我对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

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

我的问题是:

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

2 个答案:

答案 0 :(得分: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个周期。

如果添加更多warp,那么warp可以在warp 0问题为a的时间轴上随时发出。

在warp调度程序具有足够的warp来发出每个循环之前,内核将在几乎没有时间增加的情况下进行扩展。一旦达到此阈值,则warp调度程序被超额订阅,执行时间将增加。通过增加数学管道或内存子系统的使用,也可以增加执行时间。

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

答案 1 :(得分:0)

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

对于第3个问题,。全局内存访问比访问寄存器和共享内存要慢得多。这就是我们使用共享内存优化的原因。 拇指规则是指如果多次访问全局内存中的某些内容,最好只访问它并将其放入共享内存或私有变量