根据文档,在计算能力为1.x的设备中,编译器将默认内联__device__函数,但对于计算能力为2.x或更高的设备,只有在编译器认为合适的情况下才会这样做。什么时候不这样做是合适的?还有一些限定符,比如__noinline__和__forceinline__。在哪些情况下,最好不要内联__device__函数?
发布于 2014-06-14 01:58:35
内联的编译器启发式可能评估了内联的潜在性能好处,内联是由于消除了函数调用开销而与其他特征(包括编译时间)相对应的。激进的内联可能导致非常大的代码,从而导致非常长的编译时间。通过观察为许多不同内核生成的代码,CUDA编译器似乎在绝大多数情况下都是内联的。请注意,在某些情况下,内联目前是不可能的,例如,当被调用的函数位于不同的单独编译的编译单元中时。
根据我的经验,覆盖编译器的内联启发式是很少见的。我使用__noinline__来限制代码大小,从而减少过多的编译时间。据我所知,__noinline__的使用对寄存器压力没有可预测的影响。内联可能允许更激进的代码移动,例如加载调度,这可能会增加寄存器压力,而不内联可能会由于ABI对使用寄存器的限制而增加寄存器压力。我从来没有发现过使用__noinline__提高性能的情况,但当然可能存在这样的情况,可能是由于指令缓存效应。
发布于 2017-07-28 20:23:28
我有过这样的经历,如果你强制__device__函数调用被内联编译,它可以将运行时间减少一半。就在最近的一个例子中,我进行了一次函数调用(只向函数传递了5个变量),内核执行时间从9.5ms减少到4.5ms (几乎减半)。如果你想要在总运行时间为一周或更长时间的情况下执行相同的内核数亿次(就像我的案例和其他许多处理CFD或MD项目的案例),那么与巨大的运行时间节省相比,增加编译时间并不重要。
总而言之,我认为值得尝试内联函数调用对运行时的影响,特别是对于运行时间非常长的代码。
https://stackoverflow.com/questions/24207227
复制相似问题