You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何CUDA内核需使用`__global__`标注而非`__kernel__`?

英伟达为何将GPU入口函数命名为kernels,却在CUDA中要求这类函数使用__global__而非__kernel__进行标注?

首先需要明确:kernel(核函数)是并行计算领域沿用了数十年的通用术语,并非CUDA或OpenCL专属命名,英伟达只是沿用了行业通用叫法。两者修饰符命名的差异主要有三个原因:

  • 时间线先后问题:CUDA 1.0正式发布于2007年,是行业内第一个商用GPU通用计算框架。而使用__kernel__作为核函数修饰符的OpenCL 1.0标准,是Khronos组织在2008年底才推出的。CUDA的语法规范制定时OpenCL标准尚未落地,不存在参考__kernel__命名的前提。
  • 修饰符的语义设计逻辑更清晰:CUDA最初设计函数修饰符时,核心逻辑是标注函数的调用方空间和执行空间,三个基础修饰符的语义完全自洽:
    • __host__:只能由CPU侧(主机端)代码调用,在CPU上执行
    • __device__:只能由GPU侧(设备端)代码调用,在GPU上执行
    • __global__:可以由CPU侧代码调用,在GPU上执行,也就是我们所说的GPU核函数入口
      这种命名方式比单纯标识“这是一个核函数”的__kernel__信息量更高,开发者看到修饰符就能直接明确函数的调用、执行规则。
  • 生态兼容性考量:在OpenCL推出时,CUDA已经拥有了规模不小的开发者生态,大量存量代码已经基于__global__规范编写。如果强行修改修饰符命名对齐OpenCL,会直接打破所有存量CUDA代码的兼容性,显然是得不偿失的选择。

补充说明:目前较新版本的NVCC编译器已经兼容__kernel__修饰符的写法,会自动将其等效为__global__处理,方便同时写OpenCL和CUDA代码的开发者迁移,但官方标准依然推荐使用原生的__global__修饰符。

内容的提问来源于stack exchange,提问作者tommsch

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 23:54:03