当前位置:  开发笔记 > 编程语言 > 正文

CUDA驱动程序API与CUDA运行时

如何解决《CUDA驱动程序API与CUDA运行时》经验,为你挑选了2个好方法。

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

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

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

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



1> mch..:

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
这是引用吗?如果是这样,我找不到它.你能说出确切的文件名和章节吗?

2> 小智..:

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

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

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

Ĵ

推荐阅读
刘美娥94662
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有