更改CUDA中的arch参数使我可以使用更多寄存器

更改CUDA中的arch参数使我可以使用更多寄存器,cuda,nvidia,cpu-registers,Cuda,Nvidia,Cpu Registers,我一直在特斯拉K20m上编写内核,当我用-Xptas=-v编译软件时,我得到以下结果: 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个寄存器,但是,如果我提到参数-arc

我一直在特斯拉K20m上编写内核,当我用-Xptas=-v编译软件时,我得到以下结果:

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]
因为在多本书中都提到,使用正确的卡结构可以提高性能,我想知道为什么我的卡的性能会大幅下降

谢谢

编辑:

类似的问题和答案:

使用sm_20及以上版本编译可实现IEEE数学和ABI合规性。这两个选项会增加寄存器计数并降低性能。这两个选项可以禁用。

使用sm_20及以上版本编译可实现IEEE数学和ABI合规性。这两个选项会增加寄存器计数并降低性能。这两个选项可以禁用。

编译器似乎正在做出不同的优化决策。你能提供一个简短的可编译的再现你所看到的吗?我对资源使用的变化不太感兴趣,因为我对您报告的急剧减速感兴趣。因此,基本上,当我使用“sm_10”时,代码执行需要2.000235毫秒,但当使用“sm_35”时“代码需要2.538336到3.xxxxxx毫秒,这在这个内核中是令人印象深刻的。我现在实际上不能给出代码,它使用了一部分不是我的代码。可能是一个编译器错误,但如果没有源代码,就无法确定。尝试指定
\uuuuu启动\u边界(尝试不同的值),看看这是否有任何区别。我实际上使用了定义数量的线程和固定数量的块,因此尝试启动\u边界是否重要?看起来编译器正在做出不同的优化决策。你能提供一个简短的可编译的再现你所看到的吗?我对资源使用的变化不太感兴趣,因为我对您报告的急剧减速感兴趣。因此,基本上,当我使用“sm_10”时,代码执行需要2.000235毫秒,但当使用“sm_35”时“代码需要2.538336到3.xxxxxx毫秒,这在这个内核中是令人印象深刻的。我现在实际上不能给出代码,它使用了一部分不是我的代码。可能是一个编译器错误,但如果没有源代码,就无法确定。尝试指定
\uuuuuu启动\u边界(尝试不同的值),看看这是否有什么不同。我实际上使用了定义数量的线程和固定数量的块,所以这与尝试启动\u边界有关系吗?这两个通常是主要原因。编译器还知道,较新的体系结构提供了更多的寄存器,因此可能有意使用它们来提高性能(例如,使用临时变量来缓存和中间结果,而不是重新计算,或者提前更积极地安排加载。一般来说,我不建议关闭IEEE compliance或ABI。ABI的使用特别支持许多较新的CUDA语言功能。程序员不应沉迷于寄存器的使用,除非re是溢出或占用的一个具体问题。事实上,我并不是真的沉迷于寄存器,我的问题是,如果我使用-arch=sm_35选项编译,时间会增加很多。@greg你建议禁用这些选项吗?或者根本不禁用?或者继续使用-arch=sm_10编译我的软件,因为时间非常重要。si这里找到了相似的答案:尝试使用-ftz=true-prec div=false-prec sqrt=false进行编译。这将单精度浮点数学配置为与sm_1x编译使用的设置大致相同。如果您在64位平台上,增加寄存器使用的另一个原因可能是,对于sm_20及以上的设备,Device中的64位指针e代码只能在非常有限的情况下优化为32位操作,而这种优化可以应用于sm_1x设备上的所有设备指针,因为它们都不支持超过4GB的内存。这两个通常是一个主要原因。编译器还意识到,较新的体系结构提供了更多的寄存器,因此可能会使用它们以提高性能(例如,使用临时变量来缓存和中间结果,而不是重新计算,或者提前更积极地安排加载。一般来说,我不建议关闭IEEE compliance或ABI。ABI的使用特别支持许多较新的CUDA语言功能。程序员不应沉迷于寄存器的使用,除非re是溢出或占用的一个具体问题。事实上,我并不是真的沉迷于寄存器,我的问题是,如果我使用-arch=sm_35选项编译,时间会增加很多。@greg你建议禁用这些选项吗?或者根本不禁用?或者继续使用-arch=sm_10编译我的软件,因为时间非常重要。si这里找到了相似的答案:尝试使用-ftz=true-prec div=false-prec sqrt=false进行编译。这将单精度浮点数学配置为与sm_1x编译使用的设置大致相同。如果您在64位平台上,增加寄存器使用的另一个原因可能是,对于sm_20及以上的设备,Device中的64位指针e代码只能在非常有限的情况下优化为32位操作,而这种优化可以应用于sm_1x设备上的所有设备指针,因为它们都不支持超过4GB的内存。