【TensorRT算法部署】精简CUDA - DriverAPI概述

一、简介

1、CUDA Driver是与GPU沟通的驱动级别底层API

2. 对DriverAPI的理解,有利于理解后续的RuntimeAPI

3. CUDA Driver随显卡驱动发布,与cudatoolkit分开看

4. CUDA Driver对应于cuda.h和libcuda.so文件

5. 主要知识点是Context的管理机制,以及CUDA系列接口的开发习惯(错误检查方法),还有内存模型

【TensorRT算法部署】精简CUDA - DriverAPI概述_第1张图片

二、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

【TensorRT算法部署】精简CUDA - DriverAPI概述_第2张图片
  1. 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是线程安全的

没有context的代码

【TensorRT算法部署】精简CUDA - DriverAPI概述_第3张图片

有context的代码

注:

  1. context只是为了方便控制device的一种手段而提出来的

  1. 栈的存在是为了方便控制多个设备

你可能感兴趣的:(TensorRT算法部署,英伟达,cuda)