cuda内联和非内联设备功能

cuda内联和非内联设备功能,cuda,inline,device,compiler-optimization,Cuda,Inline,Device,Compiler Optimization,根据文档,在计算能力为1.x的设备中,默认情况下编译器将内联\uuuuuu设备\uuuuuuuuu函数,但对于计算能力为2.x及更高的设备,只有在编译器认为合适的情况下才会这样做。什么时候不合适?还有一些限定符,如\uuuuu noinline\uuu和\uuu forceinline\uuu。在哪种情况下,最好不要内联\uuu设备\uuu函数?内联的编译器启发式算法可能会评估内联带来的潜在性能好处,这是由于消除了函数调用开销,而不是编译时等其他特性。积极的内联可能会导致非常大的代码,从而导致非

根据文档,在计算能力为1.x的设备中,默认情况下编译器将内联
\uuuuuu设备\uuuuuuuuu
函数,但对于计算能力为2.x及更高的设备,只有在编译器认为合适的情况下才会这样做。什么时候不合适?还有一些限定符,如
\uuuuu noinline\uuu
\uuu forceinline\uuu
。在哪种情况下,最好不要内联
\uuu设备\uuu
函数?

内联的编译器启发式算法可能会评估内联带来的潜在性能好处,这是由于消除了函数调用开销,而不是编译时等其他特性。积极的内联可能会导致非常大的代码,从而导致非常长的编译时间。通过观察为许多不同内核生成的代码,CUDA编译器似乎在绝大多数情况下都是内联的。请注意,在某些情况下,内联目前是不可能的,例如,当被调用的函数位于不同的、单独编译的编译单元中时


根据我的经验,覆盖编译器的内联启发式方法是有意义的实例很少。我使用了
\uuu noinline\uu
来限制代码大小,从而减少过多的编译时间。据我所知,使用
\uuuu noinline\uuu
对寄存器压力没有可预测的影响。内联可能允许更激进的代码移动,如负载调度,这可能会增加寄存器压力,而不内联可能会由于ABI对寄存器使用的限制而增加寄存器压力。我从未发现使用
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。就在最近的一次中,我内联调用了一个函数(只向函数传递了5个变量),内核执行时间从9.5ms减少到了4.5ms(几乎一半)。如果你想用一个星期或更多的时间运行相同的内核数亿次(像我的案例和许多其他在CFD或MD项目上工作的人),编译时间的增加与运行时的巨大节省相比并不重要。p>

总而言之,我认为值得尝试内联函数调用对运行时的影响,特别是对于运行时非常长的代码

可能是在回答您的问题。谢谢您的链接,但在哪些情况下显式使用noinline会有所帮助?例如,它是否有助于降低非常大的内核的寄存器压力?在我使用
\uuuu noinline\uuu
的情况下,它用于限制代码大小,从而减少过多的编译时间。据我所知,使用
\uuuu noinline\uuu
对寄存器压力没有可预测的影响。内联可能允许更激进的代码移动,如负载调度,这可能会增加寄存器压力,而不内联可能会由于ABI限制而增加寄存器压力。我从未发现过使用
\uuuuuu noinline\uuuuu
可以提高性能的情况,但当然也可能存在这种情况。@njuffa我认为你的评论值得回答。@Farzad:谢谢你的支持。我将评论扩展到下面的答案中,希望这能回答提问者的问题。