CUDA程序中如何减少每个线程使用的寄存器数据,以提高occupancy?
LZ您好:
一般建议直接按照算法书写就可以了,编译器会尽量安排寄存器使用,实际使用的寄存器数量只是您kernel使用寄存器最多时刻的用量。
或者您可以考虑修改算法,减少寄存器使用量。
以及如果您真的需要指定最大寄存器用量,可以在VS的项目属性——配置属性——CUDA Rumtime API——GPU——Max Used Register这里指定,这样可以保证每个线程最大寄存器使用量,超出部分将被转为使用local memory。以及这样可能只是使得occupancy数值变得好看,实际因为使用了较慢的local memory可能会导致您的kernel变得更慢。
大致如此,祝您编码顺利~
[
谢谢您的回答!occupancy的大小和和序运行的效率没有直接关系是吗?
本来有同样的问题,在调试过程中也感觉到了斑竹说的这点。。
版主您好:
我按您说的在配置属性里修改了Max Used Register的值,确实使Occupancy达到了100%,但同时程序执行所用的时间也增加了,致使效率降低了,确实如版主所说!
再次感谢!!!
LZ您好:
Occupancy是高好还是低好,这个一般来说是高一些好。但并非是绝对的。
因为提高occupancy主要是为了有更多的线程可以相互掩盖延迟,以便让GPU跑满。
但是在有一定的occupancy的时候,甚至在某些kernel写法下在较低occupancy的时候,GPU的计算单元已经跑满/访存已经饱和,此时再通过其他手段提高occupancy并无实际好处。
比如您的情况,通过强制每个线程减少使用寄存器,提高的occupancy,但是此时会有一部分变量转而使用较慢的local memory,总体上会变得更慢。
总之,提高occupancy是手段而非目的,请综合辩证地看着这个指标。
祝您编码顺利~