国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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

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

3天內不再提示

CUDA簡介: CUDA編程模型概述

星星科技指導員 ? 來源:NVIDIA ? 作者:Ken He ? 2022-04-20 17:16 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

本章和下一章中使用的向量加法示例的完整代碼可以在 vectorAddCUDA示例中找到。

2.1 內核

CUDA C++ 通過允許程序員定義稱為kernel的 C++ 函數來擴展 C++,當調用內核時,由 N 個不同的 CUDA 線程并行執行 N 次,而不是像常規 C++ 函數那樣只執行一次。

使用__global__聲明說明符定義內核,并使用新的<<<...>>>執行配置語法指定內核調用的 CUDA 線程數(請參閱C++ 語言擴展)。 每個執行內核的線程都有一個唯一的線程 ID,可以通過內置變量在內核中訪問。

作為說明,以下示例代碼使用內置變量threadIdx將兩個大小為 N 的向量 A 和 B 相加,并將結果存儲到向量 C 中:

// Kernel definition
__global__ void VecAdd(float* A, float* B, float* C)
{
    int i = threadIdx.x;
    C[i] = A[i] + B[i];
}

int main()
{
    ...
    // Kernel invocation with N threads
    VecAdd<<<1, N>>>(A, B, C);
    ...
}

這里,執行 VecAdd() 的 N 個線程中的每一個線程都會執行一個加法。

2.2 線程層次

為方便起見,threadIdx 是一個 3 分量向量,因此可以使用一維、二維或三維的線程索引來識別線程,形成一個一維、二維或三維的線程塊,稱為block。 這提供了一種跨域的元素(例如向量、矩陣或體積)調用計算的方法。

線程的索引和它的線程 ID 以一種直接的方式相互關聯:對于一維塊,它們是相同的; 對于大小為(Dx, Dy)的二維塊,索引為(x, y)的線程的線程ID為(x + y*Dx); 對于大小為 (Dx, Dy, Dz) 的三維塊,索引為 (x, y, z) 的線程的線程 ID 為 (x + y*Dx + z*Dx*Dy)。

例如,下面的代碼將兩個大小為NxN的矩陣A和B相加,并將結果存儲到矩陣C中:

// Kernel definition
__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()
{
    ...
    // Kernel invocation
    dim3 threadsPerBlock(16, 16);
    dim3 numBlocks(N / threadsPerBlock.x, N / threadsPerBlock.y);
    MatAdd<<>>(A, B, C);
    ...
}

每個塊的線程數量是有限制的,因為一個塊的所有線程都應該駐留在同一個處理器核心上,并且必須共享該核心有限的內存資源。在當前的gpu上,一個線程塊可能包含多達1024個線程。

但是,一個內核可以由多個形狀相同的線程塊執行,因此線程總數等于每個塊的線程數乘以塊數。

塊被組織成一維、二維或三維的線程塊網格(grid),如下圖所示。網格中的線程塊數量通常由正在處理的數據的大小決定,通常超過系統中的處理器數量。

poYBAGJfz1SAc0eUAAAzEbPU_94657.png

<<<...>>>語法中指定的每個塊的線程數和每個網格的塊數可以是int或dim3類型。如上例所示,可以指定二維塊或網格。

網格中的每個塊都可以由一個一維、二維或三維的惟一索引標識,該索引可以通過內置的blockIdx變量在內核中訪問。線程塊的維度可以通過內置的blockDim變量在內核中訪問。

擴展前面的MatAdd()示例來處理多個塊,代碼如下所示。

// Kernel definition
__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()
{
    ...
    // Kernel invocation with one block of N * N * 1 threads
    int numBlocks = 1;
    dim3 threadsPerBlock(N, N);
    MatAdd<<>>(A, B, C);
    ...
}

線程塊大小為16×16(256個線程),盡管在本例中是任意更改的,但這是一種常見的選擇。網格是用足夠的塊創建的,這樣每個矩陣元素就有一個線程來處理。為簡單起見,本例假設每個維度中每個網格的線程數可以被該維度中每個塊的線程數整除,盡管事實并非如此。

程塊需要獨立執行:必須可以以任何順序執行它們,并行或串行。 這種獨立性要求允許跨任意數量的內核以任意順序調度線程塊,如下圖所示,使程序員能夠編寫隨內核數量擴展的代碼。

pYYBAGJfz1WAV_XeAAAimxxX_Gg894.png

塊內的線程可以通過一些共享內存共享數據并通過同步它們的執行來協調內存訪問來進行協作。 更準確地說,可以通過調用__syncthreads()內部函數來指定內核中的同步點;__syncthreads()充當屏障,塊中的所有線程必須等待,然后才能繼續。Shared Memory給出了一個使用共享內存的例子。 除了__syncthreads()之外,Cooperative Groups API還提供了一組豐富的線程同步示例。

為了高效協作,共享內存是每個處理器內核附近的低延遲內存(很像 L1 緩存),并且__syncthreads()是輕量級的。

2.3 存儲單元層次

CUDA 線程可以在執行期間從多個內存空間訪問數據,如下圖所示。每個線程都有私有的本地內存。 每個線程塊都具有對該塊的所有線程可見的共享內存,并且具有與該塊相同的生命周期。 所有線程都可以訪問相同的全局內存。

poYBAGJfz1aAANKCAABEZXfRSos283.png

還有兩個額外的只讀內存空間可供所有線程訪問:常量和紋理內存空間。 全局、常量和紋理內存空間針對不同的內存使用進行了優化(請參閱設備內存訪問)。 紋理內存還為某些特定數據格式提供不同的尋址模式以及數據過濾(請參閱紋理和表面內存)。

全局、常量和紋理內存空間在同一應用程序的內核啟動中是持久的。

2.4 異構編程

如下圖所示,CUDA 編程模型假定 CUDA 線程在物理獨立的設備上執行,該設備作為運行 C++ 程序的主機的協處理器運行。例如,當內核在 GPU 上執行而 C++ 程序的其余部分在 CPU 上執行時,就是這種情況。

pYYBAGJfz1eASl19AAFTsEqvGdo417.png

CUDA 編程模型還假設主機(host)和設備(device)都在 DRAM 中維護自己獨立的內存空間,分別稱為主機內存和設備內存。因此,程序通過調用 CUDA 運行時(在編程接口中描述)來管理內核可見的全局、常量和紋理內存空間。這包括設備內存分配和釋放以及主機和設備內存之間的數據傳輸。

統一內存提供托管內存來橋接主機和設備內存空間。托管內存可從系統中的所有 CPU 和 GPU 訪問,作為具有公共地址空間的單個連貫內存映像。此功能可實現設備內存的超額訂閱,并且無需在主機和設備上顯式鏡像數據,從而大大簡化了移植應用程序的任務。有關統一內存的介紹,請參閱統一內存編程。

注:串行代碼在主機(host)上執行,并行代碼在設備(device)上執行。

2.5 異步SIMT編程模型

在 CUDA 編程模型中,線程是進行計算或內存操作的最低抽象級別。 從基于 NVIDIA Ampere GPU 架構的設備開始,CUDA 編程模型通過異步編程模型為內存操作提供加速。 異步編程模型定義了與 CUDA 線程相關的異步操作的行為。

異步編程模型為 CUDA 線程之間的同步定義了異步屏障的行為。 該模型還解釋并定義了如何使用 cuda::memcpy_async 在 GPU計算時從全局內存中異步移動數據。

2.5.1 異步操作

異步操作定義為由CUDA線程發起的操作,并且與其他線程一樣異步執行。在結構良好的程序中,一個或多個CUDA線程與異步操作同步。發起異步操作的CUDA線程不需要在同步線程中.

這樣的異步線程(as-if 線程)總是與發起異步操作的 CUDA 線程相關聯。異步操作使用同步對象來同步操作的完成。這樣的同步對象可以由用戶顯式管理(例如,cuda::memcpy_async)或在庫中隱式管理(例如,cooperative_groups::memcpy_async)。

同步對象可以是cuda::barrier或cuda::pipeline。這些對象在Asynchronous Barrier和Asynchronous Data Copies using cuda::pipeline.中進行了詳細說明。這些同步對象可以在不同的線程范圍內使用。作用域定義了一組線程,這些線程可以使用同步對象與異步操作進行同步。下表定義了CUDA c++中可用的線程作用域,以及可以與每個線程同步的線程。

這些線程作用域是在CUDA標準c++庫中作為標準c++的擴展實現的。

2.6 Compute Capability

設備的Compute Capability由版本號表示,有時也稱其“SM版本”。該版本號標識GPU硬件支持的特性,并由應用程序在運行時使用,以確定當前GPU上可用的硬件特性和指令。

Compute Capability包括一個主要版本號X和一個次要版本號Y,用X.Y表示

主版本號相同的設備具有相同的核心架構。設備的主要修訂號是8,為NVIDIA Ampere GPU的體系結構的基礎上,7基于Volta設備架構,6設備基于Pascal架構,5設備基于Maxwell架構,3基于Kepler架構的設備,2設備基于Fermi架構,1是基于Tesla架構的設備。

次要修訂號對應于對核心架構的增量改進,可能包括新特性。

Turing是計算能力7.5的設備架構,是基于Volta架構的增量更新。

CUDA-Enabled GPUs列出了所有支持 CUDA 的設備及其計算能力。Compute Capabilities給出了每個計算能力的技術規格。

關于作者

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

審核編輯:郭婷

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

    關注

    14

    文章

    5594

    瀏覽量

    109725
  • gpu
    gpu
    +關注

    關注

    28

    文章

    5194

    瀏覽量

    135438
  • 人工智能
    +關注

    關注

    1817

    文章

    50098

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    RV生態又一里程碑:英偉達官宣CUDA將兼容RISC-V架構!

    電子發燒友網報道(文/梁浩斌)英偉達生態護城河CUDA,從最初支持x86、Power?CPU架構,到2019年宣布支持Arm?CPU,不斷拓展在數據中心的應用生態。 在2019年至今的六年
    的頭像 發表于 07-19 00:04 ?6587次閱讀
    RV生態又一里程碑:英偉達官宣<b class='flag-5'>CUDA</b>將兼容RISC-V架構!

    摩爾線程快速完成對Qwen3.5模型全面適配

    MUSA C編程語言及Triton-MUSA工具鏈高效完成模型部署與優化。 在Qwen3.5的適配過程中,摩爾線程驗證了MUSA生態的兩大核心能力:原生MUSA C支持讓開發者可直接使用MUSA C進行
    發表于 02-18 08:32 ?168次閱讀

    借助NVIDIA CUDA Tile IR后端推進OpenAI Triton的GPU編程

    NVIDIA CUDA Tile 是基于 GPU 的編程模型,其設計目標是為 NVIDIA Tensor Cores 提供可移植性,從而釋放 GPU 的極限性能。CUDA Tile 的
    的頭像 發表于 02-10 10:31 ?241次閱讀

    如何在NVIDIA CUDA Tile中編寫高性能矩陣乘法

    本博文是系列課程的一部分,旨在幫助開發者學習 NVIDIA CUDA Tile 編程,掌握構建高性能 GPU 內核的方法,并以矩陣乘法作為核心示例。
    的頭像 發表于 01-22 16:43 ?4821次閱讀
    如何在NVIDIA <b class='flag-5'>CUDA</b> Tile中編寫高性能矩陣乘法

    NVIDIA CUDA Tile的創新之處、工作原理以及使用方法

    NVIDIA CUDA 13.1 推出 NVIDIA CUDA Tile,這是自 2006 年 NVIDIA CUDA 平臺發明以來,最大的一次技術進步。這一令人振奮的創新引入了一套面向
    的頭像 發表于 12-24 10:17 ?464次閱讀
    NVIDIA <b class='flag-5'>CUDA</b> Tile的創新之處、工作原理以及使用方法

    在Python中借助NVIDIA CUDA Tile簡化GPU編程

    NVIDIA CUDA 13.1 版本新增了基于 Tile 的GPU 編程模式。它是自 CUDA 發明以來 GPU 編程最核心的更新之一。借助 GPU tile kernels,可以用
    的頭像 發表于 12-13 10:12 ?1194次閱讀
    在Python中借助NVIDIA <b class='flag-5'>CUDA</b> Tile簡化GPU<b class='flag-5'>編程</b>

    NVIDIA CUDA 13.1版本的新增功能與改進

    NVIDIA CUDA 13.1 是自 CUDA 二十年前發明以來,規模最大、內容最全面的一次更新。
    的頭像 發表于 12-13 10:08 ?2206次閱讀

    首款全國產訓推一體AI芯片發布,兼容CUDA生態

    CUDA生態體系。該芯片支持從單機多卡到千卡級集群的靈活擴展,能效比達3.41 TFLOPS/W——在同等功
    的頭像 發表于 11-30 07:20 ?9522次閱讀
    首款全國產訓推一體AI芯片發布,兼容<b class='flag-5'>CUDA</b>生態

    aicube的n卡gpu索引該如何添加?

    請問有人知道aicube怎樣才能讀取n卡的gpu索引呢,我已經安裝了cuda和cudnn,在全局的py里添加了torch,能夠調用gpu,當還是只能看到默認的gpu0,顯示不了gpu1,gpu0是集顯,訓練速度太感人了 你只有一塊英偉達的卡,aicube不支持AMD的顯卡,所以搜索到的只有一張卡
    發表于 07-25 08:18

    英偉達:CUDA 已經開始移植到 RISC-V 架構上

    ,著重介紹了將 CUDA 移植到 RISC-V 架構的相關工作和計劃,展現了對 RISC-V 架構的高度重視與積極布局。 ? Frans Sijstermanns 首先回顧了英偉達與 RISC-V 之間
    發表于 07-17 16:30 ?3955次閱讀

    進迭時空同構融合RISC-V AI CPU的Triton算子編譯器實踐

    Triton是由OpenAI開發的一個開源編程語言和編譯器,旨在簡化高性能GPU內核的編寫。它提供了類似Python的語法,并通過高級抽象降低了GPU編程的復雜性,同時保持了高性能。目前
    的頭像 發表于 07-15 09:04 ?1851次閱讀
    進迭時空同構融合RISC-V AI CPU的Triton算子編譯器實踐

    FA模型和Stage模型API切換概述

    API切換概述 FA模型和Stage模型由于線程模型和進程模型的差異,部分接口僅在FA模型下才
    發表于 06-06 06:29

    如何基于Kahn處理網絡定義AI引擎圖形編程模型

    本白皮書探討了如何基于 Kahn 處理網絡( KPN )定義 AI 引擎圖形編程模型。KPN 模型有助于實現數據流并行化,進而提高系統的整體性能。
    的頭像 發表于 04-17 11:31 ?863次閱讀
    如何基于Kahn處理網絡定義AI引擎圖形<b class='flag-5'>編程</b><b class='flag-5'>模型</b>

    使用NVIDIA CUDA-X庫加速科學和工程發展

    NVIDIA GTC 全球 AI 大會上宣布,開發者現在可以通過 CUDA-X 與新一代超級芯片架構的協同,實現 CPU 和 GPU 資源間深度自動化整合與調度,相較于傳統加速計算架構,該技術可使計算工程工具運行速度提升至原來的 11 倍,計算規模增加至 5 倍。
    的頭像 發表于 03-25 15:11 ?1532次閱讀

    使用 QWQ:32B 模型搭配 VSCode 的 Cline 插件實現自動化代碼編程

    作者:算力魔方創始人/英特爾創新大使劉力 一,概述 隨著人工智能技術的快速發展,自動化編程工具逐漸成為開發者的得力助手。QWQ:32B 模型是一種先進的自然語言處理模型,能夠理解并生成
    的頭像 發表于 03-21 18:12 ?1316次閱讀
    使用 QWQ:32B <b class='flag-5'>模型</b>搭配 VSCode 的 Cline 插件實現自動化代碼<b class='flag-5'>編程</b>!