我有一个用 C 和 CUDA 编写的模拟应用程序。为了测量加速比,我记录了两种情况下的时间。在 CUDA 中,我使用 CUDA 事件来测量时间,然后将 GPU 的时间除以 CPU(通常这样做)。下面提供了加速的图像。
关于加速图的奇怪之处在于,加速首先增加到 55 倍,然后减少到 35 倍,然后随着线程总数的增加再次增加。我不确定为什么会发生这种情况以及我如何能够找出这种输出背后的原因。我使用的是 448 核的 GTX 560ti GPU 卡。每个 block 的线程数为 1024(最大数量),因此每个 SM 一次 1 个 block 。发生这种情况是因为占用问题吗?我怎么才能确定这种加速图背后的原因?
最佳答案
加速的峰值似乎与 CPU 的执行时间有关。分析 GPU 时间,它似乎随着代理数量线性增加。然而,CPU 时间,一般来说也是线性增加的,在 [0.6,1.6]
范围内有一个下降时间,并且在 [2.6,3.1]< 范围内有一些峰值
大约。
考虑到上述因素,您的 55 倍最大加速在 [0.6,1.1] 范围内减少了大约。因为你的 CPU 时间也减少了。因此,将加速比计算为 CPU time/GPU time
结果较小是正常的。这同样适用于 [2.6,3.1]
范围内的第二个。
我如何找出这种加速图背后的原因?我猜 CPU 被一些外部事件(I/O、CPU 中运行的其他程序、操作系统...)中断了。
要更准确地计算加速比,将实验作为单独的执行重复 10 次,即不要在主函数内创建一个循环来执行它 10 次。对于 10、20、30 甚至更多的单独执行,您可以计算平均时间和方差。然后,研究执行时间:一个或两个峰值可能被视为特殊情况(忽略它们)。如果您看到趋势,则应该进行更深入的研究。
关于c - 加速计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15959058/