CUDA C++编程指南(7.1)——C++语言扩展之函数执行空间指定符

函数执行空间限定符用于指定函数是在主机上执行还是在设备上执行,以及是否可以从主机或设备调用。

7.1.1. global

__global__执行空间说明符将函数声明为内核。此类函数具有以下特性:

  • 在设备上执行,

  • 可从主机调用,

  • 对于计算能力5.0或更高的设备可从设备端调用。

一个 __global__ 函数必须具有 void 返回类型,并且不能是类的成员。

任何对__global__函数的调用都必须按照执行配置中所述指定其执行配置。

调用__global__函数是异步的,这意味着它在设备完成执行之前就会返回。

7.1.2. device

__device__执行空间说明符用于声明一个函数,该函数具有以下特性:

  • 在设备上执行,

  • 仅可从设备端调用。

__global__ 和 __device__ 执行空间说明符不能同时使用。

7.1.3. host

__host__执行空间说明符声明了一个函数,该函数是:

  • 在主机上执行,

  • 仅可从主机端调用。

这相当于声明一个仅带有__host__执行空间说明符的函数,或者声明一个不包含任何__host__、__device__或__global__执行空间说明符的函数;无论哪种情况,该函数都仅为主机编译。

__global__ 和 __host__ 执行空间说明符不能同时使用。

__device__ 和 __host__ 执行空间说明符可以同时使用,在这种情况下,函数会同时为主机和设备编译。 应用兼容性中介绍的 __CUDA_ARCH__ 宏可用于区分主机和设备之间的代码路径:

复制代码
__host__ __device__ func()
{
#if __CUDA_ARCH__ >= 800
   // Device code path for compute capability 8.x
#elif __CUDA_ARCH__ >= 700
   // Device code path for compute capability 7.x
#elif __CUDA_ARCH__ >= 600
   // Device code path for compute capability 6.x
#elif __CUDA_ARCH__ >= 500
   // Device code path for compute capability 5.x
#elif !defined(__CUDA_ARCH__)
   // Host code path
#endif
}

7.1.4. 未定义行为

当出现以下情况时,"跨执行空间"调用具有未定义行为:

  • __CUDA_ARCH__ 已定义的情况下,从 __global__、__device__ 或 __host__ __device__ 函数内部调用 __host__ 函数。

  • __CUDA_ARCH__ 未定义,从 __host__ 函数内部调用 __device__ 函数的情况。

7.1.5. noinline 和 forceinline

编译器会在认为适当时内联任何__device__函数。

__noinline__ 函数限定符可用作提示编译器尽可能不要内联该函数。

__forceinline__ 函数限定符可用于强制编译器内联该函数。

__noinline__ 和 __forceinline__ 函数限定符不能同时使用,且这两个限定符都不能应用于内联函数。

7.1.6. inline_hint

__inline_hint__限定符使编译器能够进行更激进的函数内联优化。与__forceinline__不同,它并不强制要求函数必须内联。在使用LTO(链接时优化)时,该限定符可用于提升跨模块的内联优化效果。

__noinline__ 和 __forceinline__ 函数限定符都不能与 __inline_hint__ 函数限定符一起使用。

相关推荐
建筑工程企业管理系统16 分钟前
工程进度统计管理系统自动化汇总数据,解决施工企业手工对账误差难题
大数据·人工智能·自动化
唠点键盘之外的20 分钟前
27 存量系统接大模型:旁挂一个 AI 微服务,老架构一行不改
人工智能·微服务·架构
kaixin_啊啊1 小时前
【用于更准确 G×E 基因组预测的大规模作物数据集与基于深度学习的多模态融合框架】论文学习
人工智能·深度学习·学习
GOWIN革文品牌咨询1 小时前
工业测量品牌系统化搭建指南:从内容架构到长期治理的全流程
大数据·人工智能·架构
xier_ran1 小时前
【infra之路】AI 编译器学习笔记(六):重拾 C++——lambda 与 MLIR 中的回调
c++·笔记·学习
拿本唠嗑AI研究1 小时前
本体工程实战指南:从建模到可维护的完整落地路径
java·人工智能·python·jena·ontology
deepseek231 小时前
AI 模型隐藏任意能力拆解:把加密神经网络塞进宿主权重,能力评估为什么在密码学上抓不到
人工智能·深度学习·神经网络·密码学·模型安全
揽秀亭长1 小时前
从音频到五线谱,自动扒谱的完整技术流程
人工智能
Smoothcloud润云1 小时前
PyTorch推理服务模型热切换与失败回滚实战:降低版本更新中断
服务器·人工智能·pytorch·python·深度学习·gpu
冬奇Lab1 小时前
开源项目第236期:PentAGI — 全自主渗透测试多智能体系统,自带 20+ 专业工具箱
人工智能·开源·资讯