C/C++ "inline" CUDA 设备端代码中的关键字
C/C++ "inline" keyword in CUDA device-side code
说到 CUDA,我完全 "newbie"。所以如果我的问题是微不足道的,请原谅我。
nvcc 是否理解 inline
C 关键字的含义?
我知道 __forceinline__
和类似的 nvcc "macros",因此我不是在问如何编写 inline
cuda 设备端代码。
我也知道,我的代码在 nvcc 和 c/c++ 编译器之间是 "split"(我正在使用 Visual Studio IDE)。
这是否意味着 inline
关键字在 "stands next to" __device__
或 __global__
内核时被 nvcc 忽略?
编辑:
P.S。我搜索过cuda编程指南。我在 inline
条目下找不到任何有用的东西,类似 "tags" 也没有帮助。
CUDA 是 C++ 家族中的一种编程语言。因此,CUDA 文档一般不会重复标准的 C++ 文档,它只是指出差异和扩展。如果您在 CUDA 文档中找不到对 inline
说明符与函数一起使用的描述,这很好地表明它是以标准 C++ 方式处理的。
在您的问题的各个部分之间进行插值,您似乎最关心 inline
的使用如何影响生成代码中函数的实际内联。
ISO C++11 标准在第 7.1.2 节中将 inline
指定为函数属性。除了关于链接和重复定义的规定外,它还规定了以下关于使用 inline
说明符的函数的实际内联:
The inline specifier indicates to the implementation that inline
substitution of the function body at the point of call is to be
preferred to the usual function call mechanism. An implementation is
not required to perform this inline substitution at the point of call;
所以 inline
只是对编译器的 建议 ,它可以随意忽略。由于 CUDA 编译器默认情况下会在设备代码中积极地内联函数(出于性能原因),因此 inline
的使用对于设备代码来说似乎是多余的,但程序员可以自由使用它。
CUDA 编译器使用的内联试探法可能会阻止程序员在任何情况下都希望内联的特定函数的内联。为此,CUDA 提供了非标准的 __forceinline__
函数属性。此说明符同时影响设备代码和主机代码,因为 nvcc
将其转换为主机代码的等效主机编译器特定属性,例如 MSVC 的 __forceinline
。这可以通过转储和检查 nvcc
发送到主机编译器的中间 C++ 文件来验证。
说到 CUDA,我完全 "newbie"。所以如果我的问题是微不足道的,请原谅我。
nvcc 是否理解 inline
C 关键字的含义?
我知道 __forceinline__
和类似的 nvcc "macros",因此我不是在问如何编写 inline
cuda 设备端代码。
我也知道,我的代码在 nvcc 和 c/c++ 编译器之间是 "split"(我正在使用 Visual Studio IDE)。
这是否意味着 inline
关键字在 "stands next to" __device__
或 __global__
内核时被 nvcc 忽略?
编辑:
P.S。我搜索过cuda编程指南。我在 inline
条目下找不到任何有用的东西,类似 "tags" 也没有帮助。
CUDA 是 C++ 家族中的一种编程语言。因此,CUDA 文档一般不会重复标准的 C++ 文档,它只是指出差异和扩展。如果您在 CUDA 文档中找不到对 inline
说明符与函数一起使用的描述,这很好地表明它是以标准 C++ 方式处理的。
在您的问题的各个部分之间进行插值,您似乎最关心 inline
的使用如何影响生成代码中函数的实际内联。
ISO C++11 标准在第 7.1.2 节中将 inline
指定为函数属性。除了关于链接和重复定义的规定外,它还规定了以下关于使用 inline
说明符的函数的实际内联:
The inline specifier indicates to the implementation that inline substitution of the function body at the point of call is to be preferred to the usual function call mechanism. An implementation is not required to perform this inline substitution at the point of call;
所以 inline
只是对编译器的 建议 ,它可以随意忽略。由于 CUDA 编译器默认情况下会在设备代码中积极地内联函数(出于性能原因),因此 inline
的使用对于设备代码来说似乎是多余的,但程序员可以自由使用它。
CUDA 编译器使用的内联试探法可能会阻止程序员在任何情况下都希望内联的特定函数的内联。为此,CUDA 提供了非标准的 __forceinline__
函数属性。此说明符同时影响设备代码和主机代码,因为 nvcc
将其转换为主机代码的等效主机编译器特定属性,例如 MSVC 的 __forceinline
。这可以通过转储和检查 nvcc
发送到主机编译器的中间 C++ 文件来验证。