cuda.h,cuda_runtime.h,cuda_runtime_api.h之间的区别

Ren*_*nan 30 cuda header-files

我开始使用CUDA进行编程,在某些示例中,我找到了包含文件cuda.h,cuda_runtime.hcuda_runtime_api.h包含在代码中.有人可以向我解释这些文件之间的区别吗?

tal*_*ies 44

从广义上讲:

  • cuda.h 定义CUDA驱动程序API的公共主机功能和类型.
  • cuda_runtime_api.h 定义CUDA运行时API的公共主机功能和类型
  • cuda_runtime.h定义所有内容cuda_runtime_api.h,以及CUDA语言扩展和设备内部函数的内置类型定义和函数重叠.

如果您正在编写要使用包含API调用的主机编译器编译的主机代码,则应包含cuda.h或者cuda_runtime_api.h.如果您需要其他CUDA语言内置函数,例如类型,并且正在使用运行时API并使用主机编译器进行编译,那么您将包括cuda_runtime.h.如果您正在编写将使用nvcc编译的代码,那么这一切都无关紧要,因为nvcc会在没有程序员干预的情况下自动包含所有必需的头文件.

  • 什么!因此,如果使用“nvcc”进行编译,则不需要将包含内容放入 .cu 文件中? (3认同)
  • 不适用于那些特定的包含文件,没有. (2认同)
  • 我最近没有具体检查最近工具包中的导入链是什么。但当然可以使用任何 CUDA 支持的类型以及整个运行时和设备运行时 API,而无需显式导入调用。如果要使用设备标准库或数学库函数(printf、memset、malloc、memcpy 等),则必须专门导入它们 (2认同)

ein*_*ica 7

除了@talonmies 的回答之外,还有一些观察结果:

  • cuda_runtime.h包括cuda_runtime_api.h内部,但反之则不然。所以:“运行时包括所有的runtime_api”是一个需要记住的助记符。
  • cuda_runtime_api.h没有您在官方文档中找到的完整运行时 API 函数,但cuda_runtime.h 拥有全部(例如:cudaEventCreate())。然而,定义的所有 API 调用cuda_runtime.h实际上都是在头文件本身中使用对cuda_runtime_api.h. 这些是@talonmies 提到的“功能覆盖”。
  • cuda_runtime_api.h是一个仅包含 C 语言函数声明的 C 语言头文件 (IIANM);cuda_runtime.h是一个 C++ 头文件,实现了一些模板化函数。