在运行时环境中定义了一些CUDA API,如cudaMalloc,cudaMemcpy,cudaFree,我明白因为它们在运行时都有一些事情要做(例如,cudaMalloc,就像c中的malloc一样)运行时的动态内存分配)。但我不知道为什么在那里定义了一些像cudaGetDeviceProperties这样的函数,它们是否只能在普通的头文件中定义?
是运行时环境中的所有CUDA API吗?
答案 0 :(得分:2)
运行时函数在普通头文件中声明,它是cuda_runtime.h
除了内核启动之外,您可以通过包含cuda_runtime.h
并使用适当的cudart(cuda运行时库)链接,使用g ++(例如,或Windows上的cl.exe)构建所有cuda运行时API功能。适用于您的操作系统(例如Linux上的-L/usr/local/cuda/lib64 -lcudart
。
你通常不会看到这个的原因是,当用nvcc
编译时(编译器驱动程序调用主机编译器,除其他外),这个包含和库链接被处理对于nvcc
,您无需明确指定它们。
大多数CUDA运行时函数以某种方式与CUDA GPU驱动程序交互。在这方面,cudaMalloc
和cudaGetDeviceProperties
之间没有任何区别,我不认为。
CUDA中的主要API区别是runtime API和driver API。这些API在很大程度上是可比较的,具有大致相似的功能,可以执行类似的操作但是,它们的用途略有不同,the driver API gives some additional flexibility(例如,使用主机编译器编译的文件中的内核启动,以及PTX模块的JIT编译),这些都不是运行时API完全可能的。