一、简介
1、CUDA Driver是与GPU沟通的驱动级别底层API
2. 对DriverAPI的理解,有利于理解后续的RuntimeAPI
3. CUDA Driver随显卡驱动发布,与cudatoolkit分开看
4. CUDA Driver对应于cuda.h和libcuda.so文件
5. 主要知识点是Context的管理机制,以及CUDA系列接口的开发习惯(错误检查方法),还有内存模型
![](https://i-blog.csdnimg.cn/blog_migrate/ec38ea6013f79e7c9525311cefebc29a.png)
二、context
1、手动管理的context,cuCtxCreate(手动管理,以堆栈方式push/pop)
2. 自动管理的context,cuDevicePrimaryCtxRetain(自动管理,runtime api以此为基础)
三、内存
1、CPU内存,称之为Host Memory
Pageable Memory:可分页内存
Page-Locked Memory:页锁定内存
2. GPU内存,称之为Device Memory
Global Memory:全局内存
Shared Memory:共享内存
以及其他多种内存
四、示例
1、对应于系列名称:cuda-driver-api
2、获取代码:trtpy get-series cuda-driver-api
3、查询系列清单:trtpy series-detail cuda-driver-api
![](https://i-blog.csdnimg.cn/blog_migrate/774aa02c3f1fde44ebbfa56f6949d138.png)
CuInit-驱动初始化
1. cuInit的意义是,初始化驱动API,如果不执行,则所有API都将返回错误,全局执行一次即可
2. 没有对应的cuDestroy,不需要释放,程序销毁自动释放
2、返回值检查
1. 正确友好的检查cuda函数的返回值,有利于程序的组织结构
2. 使得代码可读性更好,错误更容易发现
3、CUcontext
1. context是一种上下文,关联对GPU的所有操作
2. context与一块显卡关联,一个显卡可以被多个context关联
3. 每个线程都有一个栈结构储存context,栈顶是当前使用的context,对应有push、pop函数操作
context的栈,所有api都以当前context为操作目标
4. 试想一下,如果执行任何操作你都需要传递一个device决定送到哪个设备执行,得多麻烦
5、由于高频操作,是一个线程基本固定访问一个显卡不变,且只使用一个context,很少会用到多context
6、CreateContext、PushCurrent、PopCurrent这种多context管理就显得麻烦,还得再简单
7. 因此推出了cuDevicePrimaryCtxRetain,为设备关联主context,分配、释放、设置、栈都不用你
管
8. primaryContext:给我设备id,给你context并设置好,此时一个显卡对应一个primary context
9. 不同线程,只要设备id一样,primary context就一样。context是线程安全的
![](https://i-blog.csdnimg.cn/blog_migrate/0d717b0fc66459739b7bd3eb9158eaa3.png)
没有context的代码
![](https://i-blog.csdnimg.cn/blog_migrate/725d36aba517deca27fa9a8d192ff791.png)
有context的代码
注:
context只是为了方便控制device的一种手段而提出来的
栈的存在是为了方便控制多个设备