Nvidia CUDA初級教程6 CUDA編程一

Nvidia CUDA初級教程6 CUDA編程一

視頻:https://www.bilibili.com/video/BV1kx411m7Fk?p=7
講師:周斌

GPU架構概覽

  • GPU特別使用于:
    • 密集計算,高度可并行計算
    • 圖形學
  • 晶體管主要被用于:
    • 執行計算
    • 而不是
      • 緩存數據
      • 控制指令流

在這里插入圖片描述

圖中分別是CPU、GPU各個部件所占的芯片面積。可以看到,CPU芯片中大量部分是緩存和控制邏輯,而GPU中則絕大部分都是計算單元。

CUDA編程相關簡介

CUDA的一些信息

  • 層次化線程集合
  • 共享存儲
  • 同步

CUDA術語

主機端和設備端

  • HOST - 主機端,通常指CPU
    • 采用ANSI標準C語言編程
  • Device - 設備端,通常指GPU(數據可并行)
    • 采用ANSI標準C的擴展語言編程 (CUDA C)
  • HOST 和 Device 擁有各自的存儲器
  • CUDA編程
    • 包括主機端和設備端兩部分代碼

  • Kernel 數據并行處理函數
    • 通過調用 Kernel 函數在設備端創建輕量級的線程,線程由硬件負責創建并調度

類似于 OpenCL 的 shader?

  • 核函數會在 N 個不同的 CUDA 線程上并行執行

    // 定義核函數
    __global__ void VecAdd(float* a, float* B, float* C) {int i = threadIdx.x;C[i] = A[i] + B[i];
    }int main() {// ...// 在N個線程上調用核函數VecAdd<<<1, N>>>(A, B, C);
    }
    

CUDA程序的執行

CUDA程序執行的流程大體上是這樣的:當我們在CPU端的代碼是串行執行的(這里簡單地認為指令在CPU上串行執行),當遇到需要并行大量處理數據時,會調用核函數在GPU上進行計算,計算完成后將結果返回給CPU。

在這里插入圖片描述

線程層次

  • Grid - 一維或多維線程塊(block)
    • 一維或二維
  • Block - 一維線程
    • 一維,二維或三維
    • 一個 Grid 中的每個 Block 的線程數是一樣的
    • Block 內部的每個線程可以:
      • 同步 Synchronize
      • 訪問共享存儲器 shared memory

一個線程可以類比為一個員工,一個 block 是一個科室,grid 是整個公司。

在這里插入圖片描述

在這里插入圖片描述

線程ID

每一個線程都有一個索引:threadIdx

  • 一維 Block Thread ID == Thread Index
  • 二維 Block (Dx, Dy)
    • 索引為 (x, y) 的 Thread ID == x + yDy
  • 三維 Block (Dx, Dy, Dz)
    • 索引為 (x, y) 的 Thread ID == x + yDy + zDxDy

代碼實例

__global__ void MatAdd(float A[N][N], float B[N][N], float C[N][N]) {int i = threadIdx.x;int j = threadIdx.y;C[i][j] = A[i][j] + B[i][j];
}int main() {int numBlocks = 1;dim3 threadsPerBlock(N, N);MatAdd<<<numBlocks, threadsPerBlock>>>(A, B, C);
}

每個 Block 中的線程的索引是二維的,這在我們處理二維數據(矩陣)時可以很方便地進行對應。

線程數

Thread Block 線程塊

  • 線程的的集合
    • G80 和 GT200:多達512個線程
    • Fermi:多達1024個線程
  • 位于相同的處理器核(相同的SM)
  • 共享所在核的存儲器

在這里插入圖片描述

塊索引

  • 塊索引:blockIdx
  • 維度:blockDim
    • 一維,二維或三維
__global__ void MatAdd(float A[N][N], float B[N][N], float C[N][N]) {int i = blockIdx.x * blockDim.x + threadIdx.x;int j = blockIdx.y * blockDim.y + threadIdx.y;if (i < N && j < N)C[i][j] = A[i][j] + B[i][j];
}int main() {// ...dim3 threadsPerBlock(16, 16);dim3 numBlocks(N / threadsPerBlock.x, N / threadsPerBlock.y);MatAdd<<<numBlocks, threadsPerBlock>>>(A, B, C);
}

例如 N = 32

  • 每個塊有16x16個線程(跟N無關)
    • threadIdx([0, 15], [0, 15])
  • Grid 里面有 2x2 個線程塊 block
    • blockIdx([0, 1], [0, 1])
    • blockDim = 16
int i = blockIdx.x * blockDim.x + threadIdx.x;
int j = blockIdx.y * blockDim.y + threadIdx.y;

i = [0, 1] * 16 + [0, 15]

線程塊之間

線程塊彼此之間獨立執行

  • 任意順序:并行或串行
  • 被任意數量的處理器以任意順序調度
    • 處理器的數量具有可擴展性

一個塊內部的線程

一個塊內部的線程有一些重要的特性:

  • 共享容量有限的低延遲存儲器 (shared memory)
  • 同步執行
    • 合并訪存
    • __syncThreads()
      • barrier - 塊內線程一起等待所有的線程都
      • 輕量級線程

CUDA內存傳輸

主機端與設備端

CUDA內存傳輸

在這里插入圖片描述

  • device 端代碼可以:

    • 讀寫該線程的 registers
    • 讀寫該線程的local memory
    • 讀寫該線程所屬的塊的 shared memory
    • 讀寫grid的 global memory
    • 只讀grid的 constant memory
  • host 端代碼可以:

    • 讀寫grid的 global memory 和 constant memory
  • host 可以從 device 往返傳輸數據

    • global memory 全局存儲器
    • constant memory 常量存儲器

CUDA內存傳輸函數

  • 在設備端分配 global memory:cudaMalloc()
  • 釋放存儲空間 cudaFree()
float* Md;
int size = Width * Width * sizof(float);
cudaMalloc((void**)&Md, size);
//...
cudaFree(Md);

注意這里的指針 Md 是指向 device(GPU)上的存儲空間。

  • 內存傳輸:cudaMemcpy()
    • host to host
    • host to device
    • device to host
    • device to device
cudaMemcpy(Md, M, size, cudaMemcpyHostToDevice);
cudaMemcpy(P, Pd, size, cudaMemcpyDeviceToHost);

示例:矩陣相乘 Matrix Multiply

矩陣相乘簡介

  • 向量
  • 點乘
  • 行優先或列優先
  • 每次點乘結果輸出一個元素

在這里插入圖片描述

矩陣相乘CPU實現

void MatrixMulOnHost(float* M, float* N, float* P, int width) {for (int i=0; i<width; ++i) {for (int j=0; j<width; ++j) {float sum = 0;for (int k=0; k<width; ++k) {float a = M[i * width + k];float b = N[k * width + j]:sum += a  * b;}P[i * width + j] = sum;}}
}

CUDA算法框架

三步走:

int main(void) {// 1 分配device空間// 2 在GPU上,并行計算MatrixMulOnDevice(M, N, P, width);// 3 將結果拷貝回CPU,并釋放device空間return 0;
}

偽代碼如下:

void MatrixMulOnDevice(float* M, float* N, float* P, int Width) {int size = Width * Width * sizeof(float);// 1cudaMalloc(Md, size);cudaMemcpy(Md, M, size, cudaMemcpyHostToDevice);cudaMalloc(Nd, size);cudaMemcpy(Nd, N, size, cudaMemcpyHostToDevice);cudaMalloc(Pd, size);// 2 調用cuda核函數,并行計算// 3cudaMemcpy(P. Pd, size, cudaMemcpyDeivceToHost)cudaFree(Md); cudaFree(Nd); cudaFree(Pd);
}

CUDA C 實現

矩陣相乘樣例

在這里插入圖片描述

目前版本矩陣相乘的問題

  • 在上述算法實現中最主要的性能問題是什么?
    • 訪存
  • 主要的限制是什么?
    • 訪存帶寬

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

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

相關文章

由前中后遍歷序列構建二叉樹

由前/中/后遍歷序列構建二叉樹 基礎 首先&#xff0c;我們需要知道前中后序三種深度優先遍歷二叉樹的方式的具體順序&#xff1a; 前序&#xff1a;中左右中序&#xff1a;左中右后序&#xff1a;左右中 另外&#xff0c;要知道只有中序前/后序可以唯一確定一棵二叉樹&…

手寫nms

手寫nms 計算寬高的時候加1是為什么&#xff1f; 本文總結自互聯網的多種nms實現&#xff0c;供參考&#xff0c;非博主原創&#xff0c;各原文鏈接如下&#xff0c;也建議大家動手寫一寫。 Ref&#xff1a; 淺談NMS的多種實現 目標窗口檢測算法-NMS非極大值抑制 一、fas…

目標檢測綜述

目標檢測綜述 轉自&#xff1a;https://zhuanlan.zhihu.com/p/383616728 論文參考&#xff1a;[Object Detection in 20 Years: A Survey][https://arxiv.org/abs/1905.05055] 引言 目標檢測領域發展至今已有二十余載&#xff0c;從早期的傳統方法到如今的深度學習方法&#x…

Nvidia CUDA初級教程7 CUDA編程二

Nvidia CUDA初級教程7 CUDA編程二 視頻&#xff1a;https://www.bilibili.com/video/BV1kx411m7Fk?p8 講師&#xff1a;周斌 本節內容&#xff1a; 內置類型和函數 Built-ins and functions線程同步 Synchronizing線程調度 Scheduling threads存儲模型 Memory model重訪 Matr…

詳解優酷視頻質量評價體系

萬字長文 | 詳解優酷視頻質量評價體系 分享嘉賓&#xff5c;李靜博士&#xff0c;阿里巴巴文娛集團資深算法專家&#xff0c;阿里巴巴大文娛摩酷實驗室視頻體驗與質量團隊負責人 整理出品&#xff5c;AICUG人工智能社區 本文地址&#xff1a;https://www.6aiq.com/article/1617…

視頻質量評價:挑戰與機遇

視頻質量評價&#xff1a;挑戰與機遇 轉自&#xff1a;https://zhuanlan.zhihu.com/p/384603663 本文整理自鵬城實驗室助理研究員王海強在LiveVideoStack線上分享上的演講。他通過自身的實踐經驗&#xff0c;詳細講解了視頻質量評價的挑戰與機遇。 文 / 王海強 整理 / LiveVi…

關于二分法的邊界問題及兩種寫法

關于二分法的邊界問題及兩種寫法 二分查找法大家很熟悉了&#xff0c;對于一個有序序列&#xff0c;我們可以通過二分查找法在 O(logN)O(logN)O(logN) 的時間內找到想要的元素。但是&#xff0c;在代碼實現的過程中&#xff0c;如果沒有仔細理解清楚&#xff0c;二分法的邊界條…

LeetCode上的各種股票最大收益

LeetCode上的各種股票最大收益 對于力扣平臺上的股票類型的題目&#xff1a; 121 買賣股票的最佳時機 122 買賣股票的最佳時機 II 123 買賣股票的最佳時機 III 124 買賣股票的最佳時機 IV 309 最佳買賣股票時機含冷凍期 714 買賣股票的最佳時機含手續費 劍指 Offer 63. …

建設專業化運維服務團隊必要性

信息系統的生命周期涵蓋&#xff1a;設計、開發、測試、部署上線、運行維護。其中&#xff0c;運行維護階段是信息系統生命周期中的關鍵環節&#xff0c;其執行效果直接影響系統是否能達到預期的運行目標。為了實現這個目標&#xff0c;我們必須建立一個以業務服務為導向的專業…

docker初探

docker初探 本文旨在介紹 docker 基本的安裝、常用命令和常見概念的辨析&#xff0c;方便新手入門和筆者日后查閱&#xff0c;大部分內容整理自互聯網&#xff0c;原出處在文中注明。 文章目錄docker初探docker安裝&#xff08;mac&#xff09;版本、信息相關命令version/info…

ubuntu安裝zsh、oh-my-zsh及常用配置

ubuntu安裝zsh、oh-my-zsh及常用配置 目前&#xff0c;ubuntu默認的shell是bash&#xff0c;但還有一種shell&#xff0c;叫做zsh它比bash更加強大&#xff0c;功能也更加完善&#xff0c;zsh雖說功能強大&#xff0c;但是配置比較復雜導致流行度不是很高 但是好東西終究是好…

Segmentaion標簽的三種表示:poly、mask、rle

Segmentaion標簽的三種表示&#xff1a;poly、mask、rle 不同于圖像分類這樣比較簡單直接的計算機視覺任務&#xff0c;圖像分割任務&#xff08;又分為語義分割、實例分割、全景分割&#xff09;的標簽形式稍為復雜。在分割任務中&#xff0c;我們需要在像素級上表達的是一張…

tensorboard報錯:ValueError Duplicate plugins for name projector 問題的出現及解決過程

tensorboard報錯&#xff1a;ValueError: Duplicate plugins for name projector 問題的出現及解決過程 記錄如題問題的出現及解決過程。 報錯命令及信息 筆者在終端調用 tensorboard 時&#xff1a; tensorboard --logdirruns/ --bind_all報錯&#xff1a; raise ValueEr…

發布自己的Python包(Pypi)

發布自己的Python包(Pypi) 我們經常使用 Pypi 來安裝包&#xff0c;但是有時候我們也想要發布自己的 Pypi 包&#xff0c;有可能我們寫了一個特別牛的包&#xff0c;也有可能我們只是想使用自己常用的一些輪子&#xff0c;可能這是我們日常編碼中很常用的一些輪子&#xff0c;…

Ubuntu PPA 使用指南

Ubuntu PPA 使用指南 轉自&#xff1a;https://zhuanlan.zhihu.com/p/55250294 一篇涵蓋了在 Ubuntu 和其他 Linux 發行版中使用 PPA 的幾乎所有問題的深入的文章。 如果你一直在使用 Ubuntu 或基于 Ubuntu 的其他 Linux 發行版&#xff0c;例如 Linux Mint、Linux Lite、Zorin…

如何在 Linux 中快速地通過 HTTP 提供文件訪問服務

如何在 Linux 中快速地通過 HTTP 提供文件訪問服務 轉自&#xff1a;https://linux.cn/article-10205-1.html 如今&#xff0c;我有很多方法來通過 Web 瀏覽器為局域網中的其他系統提供單個文件或整個目錄的訪問。我在我的 Ubuntu 測試機上測試了這些方法&#xff0c;它們如下面…

Linux apt命令

Linux apt命令及其與apt-get的關系 轉自&#xff1a;https://blog.csdn.net/taotongning/article/details/82320472、https://www.runoob.com/linux/linux-comm-apt.html apt&#xff08;Advanced Packaging Tool&#xff09;是一個在 Debian 和 Ubuntu 中的 Shell 前端軟件包管…

楊宏宇:騰訊多模態內容理解技術及應用

楊宏宇&#xff1a;騰訊多模態內容理解技術及應用 分享嘉賓&#xff1a;楊宇鴻 騰訊 內容理解高級工程師 編輯整理&#xff1a;吳祺堯 出品平臺&#xff1a;DataFunTalk 導讀&#xff1a; 搜索內容的理解貫穿了整個搜索系統。我們需要從多個粒度理解搜索內容&#xff0c;包括語…

git登錄相關操作梳理

git登錄相關操作梳理 本文主要基于 Linux/Mac &#xff0c;Windows下未經測試&#xff0c;不過估計差不多&#xff0c;在 git bash 內操作即可。 創建ssh key并關聯github等賬號 因為本地Git倉庫和GitHub倉庫之間的傳輸是通過SSH加密傳輸的&#xff0c;GitHub需要識別是否是…

關于mmdetection上手的幾點說明

關于mmdetection上手的幾點說明 官方的文檔很有參考價值&#xff0c;并且也有中文版&#xff0c;應當是大家上手 mmdetection 的第一參考&#xff0c;本文是記錄一些筆者在小白階段上手 mmdetection 時的一些心得&#xff0c;這些東西沒有人提&#xff0c;可能是大佬們覺得這些…