【发布时间】:2013-03-06 04:31:22
【问题描述】:
这不是一个严格的编程问题,但了解硬件是编程的关键部分。
所以我开始这个帖子,希望这里的人们可以分享他们在开普勒(GK10X或GK110)上编程的经验。
首先我要开始我的:
我目前正在 GK110 上进行一些编程,对于某些应用,GK110 比 Fermi 快得多,接近其理论峰值(例如快 2.5-3 倍)。但对于其他人来说,它不是,(例如,只有 ~ 50%-60% 快)。
如果我错了,请纠正我,但在我看来,Kepler 的主要性能瓶颈是这里的资源压力非常高:
在每个 SM 级别上,Fermi 实际上比 GK110 拥有更多的资源,在每个 SM 上,Fermi 只有一个 SIMT 单元,而 Kepler 有 6 个。
然而在每个 SM 上,Fermi 有 32K 个寄存器文件,最多有 1536 个活动线程,而在 Kepler 的每个 SM 上,只有 33% 的活动线程,100% 的寄存器,800% 的指令发出单元,和相同数量的 L1 缓存。
关于内存和计算的延迟在绝对值上大致相同(GPU 周期的一半)。
所以 GK110 的资源压力比 GF110 高很多。
有了 800% 的指令发出单元,Nvidia 似乎想使用更激进的 TLP 和 ILP 来隐藏 Kepler 上的延迟,但它肯定没有那么灵活,因为 L1 缓存是相同的,而活动线程只是增加了 33%,而不是像 SIMT 单位那样增加了 500%。
因此,要利用 Kepler 的最大效率,要困难得多,首先代码必须包含显着更多的 ILP,但要使用显着更少的共享内存才能利用 Kepler 的大量指令发布单元,其次,在每个经线级别,工作流程必须非常计算密集,这样开普勒计划不需要切换很多经线来隐藏延迟(而且它当然没有很多可用的经线可供选择)。
【问题讨论】:
-
这里有实际问题吗?
-
当然,因为我想了解更多关于 Kepler 编程的实际问题。
-
SO 并不是真正打算用作开放式讨论线程的工具。这里最好回答的问题类型是与特定编程问题相关的特定问题。用一个问题/答案 SO 格式来解决像您这样的广泛主题是非常困难的。 SO 问题不是一般性的讨论主题。