CUDA设备端代码中的C/C++"inline"关键字

Pat*_*ykB 3 c++ cuda inline keyword

当谈到CUDA时,我完全是"新手".所以,如果我的问题是微不足道的,请原谅我.

nvcc是否理解inlineC关键字的含义?
我知道__forceinline__,和类似的nvcc"宏",因此我不是在问如何编写inlinecuda设备端代码.
我也知道,我的代码在nvcc和c/c ++编译器之间"分开"(我正在使用Visual Studio IDE).
这是否意味着inline当nvcc"紧挨着" __device____global__内核时,nvcc会忽略该关键字?

编辑:
PS我曾搜索过cuda编程指南.我在inline条目下找不到任何有用的东西,类似的"标签"也无济于事.

nju*_*ffa 5

CUDA是C++系列中的一种编程语言.因此,CUDA文档通常不会复制标准C++文档,它只是指出差异和扩展.如果inline在CUDA文档中找不到使用说明符和函数说明的描述,那么这表明它是以标准C++方式处理的.

在您的问题的各个部分之间进行插值,似乎您最关心的是如何使用inline会影响生成的代码中的函数的实际内联.

ISO C++ 11标准inline在7.1.2节中指定为函数属性.除了关于链接和重复定义的规定之外,它还说明了以下关于使用说明inline符实际内联函数的内容:

内联说明符向实现指示在调用点处函数体的内联替换优先于通常的函数调用机制.在呼叫点执行此内联替换不需要实现;

所以inline这只是对编译器的建议,它可以自由忽略.由于CUDA编译器默认在设备代码中积极地内联函数(出于性能原因),因此inline对设备代码的使用似乎非常冗余,但程序员可以自由使用它.

CUDA编译器使用的内联启发式可以防止内联程序员想要在所有情况下内联的特定函数的内联.为此,CUDA提供非标准__forceinline__函数属性.此说明符会影响设备代码和主机代码,因为nvcc它会将其转换为主机代码的等效主机编译器特定属性,例如__forceinlineMSVC.这可以通过转储和检查nvcc发送到主机编译器的中间C++文件来验证.