CUDA设备端代码

时间:2016-10-26 09:29:41

标签: c++ cuda inline keyword

对于CUDA,我完全是“新手”。所以,如果我的问题是微不足道的,请原谅我。

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

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

1 个答案:

答案 0 :(得分:5)

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

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

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

  

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

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

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