饿了一部分,当我使用太多的寄存器,基本上有3个选项我能做得到的内核:确定最注册内核
- 离开内核,因为它是导致低入住
- 集编译器使用数量较少的寄存器,它们溢出,导致糟糕的表现
- 重写内核
选项3,我想知道哪个内核的一部分需要记数的最大数量ERS。有没有任何工具或技术可以让我识别这部分?通过PTX代码(我在NVidia上开发)读取没有帮助,寄存器有很多数字,说实话,我能做的最好的是确定汇编代码的哪一部分映射到C代码的哪一部分。
只是注释掉一些代码并不是一个很好的方法 - 例如,我注意到如果我只是把代码放到循环中,寄存器的数量会大大增加,不仅仅是一个循环控制变量。我个人怀疑NVidia编译器是从不完善的变量生存分析中,但当然我不能用这么做:-)
嗯,我知道这个“理论”,但我宁愿寻找好的工具。我不确定编译器使用了多少优化,但是一个好的编译器可以改变很多代码。例如,使用循环展开(肯定会完成),所使用的寄存器数量会增加变量数量。 –