Nvidia CUDA初級教程7 CUDA編程二

Nvidia CUDA初級教程7 CUDA編程二

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

本節內容:

  • 內置類型和函數 Built-ins and functions
  • 線程同步 Synchronizing
  • 線程調度 Scheduling threads
  • 存儲模型 Memory model
  • 重訪 Matrix multiply
  • 原子函數 Atomic functions

函數的聲明

執行調用
__global__ void KernelFunc()devicehost
__device__ float DeviceFunc()devicedevice
__host__ float Hosthosthost
  • __device____host__ 可以同時修飾一個函數
  • __global__ 的返回值必須是 void
  • __device__ 曾經默認內聯,現在有些變化
  • 對于 global 和 device:
    • 盡量少用遞歸(不鼓勵)
    • 不要用靜態變量
    • 少用 malloc(現在允許但不鼓勵)
    • 小心通過指針實現函數調用

向量數據類型

  • char[1-4], uchar[1-4]
  • short[1-4], ushort[1-4]
  • int[1-4], uint[1-4]
  • long[1-4], ulong[1-4]
  • longlong[1-4], ulonglong[1-4]
  • float[1-4]
  • double1, double2

  • 同時適用于 host 和 device 代碼

  • 通過函數 make_<type name> 構造

    int2 i2 = make_int2(1, 2);
    float4 f4 = make_float4(1.0f, 2.0f, 3.0f, 4.0f);
    
  • 通過 .x, .y, .z, ,w 訪問

    int x = i2.x;
    int y = i2.y;
    

數學函數

  • 部分函數列表

    • sqrt, rsqrt
    • exp, log
    • sin, cos, tan, sincos
    • asin, acos, atan2
    • trunc, ceil, floor
  • Intrinsic function 內建函數

    • 僅面向 device 設備端

    • 更快,但是精度降低

    • __ 為前綴,例如:

      __exp, __log, __sin, __pow, …

線程層次回顧

線程同步

  • 塊內的線程可以同步
    • 調用 __syncthreads 創建一個 barrier
    • 每個線程在調用點等待塊內所有線程執行到這個地方,然后所有線程繼續執行后續指令
Mds[i] = Md[j];
__syncthreads();
func(Mds[i], Mds[i+1]);
  • 要求線程的執行時間盡量接近

  • 只在一個塊內進行同步

  • 線程同步可能會導致死鎖

    if (someFunc()) {__syncthreads();
    }
    else {__syncthreads();	// 注意這兩個barrier不是同一個
    }
    

    線程調度

在這里插入圖片描述

  • 多線程切換,達到延遲掩藏的效果。

  • warp - 塊內的一組線程

    • 運行于同一個SM

    • 線程調度的基本單位

    • 一個warp內是天然同步的(硬件保證)

    • warp 調度是零開銷的

    • 一個SM上某個時刻只會有一個warp再執行

    • threadIdx 值連續

    • 一個實現細節 - 理論上

      • warpSize
    • warp內執行不同的分支的情況:divergent warp

      其他的分支需要等待該分支進行

在這里插入圖片描述

舉例:

  • 如果一個 SM 分配了 3 個 block,其中每個 block 含 256 個線程,總共有多少個 warp(warp大小為32)?

    一個 block 內有 256/32 = 8個 warp,一個 SM 內共有 8 * 3 = 24個

  • GT200 的一個 SM 最多可以駐扎 1024 個線程,那相當于多少個 warp?

    1024 / 32 = 32

每個 warp 含 32 個小牛橙,但是每個 SM 只有 8 個 SPs,如何分配?

當一個 SM 調度一個 warp 時:

  • 指令已經預備
  • 在第一個周期 8 個線程進入 SPs
  • 在第二三四個周期也分別進入 8 個線程
  • 因此,分發一個 warp 需要4個周期

另一個問題:

一個 kernel 包含:

  • 1 次對 global memory 的讀操作(200 cycles)
  • 4 次獨立的 multiples/adds 操作

需要多少個 warp 才可以隱藏內存延遲?

解:

每個 warp 含 4 個 multiple/adds 操作需要16 個周期,我們需要覆蓋 200 個周期,200 / 16 = 12.5 ,ceil(12.5)=13,需要 13 個 warps。

內存模型回顧

內存模型

寄存器 registers - G80

  • 每個 SM,多達 768 個 threads,8K 個寄存器,即每個線程可以分到 8K / 768 = 10 個寄存器

  • 超出限制后,線程數將因為 block 的減少而減少

    因為同一個 block 必須在同一個 SM 內

    例如,每個線程用到 11 個寄存器,而由于每個 block 含 256 個線程,則:

    • 一個 SM 可以駐扎多少個線程?512(兩個block)
    • 一個 SM 可以駐扎多少個 warp? 16
    • warp 數少了意味著什么?效率降低

local memory

  • 存儲于 global memory,作用域是每個 thread
  • 用于存儲自動變量數組,通過常量索引訪問

shared memory

  • 每個塊
  • 快速,片上,可讀寫
  • 全速隨機訪問

global memory

  • 長延遲(100個周期)
  • 片外,可讀寫
  • 隨機訪問影響性能
  • host 主機端可讀寫

constant memory

  • 短延時,高帶寬,當所有線程訪問同一位置時只讀
  • 存儲于 global memory,但是有緩存
  • host 主機端可讀寫
  • 容量:64KB

變量聲明

變量聲明存儲器作用域生命期
必須是單獨的自動變量而不能是數組registerthreadkernel
自動變量數組localthreadkernel
__shared__ int sharedVar;sharedblockkernel
__device__ int globalVar;globalgridapplication
__constant__ int constantVarconstantgridapplication

關于 global and constant 變量

  • Host 可以通過以下函數訪問:
    • cudaGetSymbolAddress()
    • cudaGetSymbolSize()
    • cudaMemcpyToSymbol()
    • cudaMemcpyFromSymbol()
  • constants 變量必須在函數外聲明

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

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

相關文章

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

萬字長文 | 詳解優酷視頻質量評價體系 分享嘉賓&#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;可能是大佬們覺得這些…

docker gpu報錯Error response from daemon: could not select device driver ““ with capabilities: [[gpu]]

Docker容器中使用Nvidia GPU報錯 docker: Error response from daemon: could not select device driver “” with capabilities: [[gpu]]. 問題出現 我們知道&#xff0c;想要在 docker19 及之后的版本中使用 nvidia gpu 已經不需要單獨安裝 nvidia-docker 了&#xff0c;這…

CUDA環境詳解

CUDA環境詳解 本文主要介紹 CUDA 環境&#xff0c;這一堆東西網上有很多博客介紹過了&#xff0c;我再來一篇:)&#xff0c;參考前輩們的文章&#xff0c;看能不能寫的更清楚一點。讀后仍有問題&#xff0c;歡迎留言交流。 CUDA APIs CUDA是由NVIDIA推出的通用并行計算架構&…

共享內存簡介及docker容器的shm設置與修改

共享內存簡介及docker容器的shm設置與修改 共享內存簡介 共享內存指 (shared memory)在多處理器的計算機系統中&#xff0c;可以被不同中央處理器&#xff08;CPU&#xff09;訪問的大容量內存。由于多個CPU需要快速訪問存儲器&#xff0c;這樣就要對存儲器進行緩存&#xff…

對Docker鏡像layer的理解

對Docker鏡像layer的理解 轉自&#xff1a;https://blog.csdn.net/u011069294/article/details/105583522 FROM python:3.6.1-alpine RUN pip install flask CMD [“python”,“app.py”] COPY app.py /app.py上面是一個Dockerfile的例子&#xff0c;每一行都會生成一個新的l…