我开始学习使用CUDA进行编程,在一些示例中发现代码包含以下头文件:
cuda.h
、cuda_runtime.h
和cuda_runtime_api.h
。能否有人解释下这些文件之间的区别?cuda.h
、cuda_runtime.h
和cuda_runtime_api.h
。能否有人解释下这些文件之间的区别?非常宽泛地说:
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 会自动处理包含所有必需头文件的工作,无需程序员干预。
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++头文件,其中包含一些模板函数的实现。
nvcc
编译,那么你在.cu
文件中就不需要放置include头文件了吗? - Ander Biguri.cu
代码时才会自动包含所有头文件。 - Shuai