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

时间:2013-05-29 13:46:52

标签: c++ cuda

我想知道当像

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

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

1 个答案:

答案 0 :(得分:3)

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

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

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

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