前言
杜老师推出的 tensorRT从零起步高性能部署 课程,之前有看过一遍,但是没有做笔记,很多东西也忘了。这次重新撸一遍,顺便记记笔记
本次课程学习精简 CUDA 教程-Driver API 概述
课程大纲可看下面的思维导图
1. Driver API概述
对于 Driver API 你需要知道:
- CUDA Driver 是与 GPU 沟通的驱动级别底层 API
- 对 Driver API 的理解,有利于理解后续的 Runtime API
- CUDA Driver 随显卡驱动发布,需要与 cudatoolkit 分开看
- CUDA Driver 对应于 cuda.h 和 libcuda.so
- Driver API 主要知识点是 Context 的管理机制 以及 CUDA 系列接口的开发习惯(错误检查方法),还有内存模型
参考:显卡,显卡驱动,nvcc, cuda driver,cudatoolkit,cudnn到底是什么?
下图很清楚的展示了 Driver API 和 Runtime API 以及与其它概念之间的关系
从图中可知我们平时常用的 nvidia-smi
调用的是 Driver API。最开始 Driver API 是与显卡沟通的底层 API,但是人们发现 Driver API 太过底层,由此引入了 Runtime API。从图中可以看出 Runtime API 是基于 Driver API 开发的,我们日常中见到的 cudaMalloc()
、cudaMemset()
、cudaMemcpy()
都属于 Runtime API。像 cu
开头的如 cuCtxCreate()
就属于 Driver API。
值得注意的是,cuda.h
是 NVIDIA CUDA Toolkit 中的一部分。CUDA Toolkit 是 NVIDIA 提供的用于开发 GPU 加速应用程序的软件开发工具包,其中包含了用于编译和执行 CUDA 程序的各种库和头文件。而 libcuda.so
是 NVIDIA 显卡驱动安装到系统中时随之安装的一个共享库文件。
cuda.h
提供了 CUDA 编程的接口和声明,而 libcuda.so
则是运行库,提供了 CUDA 运行时所需的底层功能和支持。
为什么需要了解 Driver API 呢,直接看更高级的 Runtime API 不就行了吗?
- Driver API 是理解 cudaRuntime 中上下文的关键
- Driver API 只需要做到理解 context 即可,知道它的存在就行
- 开发过程中可能因为对 Driver API 的理解不够,造成上层调试困难
- 对于越底层的 api,做一些了解,有利于高层遇到问题后排查原因
关于 context 有两种:
- 手动管理的 context,
cuCtxCreate()
(手动管理,以堆栈方式 push/pop) - 自动管理的 context,
cuDevicePrimaryCtxRetain
(自动管理,runtime api 以此为基础)
关于内存,有两大类:
- CPU 内存,称之为 Host Memory。又可以分为 Pageable Memory:可分页内存 + Page-Locked Memory:页锁定内存
- GPU 内存,称之为 Device Memory。又可以分为 Global Memory:全局内存 + Shared Memory:共享内存 + 其它多种内存
关于 context 和内存先有个基本概念就行,后续会详细讲解。
2. 补充知识
我们需要了解 cuda 和显卡等基本概念及初始化 cuda 的相关知识:(from 杜老师)文章来源:https://www.toymoban.com/news/detail-537154.html
- 如何运行
make run
- 显卡,显卡驱动,nvcc,cuda driver,cudatoolkit,cudnn 到底是什么?
- 关于显卡驱动与 cuda 驱动的版本匹配
- Table 1. CUDA 11.6 Update 1 Component Versions
- 结论:尽量将显卡驱动升级到新的,因此显卡驱动向下兼容 cuda 驱动
- 简单了解显卡相关概念
- 显卡:GPU
- 显卡驱动:驱动软件,类比声卡驱动,摄像头驱动
- GPU架构:gpu 架构指的是硬件的设计方式,例如是否有 L1 or L2 缓冲
- CUDA:其中一种理解是它是一种编程语言(向 C++、Python 等,只不过它是专门用来操控 GPU 的)
- cuDNN:这个其实就是一个专门为深度学习计算设计的软件库,里面提供很多专门的计算函数
- CUDAToolkit:这是我们真正需要首先安装的工具包,所谓的装 cuda 首先指的是它
- 它里面包含了许多库,例如:cudart、cublas等
- 其它涉及到的知识有 nvcc 与 nvidia-smi,多个 cuda 版本之间进行切换,cuda 的安装等
- 详细请参考:https://zhuanlan.zhihu.com/p/91334380
- cuda-driver-api 与 cuda-runtime-api
- CUDA Driver 与 CUDA Runtime 相比更偏底层,就意味着 Driver API 有着更灵活的控制,也伴随着更复杂的编程
- 因此 CUDA Driver 需要做显式的初始化
cuInit(0)
,否则其他 API 都会返回CUDA_ERROR_NOT_INITIALIZED
- 经过初始化驱动和显卡的信息可以轻松获取:
- 驱动版本管理 https://docs.nvidia.com/cuda/archive/11.2.0/cuda-driver-api/group__CUDA__VERSION.html#group__CUDA__VERSION
- 设备信息管理 https://docs.nvidia.com/cuda/archive/11.2.0/cuda-driver-api/group__CUDA__DEVICE.html
- 写在文末
- CUDA 的在线文档地址
- https://developer.nvidia.com/cuda-toolkit-archive
- https://docs.nvidia.com/cuda/archive/11.2.0/
- 报错
- 提示 nvcc 错误。对于 gcc 版本大于等于 8 的不支持,需要修改 Makefile 中的 g++ 为 g++7 或者更低
总结
本次课程主要了解 CUDA Driver API 的一些概念,它是一个偏底层的 API,它提供了对 GPU 硬件和驱动程序的底层访问能力。学习了解 Driver API 可以更好的帮助我们后续理解 Runtime API,后续主要从 Context 的管理机制、CUDA 系列接口的开发习惯、内存模型 三个方面来学习 Driver API 的使用。文章来源地址https://www.toymoban.com/news/detail-537154.html
到了这里,关于2.1.cuda驱动API-概述的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!