1

我想知道当一行像

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

遇到。

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

4

1 回答 1

5

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

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

通过研究驱动程序 API 中的内核执行,可以获得对内核执行的更多了解。为了简要描述驱动 API,我可以将其称为比 cuda 运行时 API 更“低级”的 API。然而,提到它的意义在于,它可以让我们深入了解如何将内核启动语法(运行时 API)翻译成实际上看起来像库调用的 C 级 API。

其他人可能会提供更好/更详细的解释。

于 2013-05-29T14:31:39.663 回答