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

5

我对CUDA完全是一个“新手”,所以如果我的问题很简单,请原谅。

nvcc是否理解C语言中的inline关键字?
我了解__forceinline__和类似的nvcc“宏”,因此我不是在问如何编写inline cuda设备端代码。
我也知道,我的代码被nvcc和c/c++编译器“分割”(我正在使用Visual Studio IDE)。
这是否意味着当inline关键字“与”__device____global__内核“并列”时,nvcc会忽略它?

编辑:
附注:我已经搜索了CUDA编程指南。我在inline条目下没有找到任何有用的信息,类似的“标签”也没有帮助。


1
不确定你在问什么。CUDA文档不会重复C++标准文档,而是记录与其的差异。ISO C++定义了“inline关键字指示实现应优先使用函数内联替换来替代通常的函数调用机制。实现不需要在调用点执行此内联替换;[...]”。nvcc根据标准接受inline建议。 - njuffa
1个回答

7
CUDA是C++家族中的一种编程语言。因此,CUDA文档通常不会重复标准C++文档,而只是指出差异和扩展。如果您在CUDA文档中找不到使用内联说明符的函数描述,那么这表明它是以标准C++的方式处理的。
根据您问题的各个部分之间的插值,似乎您最关心的是inline使用如何影响生成代码中函数的实际内联化。
ISO C++11标准在第7.1.2节中将inline指定为函数属性。除了有关链接和重复定义的规定外,它还规定了以下关于具有inline说明符的函数实际内联化的内容:
引用:

内联说明符指示实现优先考虑在调用点处进行函数体的内联替换而不是使用通常的函数调用机制。实现不需要在调用点执行此内联替换。

因此,inline仅是对编译器的建议,编译器可以自由忽略它。由于CUDA编译器默认情况下会在设备代码中积极地进行函数内联(出于性能原因),因此,在设备代码中使用inline似乎相当冗余,但程序员可以自由使用它。
CUDA编译器使用的内联启发式算法可能会防止程序员希望在所有情况下都进行内联的特定函数内联化。为此,CUDA提供了非标准的__forceinline__函数属性。此说明符影响设备代码和主机代码,因为nvcc将其转换为主机编译器特定的等效属性,例如MSVC的__forceinline用于主机代码。可以通过转储并检查nvcc发送到主机编译器的中间C++文件来验证这一点。

谢谢你的回答。这正是我在寻找的。抱歉问题不够清晰。顺便说一下,我不知道__forceinline__会影响主机和设备代码。这可能看起来微不足道,但最终它帮助我更好地理解了CUDA。 - PatrykB

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接