CUDA 设备端代码中的 C/C++ "inline" 关键字
C/C++ "inline" keyword in CUDA device-side code
说到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++文件来验证。
- 激励'inline'说明符的真实世界示例?
- C++中的"inline"关键字
- -fvisibility-inline-hidden 与 gcc 中的 -fvisibility=hidden 有何不同
- 'inline'变量可以像内联函数一样内联吗?
- C++编译器不喜欢"using INLINE = extern inline"
- "inline"、"constexpr"或"noexcept"
- C++17 'inline variable' vs 'extern' 关键字继承自 C 的新功能
- C++不使用"inline"或"static"无类函数的关键字时出现重定义链接错误
- c++17 inline + thread_local vs thread_local
- Inline STD :: MUTEX在标题文件中
- asm inline vs 2015 with call RegCreateKeyEx
- 用std :: stringstream inline代替字符
- "inline operator T*() const"是什么意思?
- 如何在Visual Studio中禁用自动插入'inline'关键字?
- 将新元素推送到函数指针映射中 "inline" ?
- 什么是模板<>inline bla bla
- 使用Inline ASM调用WriteProcessMemory时出错
- 为什么静态内联变量需要"inline"?
- C++ - Xcode "Inline Function Expansion"像Visual Studio中的优化功能一样?
- Windows / Intel Compiler / Inline Assembler & GNU 语法问题