当CUDA内核被调用时会发生什么

what happens when a CUDA kernel is called?

本文关键字:什么 调用 CUDA 内核      更新时间:2023-10-16

我想知道当像

这样的行在CUDA程序中会发生什么
myKernel<<<16,4>>>(arg1,arg2);
遇到

.

然后发生了什么?是CUDA驱动程序调用和ptx代码传递给它或什么?

" just works"。只是开玩笑。也许我会因为张贴这个答案而受到批评,因为我在这方面的知识并不广泛。但这是我能说的:

  • nvcc代码处理器是一个编译器驱动程序,这意味着它使用多个编译器并在一个方向或另一个方向上引导代码块。如果您有这样的问题,您可能需要在这里阅读更多关于nvcc工具链的信息。无论如何,一个 nvcc工具将做的事情是用一系列api调用(由各种cuda和GPU api库提供)替换内核启动语法mykernel<<<...>>>。这就是cuda驱动程序在引擎盖下被"调用"的方式。
  • 作为调用序列的一部分,驱动程序将执行各种任务。它将检查可执行文件,看它是否包含适当的SASS(设备组装)代码。该设备实际上并不执行PTX,它是一种中间代码,而是执行SASS。如果没有合适的SASS可用,但是映像中有PTX代码可用,驱动程序将执行一个jit编译步骤来创建SASS。(事实上,其中一些实际上发生在上下文创建时间/CUDA延迟初始化,而不是在内核启动时。)
  • 此外,在调用序列中,驱动程序将进行各种类型的设备状态检查,数据有效性检查(例如内核启动配置参数)和数据复制(例如内核sass代码,内核参数)到设备。最后,驱动程序将在设备上启动执行,然后立即将控制权返回给主机线程。
通过研究驱动程序API中的内核执行,可以获得对内核执行的更多了解。为了简单地描述驱动程序API,我可以将其称为比cuda运行时API更"低级"的API。然而,提到它的意义在于,它可以让我们深入了解如何将内核启动语法(运行时API)转换为实际上看起来像库调用的c级API。

可能会有人给出更好更详细的解释