performance - 如何解释使用 CUDA 代码在 GPU 设备中观察到的超线性加速?

标签 performance cuda parallel-processing

我无法理解 Tesla C1060 上令人尴尬的并行计算的扩展性能。使用所有 block 和每个 block 多个线程运行它,我得到的运行时间约为 0.87 秒。

但是,如果我仅在一个 block 中运行所有迭代,每个 block 一个线程,则运行时间长达 1872 秒,这比我期望的 240x0.87s = 209 秒要长得多,而我只希望缩小到使用仅 240 个流处理器之一。

相反,通过使用所有 240 个核心,我似乎获得了超过 2000 倍的速度提升。这种超线性加速是如何可能的?在该系统的性能建模中我还应该注意哪些其他因素?

最佳答案

启动由 1 个线程组成的内核会将内核执行限制为 30 个 SM 中的 1 个。对于发出的每个扭曲指令,仅使用 1/32 的执行单元。此外,来自同一经线的指令不能在背靠背的发布槽上发布,从而使至少 1/2 的发布槽为空。额外的插槽将因指令依赖性和内存延迟而空出,从而使速度提高 2-4 倍。让我们假设一个非常悲观的 2x。粗略计算可能的 yield 是

30x increase for using all 30 SMs
32x increase for using full width of the execution units
 2x increase for using issue slots and saturating memory system
= 30 * 32 * 2
= >1920x performance increase

您看到的差异是 1872/.87 = 2152x。由于空的发行槽以及每个 SM 1 个扭曲无法使内存系统饱和,这可以很容易地用 >2x 来解释。

关于performance - 如何解释使用 CUDA 代码在 GPU 设备中观察到的超线性加速?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23796964/

相关文章:

cuda - 如何适本地将 OpenMP 与 CUDA 结合起来

c++ - 从 GPU 复制到 CPU 比从 CPU 复制到 GPU 慢

Java 帧动画损害性能

algorithm - 当您有先前的答案时,更快的计算模数的方法?

database - 如何检查隔离级别?

compiler-errors - 在我的CUDA内核中使用__shfl_xor,但在编译时出错

python - 如何将 joblib 并行化与不返回任何内容的类内方法一起使用

javascript - 清晰地与使用 Node 的 child_process.fork() 创建的工作进程进行对话

Python, Multiprocessing : what does process. join() 做什么?

java - 我应该始终使我的 java 代码线程安全,还是出于性能原因仅在需要时才这样做?