2013-05-29 34 views
0

我想知道是遇到像调用CUDA内核时会发生什么?

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

线当在CUDA程序会发生什么。

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

+3

你看过编译器的汇编输出了吗? – stefan

回答

3

“It just works”。开玩笑。也许我会因为发布这个答案而发火,因为我在这方面的知识并不多。但是,我可以这样说:

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

通过研究kernel execution in the driver API可以获得对内核执行的更多见解。为了简要描述驱动程序API,我可以将它称为“低级”API而不是cuda运行时API。然而,需要指出的是,它可以提供一些有关如何将内核启动语法(运行时API)转换为实际看起来像库调用的C级API的信息。

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