CUDA驱动程序API与CUDA运行时

Mor*_*sen 39 c# c++ cuda gpgpu cuda.net

编写CUDA应用程序时,您可以在驱动程序级别或运行时级别工作,如此图像所示(库是CUFFT和CUBLAS用于高级数学运算):

CUDA层模型
(来源:tomshw.it)

我假设两者之间的权衡是低级API的性能提升,但代价​​是代码的复杂性增加.有什么具体的差异,是否有任何重要的事情,你不能用高级API?

我正在使用CUDA.net与C#进行互操作,它是作为驱动程序API的副本构建的.这鼓励在C#中编写许多相当复杂的代码,而使用运行时API的C++等效代码更简单.这样做有什么可以赢的吗?我能看到的一个好处是,将智能错误处理与其余的C#代码集成起来更容易.

mch*_*mch 40

CUDA运行时可以将CUDA内核编译并链接到可执行文件中.这意味着您不必在应用程序中分发cubin文件,也不必通过驱动程序API处理它们.如您所知,它通常更容易使用.

相比之下,驱动程序API更难编程,但提供了对CUDA使用方式的更多控制.程序员必须直接处理初始化,模块加载等.

显然,通过驱动程序API可以查询比通过运行时API更详细的设备信息.例如,只能通过驱动程序API查询设备上可用的空闲内存.

来自CUDA程序员指南:

它由两个API组成:

  • 一种称为CUDA驱动程序API的低级API,
  • 一种更高级的API,称为CUDA运行时API,它在CUDA驱动程序API之上实现.

这些API是互斥的:应用程序应该使用其中一个.

CUDA运行时通过提供隐式初始化,上下文管理和模块管理来简化设备代码管理.由nvcc生成的C主机代码基于CUDA运行时(参见第4.2.5节),因此链接到此代码的应用程序必须使用CUDA运行时API.

相比之下,CUDA驱动程序API需要更多代码,更难编程和调试,但提供更好的控制级别,并且与语言无关,因为它只处理cubin对象(参见第4.2.5节).特别是,使用CUDA驱动程序API配置和启动内核更加困难,因为必须使用显式函数调用而不是第4.2.3节中描述的执行配置语法来指定执行配置和内核参数.此外,设备仿真(参见第4.5.2.9节)不适用于CUDA驱动程序API.

API之间没有明显的性能差异.你的内核如何使用内存以及它们在GPU上的布局(在warp和block中)将产生更明显的效果.

  • "这些API是互斥的":对于较新的CUDA版本,这已不再适用.现在,文档说明了"应用程序可以将运行时API代码与驱动程序API代码混合在一起."另外还有.http://stackoverflow.com/a/27014990/1938163 (6认同)
  • 这是引用吗?如果是这样,我找不到它.你能说出确切的文件名和章节吗? (2认同)

小智 20

我发现,为了在多线程应用程序中部署库,对驱动程序API提供的CUDA上下文的控制至关重要.我的大多数客户都希望将GPU加速集成到现有应用程序中,而现在几乎所有应用程序都是多线程的.由于我无法保证所有GPU代码都将从同一个线程初始化,执行和解除分配,因此我不得不使用驱动程序API.

我在运行时API中进行各种解决方法的初步尝试都导致失败,有时以惊人的方式 - 我发现我可以反复,通过执行来自不同线程的错误的CUDA调用来立即重启机器.

由于我们通过Driver API迁移了所有内容,所以一切都很好.

Ĵ

  • 您能否详细说明或链接到某个地方,解释直接使用驱动程序如何帮助您控制这些不同任务的时间? (2认同)

小智 5

有几点需要注意:

首先,API 之间的差异仅适用于主机端代码。内核完全相同。在主机端,驱动程序 api 的复杂性相当微不足道,根本区别是:

在驱动程序 api 中,您可以访问运行时 api 中不可用的功能,例如上下文。

模拟器仅适用于为运行时 API 编写的代码。

哦,目前 cudpp 这是一个非常方便的库,只能与运行时 api 一起使用。