精簡CUDA教程——CUDA Driver API

精簡CUDA教程——CUDA Driver API

tensorRT從零起步邁向高性能工業級部署(就業導向) 課程筆記,講師講的不錯,可以去看原視頻支持下。

Driver API概述

CUDA 的多級 API

CUDA 的 API 有多級(下圖),詳細可參考:CUDA環境詳解。

  • CUDA Driver API 是 CUDA 與 GPU 溝通的驅動級底層 API。早期 CUDA 與 GPU 溝通都是直接通過 Driver API。cuCtxCreate()cu 開頭的基本都是 Driver API。我們熟悉的 nvidia-smi 命令就是調用的 Driver API。
  • 后來發覺 Driver API 太過底層,細節太過復雜,故演變出了 Runtime API,Runtime API 是基于 Driver API 開發的,常見的 cudaMalloc() 等 API 都是 Runtime API。

在這里插入圖片描述

CUDA Driver

環境相關

CUDA Driver 是隨著顯卡驅動發布,要與 cudatoolkit 分開看

CUDA Driver 對應于 cuda.hlibcuda.so 兩個文件。注意 cuda.h 會在安裝 cudatoolkit 時包含,但是 libcuda.so 是隨著顯卡驅動安裝的我們的系統中的(而不是也跟著 cudatooklit 安裝)。因此,如果要直接復制移動 libcuda.so 文件時要注意驅動版本需要與之適配。

如何了解CUDA Driver

本精簡課程對于底層的 Driver API 的理解,是為了有利于后續的 Runtime API 的學習與錯誤調試。Driver API 是理解 cudaRuntime 中上下文的關鍵。因此,本精簡課程在 CUDA Driver 這部分的主要的知識點是:

  • Context 的管理機制
  • CUDA 系列接口的開發習慣(錯誤檢查方法)
  • 內存模型

關于context和內存的分類

關于context,有兩種:

  1. 手動管理的 contextcuCtxCreate ,手動管理,以堆棧的方式 push/pop
  2. 自動管理的 contextcuDevicePrimaryCtxRetain,自動管理,Runtime API 以此為基礎

關于內存,有兩大類:

  1. CPU 內存,稱之為 Host Memory
    • Pageable Memory:可分頁內存
    • Page-Locked Memory:頁鎖定內存
  2. GPU 內存(顯存),稱之為 Device Memory
    • Global Memory:全局內存
    • Shared Memory:共享內存
    • … 其他

以上內容之后會展開介紹。

cuIint 驅動初始化

  1. cuInit 的意義是,初始化驅動 API,全局執行一次即可,如果不執行,則所有 API 都將返回錯誤。
  2. 沒有對應的 cuDestroy,不需要釋放,程序銷毀自動釋放。

返回值檢查

版本一

正確友好地檢查 cuda 函數的返回值,有利于程序的組織結構,使得代碼的可讀性更好,錯誤更容易發現。

我們知道 cuInit 返回的類型是 CUresult,該返回值會告訴程序員函數成功還是失敗,失敗的原因是什么。

官方版本的檢查的邏輯,如下:

// 使用有參宏定義檢查cuda driver是否被正常初始化, 并定位程序出錯的文件名、行數和錯誤信息
// 宏定義中帶do...while循環可保證程序的正確性
#define checkDriver(op)    \do{                    \auto code = (op);  \if(code != CUresult::CUDA_SUCCESS){     \const char* err_name = nullptr;     \const char* err_message = nullptr;  \cuGetErrorName(code, &err_name);    \cuGetErrorString(code, &err_message);   \printf("%s:%d  %s failed. \n  code = %s, message = %s\n", __FILE__, __LINE__, #op, err_name, err_message);   \return -1;   \}                \}while(0)

是一個宏定義,我們在調用其他 API 的時候,對函數的返回值進行檢查,并在出錯時將錯誤碼和報錯信息打印出來,方便調試。比如:

checkDriver(cuDeviceGetName(device_name, sizeof(device_name), device));

如果有未初始化等錯誤,報錯信息會被清晰地打印出來。

這個版本一也是 Nvidia 官方使用的版本,但是存在一些問題,比如代碼可讀性較差,直接返回 int 型錯誤碼等。推薦使用版本二。

版本二

// 很明顯,這種代碼封裝方式,更加的便于使用
//宏定義 #define <宏名>(<參數表>) <宏體>
#define checkDriver(op)  __check_cuda_driver((op), #op, __FILE__, __LINE__)bool __check_cuda_driver(CUresult code, const char* op, const char* file, int line){if(code != CUresult::CUDA_SUCCESS){    const char* err_name = nullptr;    const char* err_message = nullptr;  cuGetErrorName(code, &err_name);    cuGetErrorString(code, &err_message);   printf("%s:%d  %s failed. \n  code = %s, message = %s\n", file, line, op, err_name, err_message);   return false;}return true;
}

很明顯的,版本二的返回值、代碼可讀性、封裝性等都相較版本一好了很多。使用的方式是一樣的:

checkDriver(cuDeviceGetName(device_name, sizeof(device_name), device));
// 或加一個判斷,遇到錯誤即退出
if (!checkDriver(cuDeviceGetName(device_name, sizeof(device_name), device))) {return -1;
}

CUcontext

手動上下文管理

  • context 是一種上下文,關聯對 GPU 的所有操作。

  • 一個 context 與一塊顯卡關聯,一塊顯卡可以被多個 context 關聯。

  • 每個線程都有一個棧結構存儲 context,棧頂是當前使用的 context,對應有 push/pop 函數操作 context 的棧,所有 API 都以當前 context 為操作目標

試想一下,如果執行任何操作你都需要傳遞一個 device 決定送到哪個設備執行,得多麻煩。context 就是為了方便管理當前 API 是在哪個 device 上執行而提出的一種手段,而棧結構的使用則是為了保存之前的上下文中的 device,從而方便控制多個設備。

在這里插入圖片描述

自動上下文管理

  • 由于高頻操作都是一個線程固定訪問一個 device 不變,不經常會有同一個線程來回多次訪問不同 device 的情況,且只會使用到一個 context,很少用到多 context。
  • 即在多數情況下, CreateContextPushCurrentPopCurrent 這種多 context 管理就顯得很麻煩
  • 因此就推出了 cuDevicePrimaryCtxRetain ,為設備關聯主 context,這樣分配、設置、釋放、棧都不需要我們再去手動管理,是一種自動管理 context 的方式
  • primaryContext :給我設備 id,給你 context 并設置好,此時一個 device 對應一個 primary context。不同線程,只要設備 id 相同,primary context 就相同,且 context 是線程安全的。
  • 在之后要介紹的 CUDA Runtime API 中,就是自動使用 cuDevicePrimaryCtxRetain 的。

在這里插入圖片描述

DriverAPI 內存管理

  1. host memory 是計算機本身的內存,可以用 CUDA Driver API 來申請和釋放,也可以用 C/C++ 的 malloc/freenew/delete 來申請和釋放。
  2. device memory 是顯卡上的內存,即顯存,有專用的 Driver API 來進行申請和釋放。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/532486.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/532486.shtml
英文地址,請注明出處:http://en.pswp.cn/news/532486.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

CUDA編程入門極簡教程

CUDA編程入門極簡教程 轉自&#xff1a;CUDA編程入門極簡教程 作者&#xff1a;小小將 前言 2006年&#xff0c;NVIDIA公司發布了CUDA&#xff0c;CUDA是建立在NVIDIA的CPUs上的一個通用并行計算平臺和編程模型&#xff0c;基于CUDA編程可以利用GPUs的并行計算引擎來更加高效地…

精簡CUDA教程——CUDA Runtime API

精簡CUDA教程——CUDA Runtime API tensorRT從零起步邁向高性能工業級部署&#xff08;就業導向&#xff09; 課程筆記&#xff0c;講師講的不錯&#xff0c;可以去看原視頻支持下。 Runtime API 概述 環境 圖中可以看到&#xff0c;Runtime API 是基于 Driver API 之上開發的…

Python并發——concurrent.futures梳理

Python并發——concurrent.futures梳理 參考官方文檔&#xff1a; concurrent.futures — 啟動并行任務 Executor對象 class concurrent.funtures.Executor該抽象類是 ThreadPoolExecutor 和 ProcessPoolExecutor 的父類&#xff0c;提供異步執行調用方法。要通過它的子類調用…

TensorRT ONNX 基礎

TensorRT ONNX 基礎 tensorRT從零起步邁向高性能工業級部署&#xff08;就業導向&#xff09; 課程筆記&#xff0c;講師講的不錯&#xff0c;可以去看原視頻支持下。 概述 TensorRT 的核心在于對模型算子的優化&#xff08;合并算子、利用當前 GPU 特性選擇特定的核函數等多種…

回文子串、回文子序列相關題目

回文子串、回文子序列相關題目 回文子串是要連續的&#xff0c;回文子序列可不是連續的。 516. 最長回文子序列 dp數組含義&#xff1a;dp[i][j]dp[i][j]dp[i][j] 表示子序列 s[i,j]s[i,j]s[i,j] 中的最長回文子序列的長度。 dp數組初始化&#xff1a;子序列長度為 1 時&am…

mmdetection tools工具梳理

mmdetection tools工具梳理 mmdetection 是一個非常好用的開源目標檢測框架&#xff0c;我們可以用它方便地訓練自己的目標檢測模型&#xff0c;mmdetection 項目倉庫提供許多實用的工具來實現幫助我們進行各種測試。本篇將梳理以下 mmdetection 項目倉庫 tools 目錄下的各種實…

TensorRT ONNX 基礎(續)

TensorRT ONNX 基礎&#xff08;續&#xff09; PyTorch正確導出ONNX 幾條推薦的原則&#xff0c;可以減少潛在的錯誤&#xff1a; 對于任何使用到 shape、size 返回值的參數時&#xff0c;例如 tensor.view(tensor.size(0), -1) 這類操作&#xff0c;避免直接使用 tensor.s…

frp實現內網穿透極簡教程

frp實現內網穿透極簡教程 本文是內網穿透極簡教程&#xff0c;為求簡潔&#xff0c;我們不介紹為什么內網穿透也不介紹其原理&#xff0c;這里假設各位讀者都已經明確的知道自己的目的&#xff0c;本文僅介紹如何安裝配置 frp 實現內網穿透。 簡單來說&#xff0c;內網穿透就…

圖像預處理之warpaffine與雙線性插值及其高性能實現

圖像預處理之warpaffine與雙線性插值及其高性能實現 視頻講解&#xff1a;https://www.bilibili.com/video/BV1ZU4y1A7EG 代碼Repo&#xff1a;https://github.com/shouxieai/tensorRT_Pro 本文為視頻講解的個人筆記。 warpaffine矩陣變換 對于坐標點的變換&#xff0c;我們通…

LeetCode-10 正則表達式匹配

LeetCode-10 正則表達式匹配 動態規劃 10. 正則表達式匹配 dp數組含義&#xff1a;dp[i][j]dp[i][j]dp[i][j] 表示 s[0:i?1]s[0:i-1]s[0:i?1] 能否被 p[0:j?1]p[0:j-1]p[0:j?1] 成功匹配。 狀態轉移方程 &#xff1a; 如果 s[i?1]p[j?1]s[i-1]p[j-1]s[i?1]p[j?1] …

shell if判斷和for循環常見寫法

shell if判斷和for循環常見寫法 轉自&#xff1a; Shell中for循環的幾個常用寫法 Shell中if 條件判斷總結 if常見寫法 一、if的基本語法: if [ command ];then符合該條件執行的語句 elif [ command ];then符合該條件執行的語句 else符合該條件執行的語句 fibash shell會按順序…

關于pytorch使用多個dataloader并使用zip和cycle來進行循環時出現的顯存泄漏的問題

關于pytorch使用多個dataloader并使用zip和cycle來進行循環時出現的顯存泄漏的問題 如果我們想要在 Pytorch 中同時迭代兩個 dataloader 來處理數據&#xff0c;會有兩種情況&#xff1a;一是我們按照較短的 dataloader 來迭代&#xff0c;長的 dataloader 超過的部分就丟棄掉…

neovim及coc.nvim自動補全初探

neovim及coc.nvim自動補全初探 安裝 # mac # 安裝 brew install neovim # 查看neovim安裝路徑 brew list nvim# ubuntu apt install neovim習慣了打開 vi/vim 的方式&#xff0c;可以用個 alias 在 ~/.zshrc 中設置一下&#xff1a; alias vi"nvim"插件 vim-plug…

sed 簡明教程

sed 簡明教程 轉自&#xff1a;https://coolshell.cn/articles/9104.html awk于1977年出生&#xff0c;今年36歲本命年&#xff0c;sed比awk大2-3歲&#xff0c;awk就像林妹妹&#xff0c;sed就是寶玉哥哥了。所以 林妹妹跳了個Topless&#xff0c;他的哥哥sed坐不住了&#xf…

awk 簡明教程

awk 簡明教程 轉自&#xff1a;https://coolshell.cn/articles/9070.html 有一些網友看了前兩天的《Linux下應該知道的技巧》希望我能教教他們用awk和sed&#xff0c;所以&#xff0c;出現了這篇文章。我估計這些80后的年輕朋友可能對awk/sed這類上古神器有點陌生了&#xff0c…

應該知道的LINUX技巧

應該知道的LINUX技巧 轉自&#xff1a;https://coolshell.cn/articles/8883.html 這篇文章來源于Quroa的一個問答《What are some time-saving tips that every Linux user should know?》—— Linux用戶有哪些應該知道的提高效率的技巧。我覺得挺好的&#xff0c;總結得比較好…

[深度][PyTorch] DDP系列第一篇:入門教程

[深度][PyTorch] DDP系列第一篇&#xff1a;入門教程 轉自&#xff1a;[原創][深度][PyTorch] DDP系列第一篇&#xff1a;入門教程 概覽 想要讓你的PyTorch神經網絡在多卡環境上跑得又快又好&#xff1f;那你definitely需要這一篇&#xff01; No one knows DDP better than I…

[深度][PyTorch] DDP系列第二篇:實現原理與源代碼解析

[深度][PyTorch] DDP系列第二篇&#xff1a;實現原理與源代碼解析 轉自&#xff1a;https://zhuanlan.zhihu.com/p/187610959 概覽 想要讓你的PyTorch神經網絡在多卡環境上跑得又快又好&#xff1f;那你definitely需要這一篇&#xff01; No one knows DDP better than I do! …

[深度][PyTorch] DDP系列第三篇:實戰與技巧

[深度][PyTorch] DDP系列第三篇&#xff1a;實戰與技巧 轉自&#xff1a;https://zhuanlan.zhihu.com/p/250471767 零. 概覽 想要讓你的PyTorch神經網絡在多卡環境上跑得又快又好&#xff1f;那你definitely需要這一篇&#xff01; No one knows DDP better than I do! – – …

PIL、OpenCV中resize算子實現不同的問題

PIL、OpenCV中resize算子實現不同的問題 測試圖像&#xff1a;https://raw.githubusercontent.com/TropComplique/ssd-pytorch/master/images/dogs-and-cats.jpg &#xff08;直接 wget 可獲得&#xff09; 測試版本&#xff1a; opencv-python 4.4.0.46Pillow 8.0.1 測試代…