c++ - 调用 CUDA 内核时会发生什么?

标签 c++ cuda

我想知道在 CUDA 程序中,当像这样的行时会发生什么

myKernel<<<16,4>>>(arg1,arg2);

遇到了。

然后会发生什么?是调用了 CUDA 驱动程序并将 ptx 代码传递给它还是什么?

最佳答案

“它只是有效”。只是在开玩笑。可能我会因为发布这个答案而受到抨击,因为我在这方面的知识并不广泛。但这是我能说的:

  • nvcc 代码处理器是一个编译器驱动程序,这意味着它使用多个编译器并在一个或另一个方向上控制代码片段。您可能想阅读有关 nvcc 工具链的更多信息 here如果你有这样的问题。总之, nvcc 工具要做的事情之一是替换内核启动语法 mykernel<<<...>>>带有一系列 api 调用(由各种 cuda 和 GPU api 库提供服务)。这就是 cuda 驱动程序在幕后被“调用”的方式。
  • 作为此调用序列的一部分,驱动程序将执行各种任务。它将检查可执行文件以查看它是否包含适当的 SASS(设备程序集)代码。设备实际上并不执行 PTX ,这是一个中间代码,但是SASS。如果没有合适的 SASS 可用,但图像中有 PTX 代码,驱动程序将执行 JIT-compile。创建 SASS 的步骤。 (事实上​​,其中一些实际上发生在上下文创建时间/CUDA 惰性初始化时,而不是在内核启动时。)
  • 此外,在调用序列中,驱动程序将对设备进行各种类型的设备状态检查、数据有效性检查(例如内核启动配置参数)和数据复制(例如内核 sass 代码、内核参数)。<
  • 最后,驱动程序将在设备上启动执行,然后立即将控制权返回给主机线程。

可以通过研究 kernel execution in the driver API 获得对内核执行的更多了解。 .为了简要描述驱动程序 API,我可以将其称为比 cuda 运行时 API 更“低级”的 API。但是,提及它的目的是它可以让您深入了解如何将内核启动语法(运行时 API)转换为实际上看起来像库调用的 C 级 API。

其他人可能会给出更好/更详细的解释。

关于c++ - 调用 CUDA 内核时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16815666/

相关文章:

c++ - 为什么我的 CUDA 应用程序没有启动?

c++ - 起源 - 不变的还是新的类型?

c++ - 将 void* 转换为模板类型时不知道模板参数类型

c++ - 结合CUDA 9和GCC4.3编译的C++软件

cuda - GPU/CUDA 核心是 SIMD 核心吗?

c++ - __device__ 类成员函数更改设备变量的值后从设备复制到主机时出现 cudaMemcpy 错误

c++ - 为什么不允许无符号 OpenMP 索引变量?

c++ - 调试错误 R6010 - 已调用 abort()

c++ - 对静态变量的 undefined reference

cuda - GPU 在 Julia 集合计算中没有提供性能改进