编写CUDA应用程序时,您可以在驱动程序级别或运行时级别工作,如此图像所示(库是CUFFT和CUBLAS用于高级数学运算):
(来源:tomshw.it)
我假设两者之间的权衡是低级API的性能提升,但代价是代码的复杂性增加.有什么具体的差异,是否有任何重要的事情,你不能用高级API?
我正在使用CUDA.net与C#进行互操作,它是作为驱动程序API的副本构建的.这鼓励在C#中编写许多相当复杂的代码,而使用运行时API的C++等效代码更简单.这样做有什么可以赢的吗?我能看到的一个好处是,将智能错误处理与其余的C#代码集成起来更容易.
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上下文的控制至关重要.我的大多数客户都希望将GPU加速集成到现有应用程序中,而现在几乎所有应用程序都是多线程的.由于我无法保证所有GPU代码都将从同一个线程初始化,执行和解除分配,因此我不得不使用驱动程序API.
我在运行时API中进行各种解决方法的初步尝试都导致失败,有时以惊人的方式 - 我发现我可以反复,通过执行来自不同线程的错误的CUDA调用来立即重启机器.
由于我们通过Driver API迁移了所有内容,所以一切都很好.
Ĵ