关于在常规 C 编码中何时使用内联函数以及何时避免使用内联函数,有很多建议。__forceinline__
对 CUDA C__device__
函数有什么影响?它们应该在哪里使用以及在哪里避免?
问问题
8574 次
1 回答
8
通常,nvcc
设备代码编译器会自行决定何时内联特定__device__
函数,一般来说,您可能不需要担心用__forceinline__
装饰器/指令覆盖它。
cc 1.x 设备不具备与较新设备相同的硬件功能,因此编译器通常会自动内联这些设备的功能。
我认为指定的原因与__forceinline__
您可能已经了解的主机 C 代码相同。当编译器可能不会以其他方式内联函数时(例如在 cc 2.x 或更新的设备上),它通常用于优化。如果您只调用一次函数,这种优化(即函数调用开销)可能可以忽略不计,但如果您在循环中调用函数,例如,确保它被内联可能会显着改善代码执行。
作为一个反例,内联和递归通常有禁忌症。对于调用自身的递归函数,我认为不可能处理任意递归和严格的内联。因此,如果您打算递归使用函数(在 cc 2.x 及更高版本中支持),您可能不想指定__forceinline__
.
一般来说,我认为你应该让编译器为你管理这个。它将智能地决定是否内联函数。
于 2013-11-11T02:24:43.167 回答