15

关于在常规 C 编码中何时使用内联函数以及何时避免使用内联函数,有很多建议。__forceinline__对 CUDA C__device__函数有什么影响?它们应该在哪里使用以及在哪里避免?

4

1 回答 1

8

通常,nvcc设备代码编译器会自行决定何时内联特定__device__函数,一般来说,您可能不需要担心用__forceinline__装饰器/指令覆盖它。

cc 1.x 设备不具备与较新设备相同的硬​​件功能,因此编译器通常会自动内联这些设备的功能。

我认为指定的原因与__forceinline__您可能已经了解的主机 C 代码相同。当编译器可能不会以其他方式内联函数时(例如在 cc 2.x 或更新的设备上),它通常用于优化。如果您只调用一次函数,这种优化(即函数调用开销)可能可以忽略不计,但如果您在循环中调用函数,例如,确保它被内联可能会显着改善代码执行。

作为一个反例,内联和递归通常有禁忌症。对于调用自身的递归函数,我认为不可能处理任意递归和严格的内联。因此,如果您打算递归使用函数(在 cc 2.x 及更高版本中支持),您可能不想指定__forceinline__.

一般来说,我认为你应该让编译器为你管理这个。它将智能地决定是否内联函数。

于 2013-11-11T02:24:43.167 回答