更新:以下原始问题仍然是一个很好的问题,询问有关Numba中GPU编程的一般设计原理,它与预测寄存器使用情况并不完全相同。从那以后,我还发现无需预测寄存器使用情况,因为Numba中有一个未记录的命令可以准确告诉您寄存器的使用情况。这可以通过试错来减少寄存器的使用,但是可以将其转换为一般性的直觉以及寄存器使用策略,这个问题是在问什么。在此问题之前添加的链接要求回答包含不回答此问题的错误信息。这些链接和对该问题的评论完全不正确地声称不能从numba确定寄存器的使用。这是绝对不正确的,numba提供了一个尚未记录的私有方法来完全做到这一点。这个问题不是问这个。它询问一个人如何在策略上进行预先设计以最大程度地减少寄存器使用。
如果内核使用64个以上的寄存器,则在许多cuda设备上,不能使用最大数量的可用线程。我发现我的代码似乎还使用了更多的寄存器,这比通过目视扫描中间结果的数量所猜测的要多。偶数循环为寄存器计数增加了很多。
那么如何才能看到使用寄存器的罪魁祸首?
如果有一种方法可以查看kernel.inspect_types()输出中可用的numba IR,我会满足一些经验法则甚至更好。
Numba IR代码中的$ sigil变量和寄存器之间是否有等效项?
我意识到我可以通过查看._func.info和_.fun.get()。attr来获取内核的总寄存器数,这很有用。但这并不能告诉您代码中的哪个方面导致寄存器数量激增。
所以我想要一种能够猜测得更好或者可以在Numba IR中实际看到它的方法。
有什么见解吗?
具体,这是此人发布的一个简单例子: https://gist.github.com/sklam/0e750e0dea7571c68e94d99006ae8533
当我说经验法则时,我想也许它们看起来像这样
对于不共享的全局内存中的每个获取添加一个 记忆
为每个二进制运算符(例如+或*
为每个输入变量名称添加一个(例如,指向全局变量的指针)
为每个局部变量添加一个。
但是实际上,我看到的寄存器使用量超过了该数量。而且,当我包含循环或if语句时,我还看到寄存器数量大量增加。因此,我知道我做错了。
底线 如何巧妙地减少寄存器数量? 我意识到优化编译器可能会在技巧上重新排序代码或选择何时将变量设置为寄存器或主存储器,但我仍然认为应该遵循一条规则来减少寄存器使用量