在编写CUDA应用程序时,您可以在驱动程序级别或运行时级别工作,如下图所示(库是CUFFT和CUBLAS,用于高级数学):
(来源:tomshw.it)
我假设这两者之间的折衷是提高低级API的性能,但代价是增加代码的复杂性。具体的区别是什么?有没有什么重要的事情是你不能用高级API来做的?
我正在使用CUDA.net与C#进行互操作,它是作为驱动程序API的副本构建的。这鼓励用C#编写大量相当复杂的代码,而使用运行时API的C++等效代码会更简单。这样做有什么好处吗?我能看到的一个好处是,它更容易将智能错误处理与C#代码的其余部分集成在一起。
4条答案
按热度按时间gg0vcinb1#
CUDA运行时可以将CUDA内核编译并链接到可执行文件中。这意味着您不必在应用程序中分发cubin文件,也不必通过驱动程序API处理加载它们。正如您所指出的,它通常更容易使用。
相比之下,驱动程序API更难编程,但对CUDA的使用提供了更多的控制。程序员必须直接处理初始化、模块加载等。
显然,通过驱动程序API比通过运行时API可以查询更详细的设备信息。例如,只能通过驱动程序API查询设备上可用的空闲内存。
CUDA程序员指南:
它由两个API组成:
这些API是互斥的:应用程序应该使用其中一个。
CUDA运行时通过提供隐式初始化、上下文管理和模块管理简化了设备代码管理。nvcc生成的C主机代码基于CUDA运行时(参见第4.2.5节),因此链接到此代码的应用程序必须使用CUDA运行时API。
相比之下,CUDA驱动程序API需要更多的代码,更难编程和调试,但提供了更好的控制级别,并且是独立于语言的,因为它只处理cubin对象(参见第4.2.5节)。特别是,使用CUDA驱动程序API配置和启动内核更加困难,因为执行配置和内核参数必须使用显式函数调用指定,而不是第4.2.3节中描述的执行配置语法。此外,设备模拟(请参见www.example.com部分4.5.2.9)不适用于CUDA驱动程序API。
API之间没有明显的性能差异。你的内核如何使用内存以及它们在GPU上的布局(以线程束和块的形式)将产生更明显的影响。
fhg3lkii2#
我发现,对于在多线程应用程序中部署库,对驱动程序API提供的CUDA上下文的控制至关重要。我的大多数客户都希望将GPU加速集成到现有的应用程序中,而现在,几乎所有的应用程序都是多线程的。因为我不能保证所有的GPU代码都能从同一个线程初始化、执行和释放,所以我不得不使用驱动程序API。
我最初尝试在运行时API中使用各种变通方法都失败了,有时是以惊人的方式-我发现我可以通过执行来自不同线程的错误CUDA调用集来重复地立即重新启动机器。
自从我们通过Driver API迁移了所有内容后,一切都很顺利。
yvgpqqbh3#
有几件重要的事情需要注意:
首先,API之间的差异仅适用于主机侧代码。内核完全相同。在主机侧,驱动程序API的复杂性是相当微不足道的,基本区别是:
在驱动程序API中,可以访问在运行时API之类的上下文中不可用的功能。
仿真器仅与为运行时API编写的代码一起工作。
哦,目前cudpp是一个非常方便的库,只适用于运行时API。
4dc9hkyq4#
参数对齐和驱动程序API存在一些真实的问题。查看CUDA 2.2 beta(或更高版本)文档以了解更多信息。