例如,cudaMemcpy和cuMemcpy之类的API?我可以看到函数定义不同,但我的意思是API的一般性质。为什么有一个以
cu...
开头,另一个以cuda...
开头?应该在什么情况下使用每个API?cu...
开头,另一个以cuda...
开头?应该在什么情况下使用每个API?方法名以 cu...
开头的API被称为Driver API。方法名以 cuda...
开头的API则是Runtime API。
最初(直到CUDA 3.0),这两个API完全分开。一个粗略的分类是:Runtime API更简单、更方便。驱动程序API旨在进行更复杂、“低级”编程(也许是库开发)。
从CUDA 3.0开始,这两个API是互操作的。这意味着,例如,当您使用 cuMemAlloc
在驱动程序API中分配内存时,您还可以在Runtime API调用中使用相同的内存,如 cudaMemcpy
。
主要的实际区别在于,在Runtime API中,您可以使用特殊的 kernel<<<...>>>
启动语法,而在Driver API中,您可以将CUDA程序作为“模块”(使用像 cuModuleLoad
这样的方法)加载,并使用 cuLaunchKernel
在程序中启动这些核心。
实际上,我认为对于CUDA程序的大部分内容,差异是可以忽略不计的:除了核心/模块处理以外,两个API几乎提供了每种其他功能,并且两者几乎相等。这涉及到方法(例如 cuMemcpy
和 cudaMemcpy
等),以及结构体 CU_event
和 cudaEvent
等)。
更多信息可以通过搜索关键字“CUDA Runtime Driver API”获得,例如在 https://devtalk.nvidia.com/default/topic/522598/what-is-the-difference-between-runtime-and-driver-api-/ 上。