【问题标题】:Why are Cuda kernels annotated with `__global__` instead of `__kernel__` [closed]为什么用`__global__`而不是`__kernel__`注释Cuda内核[关闭]
【发布时间】:2021-11-11 17:57:01
【问题描述】:

实际上,标题已经是完整的问题。 为什么 Nvidia 决定将其 GPU 入口函数称为 kernels,但在 Cuda 中它们必须使用 __global__ 而非 __kernel__ 进行注释?

【问题讨论】:

  • 我建议完全改写这个问题,这样它就符合您给出的答案。换几个字是不行的。

标签: cuda


【解决方案1】:

目标是分离实体(内核)及其范围或位置。

与您的问题相关的函数分为三种类型:

  1. __device__ 函数只能从设备调用,它是 仅在设备中执行。
  2. __global__ 函数可以调用 来自主机,并在设备中执行。
  3. __host__ 函数在主机上运行,​​从主机调用。

如果他们将函数命名为作用域__kernel__,就无法按照上面的分隔方式来区分它们。

这里的__global__ 表示“在主机和设备之间共享的空间中”,在这些术语中表示“它们之间的全局区域”。

【讨论】:

  • 听起来有点合理,但有了这个论点,__global__ 函数应该可以从主机和设备调用。
  • @tomsch 他们是。看看 NVIDIA 开发者博客中这个动态并行示例中的 mandelbrot_block_k 函数:developer.nvidia.com/blog/introduction-cuda-dynamic-parallelism
  • 在这种情况下,“全局”是指“在主机和设备之间共享的空间中”,在这些术语中是“它们之间的全局区域”(更新了答案)。嗯,当然,这是NVIDIA对命名的一种选择。其他 API/框架使用不同的命名。例如,OpenCL 使用 __kernel 而不是 __global__ ,正如您所建议的那样。
  • @njuffa 我知道这样的例子。但是,此功能仅在 Cuda 5.0 中添加。在此之前这是不可能的,名称 __global__ 已经在 Cuda 5.0 中使用。也许,从一开始就计划了该功能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-21
  • 1970-01-01
  • 2010-12-24
  • 1970-01-01
  • 2011-10-22
相关资源
最近更新 更多