2008-10-28 135 views
33

在编写CUDA应用程序,您可以在驱动程序级别或在运行时级别在这个图像上所示的工作(该库是CUFFT和CUBLAS的高等数学):CUDA驱动程序API对CUDA运行时

CUDA layer model

我认为两者之间的权衡是降低低级API的性能,但代价是代码复杂度增加。具体的区别是什么?有没有什么重要的事情你不能用高级API来做?

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

+4

一个驱动程序API的优势将是编译器开发人员添加其他语言编写内核支持,C. – 2009-10-21 22:12:37

回答

31

CUDA运行时可以编译CUDA内核并将其链接到可执行文件中。这意味着您不必在应用程序中分发cubin文件,或者通过驱动程序API处理它们。正如你所指出的,它通常更易于使用。

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

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

从CUDA程序员指南:

它由两个API组成:

  • 一个低级别的API调用CUDA驱动程序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上的布局(经线和块)将会产生更为明显的效果。

+2

的CUDA子集,一个引用?如果是这样,我找不到它。你能说出确切的文件名称和章节在哪里发现? – dialer 2012-06-16 13:19:54

+5

`这些API是互斥的:对于更新的CUDA版本,这不再是真实的。现在该文档声明`一个应用程序可以将运行时API代码与驱动程序API代码混合在一起.`也是cfr。 http://stackoverflow.com/a/27014990/1938163 – 2014-11-19 11:00:05

2

了几个重要的事情需要注意:

第一的API之间的差异仅适用于主机端的代码。内核完全一样。在主机端,驱动程序api的复杂性相当微不足道,其基本区别如下:

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

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

哦,目前的cudpp这是一个非常方便的库,仅适用于运行时api。

0

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

+1

今天这种情况仍然存在吗? – einpoklum 2016-02-01 22:35:57

15

我发现为了在多线程应用程序中部署库,对驱动程序API提供的CUDA上下文的控制至关重要。我的大多数客户都希望将GPU加速集成到现有的应用程序中,而现在,几乎所有的应用程序都是多线程的。由于我无法保证所有的GPU代码都会被同一个线程初始化,执行和释放,所以我不得不使用驱动程序API。我发现我可以反复地通过执行来自不同线程的错误的CUDA调用集合,立即重新启动计算机,从而导致失败,有时会以惊人的方式失败。

由于我们将所有内容都通过驱动程序API进行了迁移,所以一切正常。

Ĵ

相关问题