CUDA驱动程序API与CUDA运行时

jquia 发布于 2018-05-18 c# 最后更新 2018-05-18 16:47 235 浏览

在编写CUDA应用程序时,您可以在驱动程序级别运行,也可以在运行级别运行,如图所示(这些库是用于高级数学的CUFFT和CUBLAS):

CUDA layer model 我假设两者之间的权衡是降低低级API的性能,但代价是代码复杂性的增加。什么是具体的差异,并且是否有任何重要的事情你不能用高级API来完成? 我使用CUDA.net与C#进行互操作,并将它构建为驱动程序API的副本。这鼓励在C#中编写大量相当复杂的代码,而使用运行时API可以使C++相当简单。这样做有什么可以赢吗?我可以看到的一个好处是,将智能错误处理与其他C#代码集成起来会更容易。
已邀请:

znihil

赞同来自:

CUDA运行时可以将您的CUDA内核编译并链接到可执行文件中。这意味着您不必在应用程序中分发cubin文件,或者通过驱动程序API处理它们。正如你所指出的,它通常更易于使用。 相比之下,驱动程序API很难编程,但提供了对CUDA使用方式的更多控制。程序员必须直接处理初始化,模块加载等。 显然,通过驱动程序API可以比通过运行时API查询更详细的设备信息。例如,设备上可用的空闲内存只能通过驱动程序API查询。 从CUDA程序员指南:

It is composed of two APIs:
  • A low-level API called the CUDA driver API,
  • A higher-level API called the CUDA runtime API that is implemented on top of the CUDA driver API.
These APIs are mutually exclusive: An application should use either one or the other. The CUDA runtime eases device code management by providing implicit initialization, context management, and module management. The C host code generated by nvcc is based on the CUDA runtime (see Section 4.2.5), so applications that link to this code must use the CUDA runtime API. In contrast, the CUDA driver API requires more code, is harder to program and debug, but offers a better level of control and is language-independent since it only deals with cubin objects (see Section 4.2.5). In particular, it is more difficult to configure and launch kernels using the CUDA driver API, since the execution configuration and kernel parameters must be specified with explicit function calls instead of the execution configuration syntax described in Section 4.2.3. Also, device emulation (see Section 4.5.2.9) does not work with the CUDA driver API.
API之间没有明显的性能差异。你的内核如何使用内存以及它们在GPU上的布局(经线和块)将会产生更为明显的效果。

funde

赞同来自:

一些重要的事情要注意: 首先,API之间的差异仅适用于主机端代码。内核完全一样。在主机方面,驱动程序api的复杂性相当微不足道,基本的区别是: 在驱动程序API中,您可以访问在上下文中运行时API中不可用的功能。 该仿真器仅适用于为运行时API编写的代码。 哦,目前的cudpp这是一个非常方便的库只适用于运行时API。

funde

赞同来自:

参数对齐和驱动程序API有一些实际问题。查看CUDA 2.2 beta(或更高版本)文档以获取更多信息。

qullam

赞同来自:

我发现为了在多线程应用程序中部署库,对由驱动程序API提供的CUDA上下文的控制是至关重要的。我的大多数客户都希望将GPU加速集成到现有的应用程序中,而现在,几乎所有的应用程序都是多线程的。由于我无法保证所有的GPU代码都会被同一个线程初始化,执行和释放,我不得不使用驱动程序API。 我在运行时API中进行各种变通的初始尝试都导致失败,有时甚至以惊人的方式发生 - 我发现我可以通过从不同线程执行错误的CUDA调用集,立即重新启动计算机。 由于我们通过Driver API迁移了所有内容,一切都很顺利。 Ĵ