解释几个术语
GPU
L1
or L2
缓存C++, Python
等,只不过它是专门用来操控GPU的GPU型号含义
CUDAToolkit
nvm/
目录下的Compiler SDK来直接针对NVVM进行开发runtime和driver API
CUDA有两个主要的API:runtime(运行时) API和driver API, 这两个API都有对应的CUDA版本
用于支持driver API的必要文件(如libcuda.so)是由GPU driver installer安装的。nvidia-smi就属于这一类API
用于支持runtime API的必要文件(如libcudart.so以及nvcc)是由CUDA Toolkit installer安装的
注意:CUDA Toolkit Installer有时可能会集成了GPU driver Installer
nvcc是与CUDA Toolkit一起安装的CUDA compiler-driver tool,它只知道它自身构建时的CUDA runtime版本
注意:nvcc不知道安装了什么版本的GPU driver,甚至不知道是否安装了GPU driver
runtime和driver API在很多情况非常相似,也就是说用起来的效果是等价的
但不能混合使用这两个API,因为二者是互斥的
简单理解二者的区别就是
CUDA Driver与CUDA Runtime相比更偏底层,就意味着Driver API有着更灵活的控制,也伴随着更复杂的编程
CUDA driver需要做显式的初始化cuInit(0)
否则其他API都会返回CUDA_ERROR_NOT_INITIALIZED
代码示例
// CUDA驱动头文件cuda.h
#include #include
#include
int main(){/* cuInit(int flags) flags目前必须给0;对于cuda的所有函数,必须先调用cuInit,否则其他API都会返回CUDA_ERROR_NOT_INITIALIZED*/CUresult code=cuInit(0); //CUresult:用于接收可能的错误代码if(code != CUresult::CUDA_SUCCESS){const char* err_message = nullptr;cuGetErrorString(code, &err_message); // 获取错误代码的字符串描述// cuGetErrorName (code, &err_message); // 也可以直接获取错误代码的字符串printf("Initialize failed. code = %d, message = %s\n", code, err_message);return -1;}int driver_version = 0;code = cuDriverGetVersion(&driver_version); // 获取驱动版本printf("CUDA Driver version is %d\n", driver_version); // 若driver_version为11020指的是11.2// 测试获取当前设备信息char device_name[100]; // char 数组CUdevice device = 0;code = cuDeviceGetName(device_name, sizeof(device_name), device); // 获取设备名称、型号, 数组名device_name当作指针printf("Device %d name is %s\n", device, device_name);return 0;
}
参考文献