当写CUDA应用程序,可以在驱动的水平或在运行时的水平如图所示,在这个图像(该图书馆是CUFFT和CUBLAS对高级数学):

CUDA layer model
(资料来源: tomshw.它的)

我假设之间的权衡两者的增加表现为低埃API但在成本增加的复杂性的代码。什么具体的差异,以及是否有任何重大事你不能做的高级别API?

我使用CUDA.net 对于互操作C#并且它是建立一个副驾驶员。这鼓励写了很多相当复杂的码在C#而C++相当于将更为简单的使用的运行时API。是否有任何事情来赢得通过这种方式?在一个益处是我可以看到的是,它是更容易向整合的智能的错误处理与其他C#代码。

有帮助吗?

解决方案

CUDA运行时使得能够编制和链接你CUDA内核成为可执行文件。这意味着你没有分发cubin文件应用程序,或处理装载它们通过的驱动程序。正如你已经指出,这是一般更容易使用。

与此相反,司机API难的程序,但提供了更多的控制如何CUDA是使用。程序员有直接处理与初始化模块的装载等。

显然更多的设备的详细信息可查询通过的驱动API于通过运行时API。例如,免费存储器在设备上可查询的只有通过驾驶员。

从CUDA程序员的指南:

它是由两个Api:

  • 一个低级别的API称为CUDA驱动API,
  • 一个高级别API称为CUDA运行时API这是实现在 CUDA驱动程序。

这些Api是相互排斥:应使用一个或 其他。

CUDA运行时简化设备码管理提供了隐性的 初始化,上下文管理,以及模块的管理。C主机的代码 所产生的nvcc是基于CUDA的运行(见第4.2.5),所以 应用程序,链接到这个代码必须使用CUDA运行时API。

与此相反,CUDA驱动API需要更多的代码,是困难和程序 调试,但提供了一个更好的控制水平和语言无关,因为它只 涉及cubin的对象(见第4.2.5).特别是,它更加困难 配置并启动核使用的CUDA驱动API,由于执行 结构和核心参数,必须指定有明确的功能的电话 而不是执行结构语法中描述的第4.2.3.还有,设备 模拟(见第4.5.2.9)不工作的CUDA驱动程序。

没有明显的表现之间的差API。怎么你的内核使用的记忆和他们是如何奠定了GPU(在扭曲和块)将有一个更明显的效果。

其他提示

我已发现对于部署图书馆在多应用程序,控制在CUDA上下文中提供的驱动API是至关重要的。我的客户想要整合GPU加入现有的应用程序,而这些天来,几乎所有应用程序是多线程的。因为我不能保证所有GPU码将被初始化、执行和释放从相同的线,我不得不使用驱动程序。

我的最初尝试各种解决方法的运行时API所有导致失败,有时在壮观的方式-我发现我可以重复,立即重新启动机器,通过执行仅仅是错误的CUDA呼吁不同的线。

因为我们迁移的一切驱动API,所有已。

J

几个重要的事情要注意:

第一个之间的差异Api仅适用于主侧代码。内核是完全相同的。主机上的侧的复杂性驱动api是很微不足道,基本差别是:

在驱动api你有访问的功能,是不是在运行时api样的情况。

仿真程序只适用代码编写的用于运行时api。

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

有一些现实问题的论点对准和驾驶员。检查出CUDA2.2beta(或以后)文件的更多信息。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top