99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

CUDA編程模型如何在c++實(shí)現(xiàn)

星星科技指導(dǎo)員 ? 來(lái)源:NVIDIA ? 作者:Ken He ? 2022-04-21 16:13 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

NVIDIA GPU 架構(gòu)圍繞可擴(kuò)展的多線程流式多處理器 (SM: Streaming Multiprocessors) 陣列構(gòu)建。當(dāng)主機(jī) CPU 上的 CUDA 程序調(diào)用內(nèi)核網(wǎng)格時(shí),網(wǎng)格的塊被枚舉并分發(fā)到具有可用執(zhí)行能力的多處理器。一個(gè)線程塊的線程在一個(gè)SM上并發(fā)執(zhí)行,多個(gè)線程塊可以在一個(gè)SM上并發(fā)執(zhí)行。當(dāng)線程塊終止時(shí),新塊在空出的SM上啟動(dòng)。

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

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

NVIDIA GPU 架構(gòu)使用 little-endian 表示。

4.1 SIMT 架構(gòu)

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

當(dāng)一個(gè)多處理器被賦予一個(gè)或多個(gè)線程塊來(lái)執(zhí)行時(shí),它將它們劃分為warp,并且每個(gè)warp都由warp調(diào)度程序調(diào)度以執(zhí)行。一個(gè)塊被分割成warp的方式總是一樣的;每個(gè)warp包含連續(xù)的線程,增加線程ID,第一個(gè)warp包含線程0。線程層次結(jié)構(gòu)描述了線程ID如何與塊中的線程索引相關(guān)。

一個(gè) warp 一次執(zhí)行一條公共指令,因此當(dāng)一個(gè) warp 的所有 32 個(gè)線程都同意它們的執(zhí)行路徑時(shí),就可以實(shí)現(xiàn)完全的效率。如果 warp 的線程通過(guò)依賴于數(shù)據(jù)的條件分支發(fā)散,則 warp 執(zhí)行所采用的每個(gè)分支路徑,禁用不在該路徑上的線程。分支分歧只發(fā)生在一個(gè)warp內(nèi);不同的 warp 獨(dú)立執(zhí)行,無(wú)論它們是執(zhí)行公共的還是不相交的代碼路徑。

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

在 Volta 之前,warp 使用在 warp 中的所有 32 個(gè)線程之間共享的單個(gè)程序計(jì)數(shù)器以及指定 warp 的活動(dòng)線程的活動(dòng)掩碼。結(jié)果,來(lái)自不同區(qū)域或不同執(zhí)行狀態(tài)的同一warp的線程無(wú)法相互發(fā)送信號(hào)或交換數(shù)據(jù),并且需要細(xì)粒度共享由鎖或互斥鎖保護(hù)的數(shù)據(jù)的算法很容易導(dǎo)致死鎖,具體取決于來(lái)自哪個(gè)warp競(jìng)爭(zhēng)線程。

從 Volta 架構(gòu)開始,獨(dú)立線程調(diào)度允許線程之間的完全并發(fā),而不管 warp。使用獨(dú)立線程調(diào)度,GPU 維護(hù)每個(gè)線程的執(zhí)行狀態(tài),包括程序計(jì)數(shù)器和調(diào)用堆棧,并且可以在每個(gè)線程的粒度上產(chǎn)生執(zhí)行,以便更好地利用執(zhí)行資源或允許一個(gè)線程等待數(shù)據(jù)由他人生產(chǎn)。調(diào)度優(yōu)化器確定如何將來(lái)自同一個(gè) warp 的活動(dòng)線程組合成 SIMT 單元。這保留了與先前 NVIDIA GPU 一樣的 SIMT 執(zhí)行的高吞吐量,但具有更大的靈活性:線程現(xiàn)在可以在 sub-warp 粒度上發(fā)散和重新收斂。

如果開發(fā)人員對(duì)先前硬件架構(gòu)的 warp-synchronicity2 做出假設(shè),獨(dú)立線程調(diào)度可能會(huì)導(dǎo)致參與執(zhí)行代碼的線程集與預(yù)期的完全不同。特別是,應(yīng)重新訪問(wèn)任何warp同步代碼(例如無(wú)同步、內(nèi)部warp減少),以確保與 Volta 及更高版本的兼容性。有關(guān)詳細(xì)信息,請(qǐng)參閱計(jì)算能力 7.x。

注意:

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

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

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

4.2 硬件多線程

多處理器處理的每個(gè) warp 的執(zhí)行上下文(程序計(jì)數(shù)器、寄存器等)在 warp 的整個(gè)生命周期內(nèi)都在芯片上維護(hù)。因此,從一個(gè)執(zhí)行上下文切換到另一個(gè)執(zhí)行上下文是沒(méi)有成本的,并且在每個(gè)指令發(fā)出時(shí),warp 調(diào)度程序都會(huì)選擇一個(gè)線程準(zhǔn)備好執(zhí)行其下一條指令(warp 的活動(dòng)線程)并將指令發(fā)布給這些線程。

特別是,每個(gè)多處理器都有一組 32 位寄存器,這些寄存器在 warp 之間進(jìn)行分區(qū),以及在線程塊之間進(jìn)行分區(qū)的并行數(shù)據(jù)緩存或共享內(nèi)存。

對(duì)于給定內(nèi)核,可以在多處理器上一起駐留和處理的塊和warp的數(shù)量取決于內(nèi)核使用的寄存器和共享內(nèi)存的數(shù)量以及多處理器上可用的寄存器和共享內(nèi)存的數(shù)量。每個(gè)多處理器也有最大數(shù)量的駐留塊和駐留warp的最大數(shù)量。這些限制以及多處理器上可用的寄存器數(shù)量和共享內(nèi)存是設(shè)備計(jì)算能力的函數(shù),在附錄計(jì)算能力中給出。如果每個(gè)多處理器沒(méi)有足夠的寄存器或共享內(nèi)存來(lái)處理至少一個(gè)塊,內(nèi)核將無(wú)法啟動(dòng)。

一個(gè)塊中的warp總數(shù)如下:

pYYBAGJhEkOAPzJ8AABJQgzZJ1g200.png

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

關(guān)于作者

Ken He 是 NVIDIA 企業(yè)級(jí)開發(fā)者社區(qū)經(jīng)理 & 高級(jí)講師,擁有多年的 GPU 和人工智能開發(fā)經(jīng)驗(yàn)。自 2017 年加入 NVIDIA 開發(fā)者社區(qū)以來(lái),完成過(guò)上百場(chǎng)培訓(xùn),幫助上萬(wàn)個(gè)開發(fā)者了解人工智能和 GPU 編程開發(fā)。在計(jì)算機(jī)視覺(jué),高性能計(jì)算領(lǐng)域完成過(guò)多個(gè)獨(dú)立項(xiàng)目。并且,在機(jī)器人無(wú)人機(jī)領(lǐng)域,有過(guò)豐富的研發(fā)經(jīng)驗(yàn)。對(duì)于圖像識(shí)別,目標(biāo)的檢測(cè)與跟蹤完成過(guò)多種解決方案。曾經(jīng)參與 GPU 版氣象模式GRAPES,是其主要研發(fā)者。

審核編輯:郭婷

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 機(jī)器人
    +關(guān)注

    關(guān)注

    213

    文章

    29756

    瀏覽量

    213051
  • NVIDIA
    +關(guān)注

    關(guān)注

    14

    文章

    5309

    瀏覽量

    106477
  • gpu
    gpu
    +關(guān)注

    關(guān)注

    28

    文章

    4949

    瀏覽量

    131324
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    適用于SystemC/C++驗(yàn)證的形式化解決方案

    雖然 SystemC/C++ 編程風(fēng)格已使用多年,但最近出現(xiàn)了一些特定使用模式,它們推動(dòng)工程團(tuán)隊(duì)采用共同的設(shè)計(jì)流程。這包括抽象算法設(shè)計(jì)代碼用作高層次綜合 (HLS) 工具的輸入,虛擬平臺(tái)模型用于早期軟件測(cè)試,可配置的知識(shí)產(chǎn)權(quán) (
    的頭像 發(fā)表于 06-24 11:07 ?542次閱讀
    適用于SystemC/<b class='flag-5'>C++</b>驗(yàn)證的形式化解決方案

    請(qǐng)問(wèn)如何在C++中使用NPU上的模型緩存?

    無(wú)法確定如何在 C++ 中的 NPU 上使用模型緩存
    發(fā)表于 06-24 07:25

    何在RAKsmart服務(wù)器上實(shí)現(xiàn)企業(yè)AI模型部署

    AI模型的訓(xùn)練與部署需要強(qiáng)大的算力支持、穩(wěn)定的網(wǎng)絡(luò)環(huán)境和專業(yè)的技術(shù)管理。RAKsmart作為全球領(lǐng)先的服務(wù)器托管與云計(jì)算服務(wù)提供商,已成為企業(yè)部署AI模型的理想選擇。那么,如何在RAKsmart服務(wù)器上
    的頭像 發(fā)表于 03-27 09:46 ?501次閱讀

    何在 樹莓派 上編寫和運(yùn)行 C 語(yǔ)言程序?

    在本教程中,我將討論C編程語(yǔ)言是什么,C編程的用途,以及如何在RaspberryPi上編寫和運(yùn)行C
    的頭像 發(fā)表于 03-25 09:28 ?576次閱讀
    如<b class='flag-5'>何在</b> 樹莓派 上編寫和運(yùn)行 <b class='flag-5'>C</b> 語(yǔ)言程序?

    C++學(xué)到什么程度可以找工作?

    C++開發(fā)的工作不僅需要深厚的編程功底,還要具備解決實(shí)際問(wèn)題的能力,以及良好的溝通能力和團(tuán)隊(duì)協(xié)作精神。此外,持續(xù)學(xué)習(xí)和更新自己的知識(shí)體系也是保持競(jìng)爭(zhēng)力的關(guān)鍵。
    發(fā)表于 03-13 10:19

    創(chuàng)建了用于OpenVINO?推理的自定義C++和Python代碼,從C++代碼中獲得的結(jié)果與Python代碼不同是為什么?

    創(chuàng)建了用于OpenVINO?推理的自定義 C++ 和 Python* 代碼。 在兩個(gè)推理過(guò)程中使用相同的圖像和模型。 從 C++ 代碼中獲得的結(jié)果與 Python* 代碼不同。
    發(fā)表于 03-06 06:22

    使用person-detection-action-recognition-0006模型運(yùn)行智能課堂C++演示遇到報(bào)錯(cuò)怎么解決?

    使用以下命令運(yùn)行帶有 person-detection-action-recognition-0006 模型的智能課堂 C++ 演示: smart_classroom_demo.exe
    發(fā)表于 03-05 07:13

    為什么無(wú)法在運(yùn)行時(shí)C++推理中讀取OpenVINO?模型?

    使用模型優(yōu)化器 2021.1 版OpenVINO?轉(zhuǎn)換模型 使用 Runtime 2022.3 版本在 C++ 推理實(shí)現(xiàn) ( core.read_model()) 中讀取
    發(fā)表于 03-05 06:17

    何在C#中部署飛槳PP-OCRv4模型

    《超4萬(wàn)6千星的開源OCR黑馬登場(chǎng),PaddleOCR憑什么脫穎而出?》收到了讀者熱烈反響c,很多讀者提出:如何在C#中部署飛槳PP-OCRv4模型?本文從零開始詳細(xì)介紹整個(gè)過(guò)程。
    的頭像 發(fā)表于 02-17 10:58 ?1796次閱讀
    如<b class='flag-5'>何在</b><b class='flag-5'>C</b>#中部署飛槳PP-OCRv4<b class='flag-5'>模型</b>

    Spire.XLS for C++組件說(shuō)明

    Spire.XLS for C++ 是一款專業(yè)的 C++ Excel 組件,可以用在各種 C++ 框架和應(yīng)用程序中。Spire.XLS for C++ 提供了一個(gè)對(duì)象
    的頭像 發(fā)表于 01-14 09:40 ?635次閱讀
    Spire.XLS for <b class='flag-5'>C++</b>組件說(shuō)明

    EE-112:模擬C++中的類實(shí)現(xiàn)

    電子發(fā)燒友網(wǎng)站提供《EE-112:模擬C++中的類實(shí)現(xiàn).pdf》資料免費(fèi)下載
    發(fā)表于 01-03 15:15 ?0次下載
    EE-112:模擬<b class='flag-5'>C++</b>中的類<b class='flag-5'>實(shí)現(xiàn)</b>

    運(yùn)動(dòng)控制卡周期上報(bào)實(shí)時(shí)數(shù)據(jù)IO狀態(tài)之C++

    使用C++進(jìn)行運(yùn)動(dòng)控制卡的周期上報(bào)功能實(shí)現(xiàn)
    的頭像 發(fā)表于 12-17 13:59 ?837次閱讀
    運(yùn)動(dòng)控制卡周期上報(bào)實(shí)時(shí)數(shù)據(jù)IO狀態(tài)之<b class='flag-5'>C++</b>篇

    C++新手容易犯的十個(gè)編程錯(cuò)誤

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

    C語(yǔ)言和C++中結(jié)構(gòu)體的區(qū)別

    同樣是結(jié)構(gòu)體,看看在C語(yǔ)言和C++中有什么區(qū)別?
    的頭像 發(fā)表于 10-30 15:11 ?782次閱讀

    C7000優(yōu)化C/C++編譯器

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