cuda.h、cuda_runtime.h和cuda_runtime_api.h之间的区别

44
我开始学习使用CUDA进行编程,在一些示例中发现代码包含以下头文件:cuda.hcuda_runtime.hcuda_runtime_api.h。能否有人解释下这些文件之间的区别?
2个回答

55

非常宽泛地说:

  • cuda.h 定义了 CUDA 驱动 API 的公共主机函数和类型。
  • cuda_runtime_api.h 定义了 CUDA 运行时 API 的公共主机函数和类型。
  • cuda_runtime.h 定义了比 cuda_runtime_api.h 多的一切,以及 CUDA 语言扩展和设备内置函数的内置类型定义和函数覆盖。

如果你正在编写将与主机编译器一起编译的包括 API 调用的主机代码,则应该包括 cuda.hcuda_runtime_api.h。如果您需要其他 CUDA 语言内置内容(如类型),并且正在使用运行时 API 并使用主机编译器进行编译,则应该包括 cuda_runtime.h。如果你正在使用 nvcc 进行编译,那么这些都无关紧要,因为 nvcc 会自动处理包含所有必需头文件的工作,无需程序员干预。


3
什么!如果你使用nvcc编译,那么你在.cu文件中就不需要放置include头文件了吗? - Ander Biguri
3
不适用于那些特定的包含文件,不是的。 - talonmies
1
只是好奇(如果需要,我可以开一个新问题):只是针对那些?确切地说是那些? - Ander Biguri
2
我最近没有检查过最新工具包中的导入链是什么。但是,可以肯定地使用任何CUDA支持的类型以及整个运行时和设备运行时API,而无需进行显式的导入调用。如果您想要使用设备标准库或数学库函数(printf、memset、malloc、memcpy等),则必须明确导入它们。 - talonmies
顺便提一下:只有在nvcc编译.cu代码时才会自动包含所有头文件。 - Shuai

7
除了@talonmies的回答外,还有几点观察:
  • cuda_runtime.h在内部包含cuda_runtime_api.h,但是反过来不包括。因此,“runtime包含所有runtime_api”是一个助记符。
  • cuda_runtime_api.h并没有完整的运行时API函数,在官方文档中可以找到,而cuda_runtime.h会包含所有的API函数(例如: cudaEventCreate())。然而,在cuda_runtime.h中定义的所有API调用实际上都是使用cuda_runtime_api.h中的函数调用来实现的。这些是@talonmies提到的“function overlays”的关键。
  • cuda_runtime_api.h是一个C语言头文件,只有C语言函数声明;cuda_runtime.h是一个C++头文件,其中包含一些模板函数的实现。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接