这不是严格的编程问题,但了解硬件是编程的关键部分。
所以我开始这个帖子,希望这里的人们可以分享他们在开普勒(GK10X或GK110)编程方面的经验。
首先我开始我的:
目前我正在对GK110进行一些编程,对于某些应用,GK110明显快于费米,接近理论峰值(例如快2.5-3倍)。但对于其他人来说,情况并非如此(例如,只有约50%-60%)。
如果我错了,请纠正我,但在我看来,开普勒的主要性能瓶颈是资源压力非常高:
在每个SM级别上,Fermi实际上拥有的资源远远多于GK110,在每个SM上,Fermi只有一个SIMT单元,而Kepler有6个。
然而在每个SM上,Fermi有32K寄存器文件,最多1536个活动线程,而在Kepler的每个SM上,只有33%的活动线程,100%的寄存器,800%的insturction-issue单元,和相同数量的L1缓存。
关于内存和计算的延迟在绝对意义上大致相同(GPU周期的一半)。
因此,与GF110相比,GK110的资源压力要高得多。
有800%的指令发布单元,似乎Nvidia想要使用更积极的TLP和ILP来隐藏Kepler的延迟,但它肯定不那么灵活,因为L1缓存是相同的,而活动线程只是与其SIMT装置一样,增加了33%,而不是500%。
因此,为了利用开普勒的最高效率,它要困难得多,第一代码必须包含更多的ILP,但却占用更少的共享内存,以利用开普勒的大规模指令发布单元,其次,在在每个warp级别,工作流程必须是非常计算密集的,因此Kepler调度不需要切换大量的warp来隐藏延迟(并且它当然没有很多可用的warp来开始选择)。
答案 0 :(得分:2)
您可能想要阅读开普勒(GK110)whitepaper,或许可以与费米whitepaper进行比较,然后研究开普勒tuning guide。调试指南将回答您关于开普勒差异以及如何充分利用开普勒的许多问题。