色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

CUDA編程模型如何在c++實現

星星科技指導員 ? 來源:NVIDIA ? 作者:Ken He ? 2022-04-21 16:13 ? 次閱讀

本章通過概述CUDA編程模型是如何在c++中公開的,來介紹CUDA的主要概念。

NVIDIA GPU 架構圍繞可擴展的多線程流式多處理器 (SM: Streaming Multiprocessors) 陣列構建。當主機 CPU 上的 CUDA 程序調用內核網格時,網格的塊被枚舉并分發到具有可用執行能力的多處理器。一個線程塊的線程在一個SM上并發執行,多個線程塊可以在一個SM上并發執行。當線程塊終止時,新塊在空出的SM上啟動。

SM旨在同時執行數百個線程。為了管理如此大量的線程,它采用了一種稱為 SIMT(Single-Instruction, Multiple-Thread: 單指令,多線程)的獨特架構,在 SIMT 架構中進行了描述。這些指令是流水線的,利用單個線程內的指令級并行性,以及通過同時硬件多線程處理的廣泛線程級并行性,如硬件多線程中詳述。與 CPU 內核不同,它們是按順序發出的,沒有分支預測或推測執行。

SIMT 架構和硬件多線程描述了所有設備通用的流式多處理器的架構特性。 Compute Capability 3.x、Compute Capability 5.x、Compute Capability 6.x 和 Compute Capability 7.x 分別為計算能力 3.x、5.x、6.x 和 7.x 的設備提供了詳細信息

NVIDIA GPU 架構使用 little-endian 表示。

4.1 SIMT 架構

多處理器以 32 個并行線程組(稱為 warp)的形式創建、管理、調度和執行線程。組成 warp 的各個線程一起從同一個程序地址開始,但它們有自己的指令地址計數器和寄存器狀態,因此可以自由地分支和獨立執行。warp一詞源于編織,這是第一個并行線程技術。半warp是warp的前半部分或后半部分。四分之一經線是warp的第一、第二、第三或第四四分之一。

當一個多處理器被賦予一個或多個線程塊來執行時,它將它們劃分為warp,并且每個warp都由warp調度程序調度以執行。一個塊被分割成warp的方式總是一樣的;每個warp包含連續的線程,增加線程ID,第一個warp包含線程0。線程層次結構描述了線程ID如何與塊中的線程索引相關。

一個 warp 一次執行一條公共指令,因此當一個 warp 的所有 32 個線程都同意它們的執行路徑時,就可以實現完全的效率。如果 warp 的線程通過依賴于數據的條件分支發散,則 warp 執行所采用的每個分支路徑,禁用不在該路徑上的線程。分支分歧只發生在一個warp內;不同的 warp 獨立執行,無論它們是執行公共的還是不相交的代碼路徑。

SIMT 體系結構類似于 SIMD(單指令多數據)向量組織,其中單指令控制多個處理元素。一個關鍵區別是 SIMD 矢量組織向軟件公開了 SIMD 寬度,而 SIMT 指令指定單個線程的執行和分支行為。與 SIMD 向量機相比,SIMT 使程序員能夠為獨立的標量線程編寫線程級并行代碼,以及為協調線程編寫數據并行代碼。為了正確起見,程序員基本上可以忽略 SIMT 行為;但是,通過代碼很少需要warp中的線程發散,可以實現顯著的性能改進。在實踐中,這類似于傳統代碼中緩存線的作用:在設計正確性時可以安全地忽略緩存線大小,但在設計峰值性能時必須在代碼結構中考慮。另一方面,向量架構需要軟件將負載合并到向量中并手動管理分歧。

在 Volta 之前,warp 使用在 warp 中的所有 32 個線程之間共享的單個程序計數器以及指定 warp 的活動線程的活動掩碼。結果,來自不同區域或不同執行狀態的同一warp的線程無法相互發送信號或交換數據,并且需要細粒度共享由鎖或互斥鎖保護的數據的算法很容易導致死鎖,具體取決于來自哪個warp競爭線程。

從 Volta 架構開始,獨立線程調度允許線程之間的完全并發,而不管 warp。使用獨立線程調度,GPU 維護每個線程的執行狀態,包括程序計數器和調用堆棧,并且可以在每個線程的粒度上產生執行,以便更好地利用執行資源或允許一個線程等待數據由他人生產。調度優化器確定如何將來自同一個 warp 的活動線程組合成 SIMT 單元。這保留了與先前 NVIDIA GPU 一樣的 SIMT 執行的高吞吐量,但具有更大的靈活性:線程現在可以在 sub-warp 粒度上發散和重新收斂。

如果開發人員對先前硬件架構的 warp-synchronicity2 做出假設,獨立線程調度可能會導致參與執行代碼的線程集與預期的完全不同。特別是,應重新訪問任何warp同步代碼(例如無同步、內部warp減少),以確保與 Volta 及更高版本的兼容性。有關詳細信息,請參閱計算能力 7.x。

注意:

參與當前指令的 warp 線程稱為活動線程,而不在當前指令上的線程是非活動的(禁用)。線程可能由于多種原因而處于非活動狀態,包括比其 warp 的其他線程更早退出,采用與 warp 當前執行的分支路徑不同的分支路徑,或者是線程數不是線程數的塊的最后一個線程warp尺寸的倍數。

如果 warp 執行的非原子指令為多個 warp 的線程寫入全局或共享內存中的同一位置,則該位置發生的序列化寫入次數取決于設備的計算能力(參見 Compute Capability 3.x、Compute Capability 5.x、Compute Capability 6.x 和 Compute Capability 7.x),哪個線程執行最終寫入是未定義的。

如果一個由 warp 執行的原子指令讀取、修改和寫入全局內存中多個線程的同一位置,則對該位置的每次讀取/修改/寫入都會發生并且它們都被序列化,但是它們發生的順序是不確定的。

4.2 硬件多線程

多處理器處理的每個 warp 的執行上下文(程序計數器、寄存器等)在 warp 的整個生命周期內都在芯片上維護。因此,從一個執行上下文切換到另一個執行上下文是沒有成本的,并且在每個指令發出時,warp 調度程序都會選擇一個線程準備好執行其下一條指令(warp 的活動線程)并將指令發布給這些線程。

特別是,每個多處理器都有一組 32 位寄存器,這些寄存器在 warp 之間進行分區,以及在線程塊之間進行分區的并行數據緩存或共享內存。

對于給定內核,可以在多處理器上一起駐留和處理的塊和warp的數量取決于內核使用的寄存器和共享內存的數量以及多處理器上可用的寄存器和共享內存的數量。每個多處理器也有最大數量的駐留塊和駐留warp的最大數量。這些限制以及多處理器上可用的寄存器數量和共享內存是設備計算能力的函數,在附錄計算能力中給出。如果每個多處理器沒有足夠的寄存器或共享內存來處理至少一個塊,內核將無法啟動。

一個塊中的warp總數如下:

pYYBAGJhEkOAPzJ8AABJQgzZJ1g200.png

為塊分配的寄存器總數和共享內存總量記錄在 CUDA 工具包中提供的 CUDA Occupancy Calculator中。

關于作者

Ken He 是 NVIDIA 企業級開發者社區經理 & 高級講師,擁有多年的 GPU 和人工智能開發經驗。自 2017 年加入 NVIDIA 開發者社區以來,完成過上百場培訓,幫助上萬個開發者了解人工智能和 GPU 編程開發。在計算機視覺,高性能計算領域完成過多個獨立項目。并且,在機器人無人機領域,有過豐富的研發經驗。對于圖像識別,目標的檢測與跟蹤完成過多種解決方案。曾經參與 GPU 版氣象模式GRAPES,是其主要研發者。

審核編輯:郭婷

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 機器人
    +關注

    關注

    211

    文章

    28512

    瀏覽量

    207511
  • NVIDIA
    +關注

    關注

    14

    文章

    5021

    瀏覽量

    103261
  • gpu
    gpu
    +關注

    關注

    28

    文章

    4753

    瀏覽量

    129065
收藏 人收藏

    評論

    相關推薦

    EE-112:模擬C++中的類實現

    電子發燒友網站提供《EE-112:模擬C++中的類實現.pdf》資料免費下載
    發表于 01-03 15:15 ?0次下載
    EE-112:模擬<b class='flag-5'>C++</b>中的類<b class='flag-5'>實現</b>

    C++新手容易犯的十個編程錯誤

    簡單的總結一下?C++ 新手容易犯的一些編程錯誤,給新人們提供一個參考。 1 有些關鍵字在 cpp 文件中多寫了 對于 C++ 類,一些關鍵字只要寫在 .h 中就好,cpp 中就不用再加上了,比如
    的頭像 發表于 11-15 12:42 ?412次閱讀

    C7000優化C/C++編譯器

    電子發燒友網站提供《C7000優化C/C++編譯器.pdf》資料免費下載
    發表于 10-30 09:45 ?0次下載
    <b class='flag-5'>C</b>7000優化<b class='flag-5'>C</b>/<b class='flag-5'>C++</b>編譯器

    C++語言基礎知識

    電子發燒友網站提供《C++語言基礎知識.pdf》資料免費下載
    發表于 07-19 10:58 ?7次下載

    C++實現類似instanceof的方法

    函數,可實際上C++中沒有。但是別著急,其實C++中有兩種簡單的方法可以實現類似Java中的instanceof的功能。 在 C++ 中,確定對象的類型是
    的頭像 發表于 07-18 10:16 ?613次閱讀
    <b class='flag-5'>C++</b>中<b class='flag-5'>實現</b>類似instanceof的方法

    FX2 CY7C68013A如何在C++環境中使用LoadEEPROM函數?

    我使用的是 FX2 CY7C68013A 芯片。 我知道 CyUSB.NET 庫中有我需要的 LoadEEPROM 函數。 請問如何在 C++ 環境而不是 C#/CLR 環境中使用該函
    發表于 05-31 06:59

    何在FX3 SuperSpeed explorer等電路板上使用openOCD調試C++項目?

    配置與文檔中的完全相同。 因此,我想請教如何在 FX3 SuperSpeed explorer 等電路板上使用 openOCD 調試我的 C++ 項目? 回到純 C 項目并不是一個真正的選擇,而且僅通過 uart 進行調試是不夠
    發表于 05-23 08:16

    STM32CubeMX如何在*.c源文件中使用c++特性?

    開發環境:Visual Studio 2015 + VisualGDB (編譯器為arm-eabi GCC 7.2.0)+ STM32CubeMX cc++混合編程情況下,*.c文件
    發表于 04-25 06:15

    鴻蒙OS開發實例:【Native C++

    使用DevEco Studio創建一個Native C++應用。應用采用Native C++模板,實現使用NAPI調用C標準庫的功能。使用C
    的頭像 發表于 04-14 11:43 ?2679次閱讀
    鴻蒙OS開發實例:【Native <b class='flag-5'>C++</b>】

    為什么很少用C++開發單片機

    C語言是面向過程的語言,C++是面向對象的編程語言。結合本文來說,面向過程相比面向對象的編程,生成代碼量(bin文件)更小,運行效率更高。
    發表于 03-25 14:26 ?1050次閱讀
    為什么很少用<b class='flag-5'>C++</b>開發單片機

    CY8C624AAZI-S2D44如何在PSoC Creator4.4中實現編程開發?

    CY8C624AAZI-S2D44如何在PSoC Creator4.4實現編程開發?
    發表于 03-05 06:17

    c語言,c++,java,python區別

    C語言、C++、Java和Python是四種常見的編程語言,各有優點和特點。 C語言: C語言是一種面向過程的
    的頭像 發表于 02-05 14:11 ?2459次閱讀

    vb語言和c++語言的區別

    VB語言和C++語言是兩種不同的編程語言,雖然它們都屬于高級編程語言,但在設計和用途上有很多區別。下面將詳細比較VB語言和C++語言的區別。 設計目標: VB語言(Visual Bas
    的頭像 發表于 02-01 10:20 ?2387次閱讀

    基于QT5+OpenCV+OpenVINO C++的應用打包過程

    我用QT C++寫了一個YOLOv5模型推理演示應用。
    的頭像 發表于 01-26 10:17 ?1346次閱讀
    基于QT5+OpenCV+OpenVINO <b class='flag-5'>C++</b>的應用打包過程

    C++簡史:C++是如何開始的

    的 MISRA C++:2023 博客系列的第二部分。 在這篇博客中,我們將深入探討 C++ 的歷史、編程語言多年來的發展歷程以及它的下一步發展方向。
    的頭像 發表于 01-11 09:00 ?622次閱讀
    <b class='flag-5'>C++</b>簡史:<b class='flag-5'>C++</b>是如何開始的
    主站蜘蛛池模板: 老男人粗大猛| 热久久视久久精品18| 消息称老熟妇乱视频一区二区 | 亚洲AV一宅男色影视| 精品一区二区免费视频蜜桃网| 在线欧美精品一区二区三区| 欧美含羞草免费观看全部完| 国产高潮久久精品AV无码| 亚洲视频不卡| 欧美三级黄色大片| 国产精品一库二库三库 | www.av一区| 洗濯屋H纯肉动漫在线观看| 久久免费精品一区二区| 苍井空a 集在线观看网站| 性美国人xxxxx18| 麻豆成人啪啪色婷婷久久| 俄罗斯搜索引擎Yandex推广入口| 亚洲看片无码免费视频| 女的把腿张开男的往里面插| 国产亚洲精品久久久久久入口| 97色伦图片7778久久| 乡土女性网动态图解| 免费毛片视频网站| 国产亚洲日韩另类在线观看| 992交通广播| 亚洲久热无码中文字幕| 青青草AV国产精品| 九九热这里都是精品| 高清不卡伦理电影在线观看| 中文字幕免费在线视频| 无套内射无矿码免费看黄| 名女躁b久久天天躁| 国产亚洲精品品视频在线| japanese色系free日本| 一个人的HD高清在线观看| 手机在线免费看毛片| 浓毛BWBWBWBWBW日本| 久草色香蕉视频在线| 国产露脸150部国语对白| yy4408午夜场理论片|