为啥我应该使用 CUDA Driver API 而不是 CUDA Runtime API?

Posted

技术标签:

【中文标题】为啥我应该使用 CUDA Driver API 而不是 CUDA Runtime API?【英文标题】:Why should I use the CUDA Driver API instead of CUDA Runtime API?为什么我应该使用 CUDA Driver API 而不是 CUDA Runtime API? 【发布时间】:2015-01-16 19:57:36 【问题描述】:

为什么要使用CUDA Driver API,什么情况下不能使用CUDA Runtime API(比Driver API方便)?

【问题讨论】:

【参考方案1】:

运行时 API 是驱动程序 API 的更高抽象级别,通常更易于使用(性能差距应该很小)。驱动程序 API 是基于句柄的 API,并提供更高程度的控制。相反,运行时 API 更易于使用(例如,您可以使用 kernel<<<>>> 启动语法)。

更高程度的控制”意味着使用驱动程序 API,您必须以更冗长的方式处理模块初始化和内存管理,但这允许您做更多的事情,例如禁用内核代码的驱动程序 JIT 优化:

CU_JIT_OPTIMIZATION_LEVEL - 应用于生成代码的优化级别 (0 - 4),其中 4 是默认和***别的优化。 选项类型:无符号整数

来自http://developer.download.nvidia.com/compute/cuda/4_1/rel/toolkit/docs/online/group__CUDA__TYPES_gfaa9995214a4f3341f48c5830cea0d8a.html

目前无法通过运行时 API 的代码来实现。更精细的控制意味着您可能会破坏或变慢,如果您不知道它们是什么,请不要使用它。

您通常应该只在应用程序中使用运行时 API 或驱动程序 API,但对于较新的 CUDA 版本,运行时 API 代码可以与驱动程序 API 代码和平共存 (http://docs.nvidia.com/cuda/pdf/CUDA_C_Programming_Guide.pdf)

应用程序可以将运行时 API 代码与驱动程序 API 代码混合。

【讨论】:

谢谢! Driver API 是否允许我使用我的 CUDA 程序作为驱动程序或服务(Windows)/守护程序(Linux),而运行时 API 不允许我这样做? 如果您的意思是这样的话,您的应用运行的权限级别没有区别。【参考方案2】:

添加和扩展@Marco 的出色答案。驱动程序 API 提供的一项主要功能是在运行时加载内核。这由驱动 API 的模块部分覆盖,这里是概述:

http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#module

使用运行时 API,所有内核都会在初始化期间自动加载,并在程序运行期间保持加载状态。使用驱动程序 API,程序员可以明确控制加载和卸载内核。例如,后者可用于从 Internet 下载更新的内核版本。另一个用途是只加载当前相关的模块,尽管考虑到内核相对于程序的其余部分通常较小,这很少引起关注。

[更新:删除不相关的东西]

【讨论】:

以上是关于为啥我应该使用 CUDA Driver API 而不是 CUDA Runtime API?的主要内容,如果未能解决你的问题,请参考以下文章

关于CUDA两种API:Runtime API 和 Driver API

CUDA Driver API 获取驱动版本设备信息

哪些文件需要与包含 CUDA Driver API 的应用程序一起分发?

为啥 CUDA 中网格中的所有块的 Blockdim 都应该相同?

我应该如何以及何时将倾斜指针与 cuda API 一起使用?

Cuda 中的运行时 VS 驱动程序 API