cuda編程_CUDA刷新器:CUDA編程模型

CUDA刷新器:CUDA編程模型

CUDA Refresher: The CUDA Programming Model

CUDA,CUDA刷新器,并行編程

這是CUDA更新系列的第四篇文章,它的目標是刷新CUDA中的關鍵概念、工具和初級或中級開發人員的優化。

CUDA編程模型提供了GPU體系結構的抽象,它充當了應用程序與其在GPU硬件上的可能實現之間的橋梁。這篇文章概述了CUDA編程模型的主要概念,概述了它如何在通用編程語言如C/C++中暴露出來。

介紹一下CUDA編程模型中常用的兩個關鍵詞:主機和設備。

主機是系統中可用的CPU。與CPU相關聯的系統內存稱為主機內存。GPU被稱為設備,GPU內存也被稱為設備內存。

要執行任何CUDA程序,有三個主要步驟:

將輸入數據從主機內存復制到設備內存,也稱為主機到設備傳輸。

加載GPU程序并執行,在片上緩存數據以提高性能。

將結果從設備內存復制到主機內存,也稱為設備到主機傳輸。

CUDA內核和線程層次結構

圖1顯示了CUDA內核是一個在GPU上執行的函數。應用程序的并行部分由K個不同的CUDA線程并行執行k次,而不是像常規C/C++函數那樣只進行一次。

8e23a178377a9e324e641dcb844292b1.png

Figure 1. The kernel is a function executed on the GPU.

每一個CUDA內核都以一個__global__聲明說明符開頭。程序員通過使用內置變量為每個線程提供唯一的全局ID。

a0904a348645f2e04f64e8f970252055.png

圖2. CUDA內核被細分為塊。

一組線程稱為CUDA塊。CUDA塊被分組到一個網格中。內核作為線程塊的網格來執行(圖2)。

每個CUDA塊由一個流式多處理器(SM)執行,不能遷移到GPU中的其他SMs(搶占、調試或CUDA動態并行期間除外)。一個SM可以根據CUDA塊所需的資源運行多個并發CUDA塊。每個內核在一個設備上執行,CUDA支持一次在一個設備上運行多個內核。圖3顯示了GPU中可用硬件資源的內核執行和映射。

403e925b8fb639ed59741a7d89331f3a.png

圖3. 在GPU上執行內核。

CUDA為線程和塊定義了內置的三維變量。線程使用內置的三維變量threadIdx編制索引。三維索引提供了一種自然的方法來索引向量、矩陣和體積中的元素,并使CUDA編程更容易。類似地,塊也使用名為blockIdx的內置三維變量編制索引。

以下是幾個值得注意的要點:

CUDA架構限制每個塊的線程數(每個塊限制1024個線程)。

線程塊的維度可以通過內置的blockDim變量在內核中訪問。

syncu中的線程可以使用syncu函數同步。使用同步線程時,塊中的所有線程都必須等待,然后才能繼續。

在<<…>>>語法中指定的每個塊的線程數和每個網格的塊數可以是int或dim3類型。這些三角括號標記從主機代碼到設備代碼的調用。它也被稱為內核啟動。

下面用于添加兩個矩陣的CUDA程序顯示多維blockIdx和threadIdx以及blockDim等其他變量。在下面的例子中,為了便于索引,選擇了一個2D塊,每個塊有256個線程,x和y方向各有16個線程。使用數據大小除以每個塊的大小來計算塊的總數。

// Kernel - Adding two matrices MatA and MatB__global__ void MatAdd(float MatA[N][N], float MatB[N][N],float MatC[N][N]){ int i = blockIdx.x * blockDim.x + threadIdx.x; int j = blockIdx.y * blockDim.y + threadIdx.y; if (i < N && j < N) MatC[i][j] = MatA[i][j] + MatB[i][j];}int main(){ ... // Matrix addition kernel launch from host code dim3 threadsPerBlock(16, 16); dim3 numBlocks((N + threadsPerBlock.x -1) / threadsPerBlock.x, (N+threadsPerBlock.y -1) / threadsPerBlock.y); MatAdd<<<numBlocks, threadsPerBlock>>>(MatA, MatB, MatC); ...}
Memory hierarchy

支持CUDA的GPU有一個內存層次結構,如圖4所示。

e709a10bde7b3728e9d7f0bb14a3eefa.png

圖4. gpu中的內存層次結構。

以下內存由GPU架構公開:

這些寄存器對每個線程都是私有的,這意味著分配給線程的寄存器對其他線程不可見。編譯器決定寄存器的利用率。

一級/共享內存(SMEM)-每個SM都有一個快速的片上草稿行內存,可用作一級緩存和共享內存。CUDA塊中的所有線程都可以共享共享內存,在給定SM上運行的所有CUDA塊都可以共享SM提供的物理內存資源。。

只讀內存每個SM都有一個指令緩存、常量內存、紋理內存和對內核代碼只讀的RO緩存。 二級緩存二級緩存在所有SMs中共享,因此每個CUDA塊中的每個線程都可以訪問該內存。nvidiaa100 GPU已經將二級緩存大小增加到40mb,而v100gpu中只有6mb。 全局內存這是位于GPU中的GPU和DRAM的幀緩沖區大小。

NVIDIA CUDA編譯器在優化內存資源方面做得很好,但專家CUDA開發人員可以選擇有效地使用這種內存層次結構來優化CUDA程序。

計算能力

GPU的計算能力決定了GPU硬件支持的通用規范和可用特性。此版本號可由應用程序在運行時使用,以確定當前GPU上可用的硬件功能或指令。

每個GPU都有一個版本號,表示為X.Y,其中X包括主要修訂號,Y包含次要修訂號。小版本號對應于架構的增量改進,可能包括新特性。

有關任何支持CUDA的設備的計算能力的更多信息,請參閱CUDA示例代碼設備查詢。此示例枚舉系統中存在的CUDA設備的屬性

摘要

CUDA編程模型提供了一種異構環境,其中主機代碼在CPU上運行C/C++程序,內核在物理上分離的GPU設備上運行。CUDA編程模型還假設主機和設備都保持各自獨立的內存空間,分別稱為主機內存和設備內存。CUDA代碼還通過PCIe總線提供主機和設備內存之間的數據傳輸。

CUDA還公開了許多內置變量,并提供了多維索引的靈活性,以簡化編程。CUDA還管理不同的內存,包括寄存器、共享內存和一級緩存、二級緩存和全局內存。高級開發人員可以有效地使用這些內存來優化CUDA程序。

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

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

相關文章

php curl_error源碼,PHP curl_error函數

PHP curl_error函數(PHP 4 > 4.0.3, PHP 5)curl_error — 返回一個保護當前會話最近一次錯誤的字符串說明string curl_error ( resource $ch )返回一條最近一次cURL操作明確的文本的錯誤信息。參數ch由 curl_init() 返回的 cURL 句柄。返回值返回錯誤信息或 (空字符串) 如果…

SQL中Where與Having的區別

“Where” 是一個約束聲明&#xff0c;使用Where來約束來之數據庫的數據&#xff0c;Where是在結果返回之前起作用的&#xff0c;且Where中不能使用聚合函數。“Having”是一個過濾聲明&#xff0c;是在查詢返回結果集以后對查詢結果進行的過濾操作&#xff0c;在Having中可以使…

java 邏輯表達式 布爾_使用基本邏輯門實現布爾表達式

java 邏輯表達式 布爾將布爾表達式轉換為邏輯電路 (Converting Boolean Expression to Logic Circuit) The simplest way to convert a Boolean expression into a logical circuit is to follow the reverse approach in which we start from the output of the Boolean expre…

python自然語言處理書籍_精通Python自然語言處理pdf

自然語言處理&#xff08;NLP&#xff09;是有關計算語言學與人工智能的研究領域之一。NLP主要關注人機交互&#xff0c;它提供了計算機和人類之間的無縫交互&#xff0c;使得計算機在機器學習的幫助下理解人類語言。 本書詳細介紹如何使用Python執行各種自然語言處理&#xff…

通達oa 2013 php解密,通達OA漏洞學習 - 安全先師的個人空間 - OSCHINA - 中文開源技術交流社區...

說明通達OA漏洞在去年上半年已爆出&#xff0c;這不趁著周末沒事做&#xff0c;將源碼下載下來進行復現學習。文件包含測試文件包含檢測&#xff0c;payload1:ip/ispirit/interface/gateway.php?json{"url":"/general/../../mysql5/my.ini"}利用文件包含訪…

溫趙輪 訪談

“溫趙輪”三大軟狗&#xff0c;你聽說過嗎&#xff1f;今天的1024訪談錄給大家介紹的就是程序員中當之無愧的偶像組合——溫趙輪。 Winter寒冬。阿里P8&#xff0c;正在向P9的道路上奔跑。傳說中的他有錢、出身好&#xff0c;可不是搞互聯網的屌絲程序員。 老趙&#xff0c;…

linux開源文檔管理系統_Linux中的系統管理員問題 免費和開源軟件

linux開源文檔管理系統根帳號 (Root Account) The "root" account is the most unrestrictive account on a Linux Operating system. This account enables you to complete all features of System admin, including accounts, changing client passwords, looking…

matlab上機實驗1,上機實驗1:熟悉matlab基本操作

其中 x 在 [-2, 2] 間共等切分為 21 點&#xff0c;y 在 [-1, 1] 間共等切分為 21 點&#xff0c;所以此曲面共有 21*21441 個點。a. 請用預設的顏色對應表(Colormap)來畫出此曲面。 b. 請以曲面的斜率來設定曲面的顏色。 c. 請以曲面的曲率來設定曲面的顏色。2. 請用 meshc 指…

公眾號 -「前端攻略 開光篇」

作為一枚程序員&#xff0c;每件重要項目的開始都忍不住使用"Hello World"。 這個公眾號是不是來晚了&#xff1f;如果你有這個疑問&#xff0c;那么我想說&#xff1a;對于寫作和思考&#xff0c;任何時候都不晚。我用四個簡單的自問自答&#xff0c;來講講這個前端…

python 桌面應用 啟動緩慢_如何加快Python 應用的啟動時間

我聽說pipenv9.0.2已經發布&#xff0c;啟動時間有了很大的改進。 我很快就試了一下&#xff0c;但我覺得并不快。所以我用Python3.7的新特性來研究它。 在本文中&#xff0c;我將介紹該特性以及如何使用它。 啟動時間≒導入時間 例如&#xff0c;pipenv -h 的執行時間比顯示幫…

python單詞首字母大寫_在Python中將每個單詞的首字母大寫

python單詞首字母大寫Here, we are implementing a python program to capitalizes the first letter of each word in a string. 在這里&#xff0c;我們正在實現一個python程序來大寫字符串中每個單詞的首字母。 Example: 例&#xff1a; Input: "HELLO WORLD!"O…

matlab中求模最大,matlab求取模極大值時出錯

本帖最后由 Nate_ 于 2016-4-17 15:57 編輯points1024 時&#xff0c;有波形輸出&#xff0c;但信號有5438個點。改為5438就不行。主程序&#xff1a;%小波模極大值重構是采用的交替投影法close all;points5438; level4; sr360; num_inter6; wfdb4;%所處理數據的…

stl向量_如何檢查C ++ STL中向量中是否存在元素?

stl向量Given a vector and an element to be searched in the vector. 給定一個向量和要在向量中搜索的元素。 To check whether an elements exists in a vector or not – we use find() function. find() function takes 3 arguments. 要檢查向量中是否存在元素 –我們使用…

java socket如何請求485協議_javaSE第十五部分 網絡編程(1)Socket和ServerSocket

網絡編程基礎知識C/S結構&#xff1a;全稱為Client/Server結構&#xff0c;是指客戶端和服務器結構。常見程序有&#xff31;&#xff31;、迅雷等軟件。B/S結構&#xff1a;全稱為Browser/Server結構&#xff0c;是指瀏覽器和服務器結構。常見瀏覽器有谷歌、火狐等。兩種架構各…

【分享】linux下u盤使用

2019獨角獸企業重金招聘Python工程師標準>>> linux下u盤使用 方案一&#xff1a; Linux不像Windows一樣&#xff0c;接上新硬件后可以自動識別&#xff0c;在Linux下無法自動識別新硬件的&#xff0c;需要手動去識別。USB移動存儲設備通常被識別為sda1&#xff0c;…

kotlin中判斷字符串_Kotlin程序刪除字符串中所有出現的字符

kotlin中判斷字符串Given a string and a character, we have to remove all occurrences of the character in given string. 給定一個字符串和一個字符&#xff0c;我們必須刪除給定字符串中所有出現的字符。 Example: 例&#xff1a; Input:string "includeHelp Del…

Java9中使用jpa,jpa – eclipselink在Java 9上使用final字段進行靜態編織

我有一些JPA注釋字段,如下所示&#xff1a;Column(name "SOME_FIELD", updatable false, nullable false)private final String someField;當實體插入數據庫時??,這些字段存儲在數據庫中.它們無法進一步更新.對于Java編程語言,可以將這些字段視為final.使用Ecli…

python語言程序設計及醫學應用_Python語言程序設計(高等學校計算機專業規劃教材)...

第1章Python語言概述/1 1.1Python語言的發展1 1.1.1Python的起源1 1.1.2Python的發展2 1.2Python語言的特點2 1.2.1Python的特性2 1.2.2Python的缺點4 1.2.3Python與其他語言的比較5 1.3簡單的Python程序介紹5 1.4Python的程序開發工具8 1.4.1Python的版本選擇8 1.4.2Python的安…

swift 3.0 中使用 xib

文章寫于2016年9月底&#xff0c;Xcode 8&#xff0c;swift 3.0真是蛋疼&#xff0c;折騰了很長時間&#xff0c;試了網上很多教程&#xff0c;結果又莫名的可以了&#xff01; 1.方法和OC中一樣 將一個xib文件和一個ViewController類進行關聯的幾步操作&#xff1a; command &…

數字圖像處理圖像反轉的實現_使用8086微處理器反轉16位數字

數字圖像處理圖像反轉的實現Problem statement: 問題陳述&#xff1a; Write an assembly language program in 8086 microprocessor to reverse 16 bit number using 8 bits operation. 在8086微處理器中編寫匯編語言程序&#xff0c;以使用8位操作反轉16位數字。 Example: …