2013-02-24 27 views
0

我一直在写我的特斯拉K20m,内核,当我编译-Xptas = -v软件我得到如下结果:改变CUDA拱的论点让我用更多的寄存器

ptxas info : 0 bytes gmem 
ptxas info : Compiling entry function '_Z9searchKMPPciPhiPiS1_' for 'sm_10' 
ptxas info : Used 8 registers, 80 bytes smem, 8 bytes cmem[1] 

为你可以看到,只有8个寄存器使用,但是,如果我提到的论点-arch = sm_35我的内核执行时间显着提高和太习惯寄存器的数量,我想知道为什么

nvcc mysoftware.cu -Xptxas=-v -arch=sm_35 
ptxas info : 0 bytes gmem 
ptxas info : Compiling entry function '_Z9searchKMPPciPhiPiS1_' for 'sm_35' 
ptxas info : Function properties for _Z9searchKMPPciPhiPiS1_ 
0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads 
ptxas info : Used 21 registers, 16 bytes smem, 368 bytes cmem[0] 

自有人提到多本书,使用正确的架构为卡为了提高性能,我想知道为什么我的显着减少。

谢谢。

编辑: 类似的问题和答案:Registers and shared memory depending on compiling compute capability?

+0

它看起来像编译器正在做出不同的优化决策。你能提供一个你可以看到的简短的可编辑复制器吗?我对资源使用方面的变化没有那么感兴趣,因为我正处于您所报告的急剧放缓阶段。 – 2013-02-24 15:42:31

+0

所以基本上,当我使用'sm_10'代码需要2.000235毫秒来执行,但是当使用'sm_35'代码需要2.538336到3.xxxxxx毫秒,这在这个内核的情况下是令人印象深刻的 – Anoracx 2013-02-24 15:45:15

+0

我实际上不能给这个代码现在使用了一部分代码,它不是我的。 – Anoracx 2013-02-24 15:54:41

回答

3

编译与sm_20及以上使IEEE数学和ABI兼容性。这两个选项可以增加寄存器数量并降低性能。这两个选项可以禁用。

+1

这两个通常是主要原因。编译器也意识到更新的体系结构提供更多的寄存器,因此可以故意使用它们来提高性能(例如,使用临时变量来缓存和中间结果而不是重新计算,或者更积极地预先调度负载。一般来说,我不建议关闭IEEE符合性或ABI使用ABI尤其可以实现许多新的CUDA语言特性程序员不应该注意注册表的使用情况,除非出现溢出或占用的特定问题 – njuffa 2013-02-24 22:23:14

+0

实际上,我并不十分执着于寄存器,我的问题是如果我使用选项-arch = sm_35进行编译,时间会增加很多。@greg是否建议您禁用这些选项?或者根本不用?或者自始至终使用-arch = sm_10继续编译我的软件具有巨大的重要性 – Anoracx 2013-02-24 22:39:58

+0

在这里发现了类似的答案:http://stackoverflow.com/questions/6038221/registers-and-shared-memory-depen ding-on-compiling-compute-capability – Anoracx 2013-02-25 15:40:07