【发布时间】:2015-01-16 19:57:36
【问题描述】:
为什么要使用CUDA Driver API,什么情况下不能使用CUDA Runtime API(比Driver API方便)?
【问题讨论】:
为什么要使用CUDA Driver API,什么情况下不能使用CUDA Runtime API(比Driver API方便)?
【问题讨论】:
运行时 API 是驱动程序 API 的更高抽象级别,通常更易于使用(性能差距应该很小)。驱动程序 API 是基于句柄的 API,并提供更高程度的控制。相反,运行时 API 更易于使用(例如,您可以使用 kernel<<<>>> 启动语法)。
“更高程度的控制”意味着使用驱动程序 API,您必须以更冗长的方式处理模块初始化和内存管理,但这允许您做更多的事情,例如禁用内核代码的驱动程序 JIT 优化:
CU_JIT_OPTIMIZATION_LEVEL - 应用于生成代码的优化级别 (0 - 4),其中 4 是默认和最高级别的优化。 选项类型:无符号整数
目前无法通过运行时 API 的代码来实现。更精细的控制意味着您可能会破坏或变慢,如果您不知道它们是什么,请不要使用它。
您通常应该只在应用程序中使用运行时 API 或驱动程序 API,但对于较新的 CUDA 版本,运行时 API 代码可以与驱动程序 API 代码和平共存 (http://docs.nvidia.com/cuda/pdf/CUDA_C_Programming_Guide.pdf)
应用程序可以将运行时 API 代码与驱动程序 API 代码混合。
【讨论】:
添加和扩展@Marco 的出色答案。驱动程序 API 提供的一项主要功能是在运行时加载内核。这由驱动 API 的模块部分覆盖,这里是概述:
http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#module
使用运行时 API,所有内核都会在初始化期间自动加载,并在程序运行期间保持加载状态。使用驱动程序 API,程序员可以明确控制加载和卸载内核。例如,后者可用于从 Internet 下载更新的内核版本。另一个用途是只加载当前相关的模块,尽管考虑到内核相对于程序的其余部分通常较小,这很少引起关注。
[更新:删除不相关的东西]
【讨论】: