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

C/C++ "inline" keyword in CUDA device-side code

本文关键字:C++ inline 关键字 代码 CUDA      更新时间:2023-10-16

说到CUDA,我完全是个新手。如果我的问题微不足道,请原谅。

nvcc是否理解inline C关键字的含义?
我知道__forceinline__和类似的nvcc"宏",因此我不是在问如何编写inline cuda设备端代码。
我也知道,我的代码在nvcc和c/c++编译器之间"分裂"(我使用Visual Studio IDE)。
这是否意味着inline关键字在"站在"__device____global__内核旁边时被nvcc忽略?

编辑:
附:我搜索了cuda编程指南。我在inline条目下找不到任何有用的东西,类似的"标签"也没有帮助。

CUDA是c++家族中的一种编程语言。因此,CUDA文档通常不会复制标准c++文档,它只是指出差异和扩展。如果您在CUDA文档中找不到inline说明符与函数的使用描述,这是一个很好的迹象,表明它是以标准c++方式处理的。

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

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

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

所以inline仅仅是给编译器的一个建议,它可以自由地忽略它。由于CUDA编译器默认情况下会在设备代码中大量内联函数(出于性能原因),所以对于设备代码来说,使用inline似乎是相当多余的,但程序员可以自由使用它。

CUDA编译器使用的内联启发式可能会阻止程序员在所有情况下都希望内联的特定函数的内联。为此,CUDA提供了非标准的__forceinline__函数属性。该说明符影响设备代码和主机代码,因为nvcc将其转换为主机代码的等效主机编译器特定属性,例如__forceinline用于MSVC。这可以通过转储和检查nvcc发送给主机编译器的中间c++文件来验证。