自己写的一个程序,使用–ptxax-option=-v后编译输出为: ptxas : info : Used 52 registers, 24 bytes cumulative stack size, 4096 bytes smem, 44 bytes cmem[0]
计算出来occupancy的结果为38%。为了提高占有率,试着修改maxrregcount=18。由于不太理解内部编译器如何去处理这个编译选项。所以有一个问题:我指定为18之后,那本来需要52个寄存器的程序,编译器如何优化为只有18个呢?
然后在项目属性->CUDA C/C+±>Command Line ->其他选项中添加–maxrregcount=18,可是编译信息提示为:
nvcc : fatal error : redefinition of argument ‘maxrregcount’。查看之后发现在所有选项中已经有-maxrregcount=0选项。
只是都在在linux下弄的,对VS下的设置不太熟悉,求版主大人指点!
刚找到一个帖子,ice版主的回复让我知道了原来是spill到local memory中。那这样的话,可能效率也不会很好。
您无需单独添加的,否则将会重复。您需要在您的属性中的max registers中改,而无需手工添加命令行(否则会重复)。
至于是为了提升occupancy而降低寄存器好呢?还是降低occupancy使用更多的寄存器好呢?
这个无定论,要看您的具体运行情况。
(这点手册也多次说明过)
感谢周末午夜来访。
找多了max Used registers选项,多谢版主的热心回复。谢谢!
maxrregcount 我認為應該不是只有單純的把rigister放到loacal而已,nvcc 似乎還會再做一些優化
我有試過我的程式其中一支kernel用了21個rigister(佔有率100%),
不加maxrregcount 參數則跑138ms
加上-maxrregcount =32還是用21個rigister但執行時間縮短成133ms
設定-maxrregcount =19的話執行時間變成131ms
從issue stall reasons來看的話執行的結構都改變了,另外查看從loacal傳輸的資料量並沒有改變
我沒有試著去看nvcc編譯的ptx檔案差多少,因為不太懂組合語言,我只是覺得沒這麼單純而已
我用win7-64bit、CUDA5.5、GTX650做的結果
寄存器的使用数量和nvcc无关的,是ptxas负责安排的。
以及,在贵卡上(3.0),一般认为使用<32个寄存器意义不大
(例如您这种使用21个还是19个)
至于nsight提供的issue stall reason的那些项目,我建议您暂时无视它。