zen*_*nna 11 optimization cuda gpgpu
我有一个使用17个寄存器的内核,将它减少到16会给我100%的占用率.我的问题是:是否有可用于减少所用数量或寄存器的方法,不包括以不同方式完全重写我的算法.我总是认为编译器比我更聪明,所以例如我为了清晰起见而经常使用额外的变量.这个想法我错了吗?
请注意:我确实知道--max_registers(或任何语法)标志,但使用本地内存会比占用率降低25%更有害(我应该测试一下)
占用可能有点误导,100%的入住率不应该是您的主要目标.如果您可以完全合并访问全局内存,那么在高端GPU上50%的占用率足以隐藏全局内存的延迟(对于浮点数,甚至更低的双倍数).有关此主题的更多信息,请查看去年GTC 的高级CUDA C演示文稿.
在您的情况下,您应该在maxrregcount设置为16的情况下测量性能.本地内存的延迟应该由于具有足够的线程而隐藏,假设您不随机访问本地数组(这将导致非合并访问).
要回答关于减少寄存器的具体问题,请发布代码以获得更详细的答案!了解编译器的工作原理可能有所帮助,但请记住,nvcc是一个具有大参数空间的优化编译器,因此最小化寄存器数必须与整体性能相平衡.
真的很难说,在我看来,nvcc编译器并不是很聪明.
您可以尝试显而易见的事情,例如使用short而不是int,通过引用传递和使用变量(例如&变量),展开循环,使用模板(如在C++中).如果你有分裂,超越函数,按顺序应用,尝试将它们作为循环.尝试摆脱条件,可能用冗余计算替换它们.
如果你发布一些代码,也许你会得到具体的答案.