为啥我应该使用 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 中网格中的所有块的 Blockdim 都应该相同?