Mic*_*ael 4 cuda inline device compiler-optimization
根据文档,在计算能力1.x的设备中,编译器将__device__默认内联函数,但对于计算能力2.x及更高的设备,只有在编译器认为合适的情况下才会这样做.什么时候不适合?还有一些限定词,如__noinline__和__forceinline__.在哪些情况下最好不要内联__device__函数?
nju*_*ffa 12
用于内联的编译器启发式推测可以评估内联的潜在性能优势,因为消除了对包括编译时间在内的其他特性的函数调用开销.积极的内联可能导致非常大的代码导致非常长的编译时间.通过观察为许多不同内核生成的代码,CUDA编译器似乎在绝大多数情况下都是内联的.请注意,在某些情况下,内联当前是不可能的,例如当被调用函数位于不同的,单独编译的编译单元中时.
根据我的经验,覆盖编译器内联启发式的有意义的实例很少见.我习惯于__noinline__限制代码大小,从而减少过多的编译时间.使用对__noinline__我所知的套准压力没有可预测的影响.内联可能允许更激进的代码移动,例如加载调度,这可能会增加寄存器压力,而不内联可能会因ABI对寄存器的使用限制而增加寄存器压力.我从未发现使用__noinline__改进性能的情况,但当然这种情况可能存在,可能是由于指令缓存效应.
我经历过,如果您强制将_device_函数调用内联编译,则可以将运行时间减少一半。就在最近的一次中,我进行了一个函数调用(仅向函数传递了5个变量),并且内核执行时间从9.5ms减少到4.5ms(几乎减少了一半)。而且,如果您考虑要在一周的总运行时间或更长的时间内运行同一内核数亿次(例如我的案例以及许多其他在CFD或MD项目上工作的案例),那么与庞大的编译时间相比,增加编译时间并不重要。在运行时保存。
总而言之,我认为值得尝试一下内联函数调用对运行时的影响,特别是对于运行时间非常长的代码。
| 归档时间: |
|
| 查看次数: |
9304 次 |
| 最近记录: |