1. 程式人生 > >cuda:架構,寫的不錯

cuda:架構,寫的不錯

CUDA程式設計中,習慣稱CPU為Host,GPU為Device。程式設計中最開始接觸的東西恐怕是並行架構,諸如Grid、Block的區別會讓人一頭霧水,我所看的書上所講述的內容比較抽象,對這些概念的內容沒有細講,於是在這裡作一個整理。

Grid、Block和Thread的關係

Thread  :並行運算的基本單位(輕量級的執行緒)
Block   :由相互合作的一組執行緒組成。一個block中的thread可以彼此同步,快速交換資料,最多可以同時512個執行緒。
Grid     :一組Block,有共享全域性記憶體
Kernel :在GPU上執行的程式,一個Kernel對應一個Grid。

其結構如下圖所示:

?

1

2

3

4

5

6

7

8

9

10

/*

另外:Block和Thread都有各自的ID,記作blockIdx(1D,2D),threadIdx(1D,2D,3D)

Block和Thread還有Dim,即blockDim與threadDim. 他們都有三個分量x,y,z

執行緒同步:void __syncthreads(); 可以同步一個Block內的所有執行緒

總結來說,每個 thread 都有自己的一份 register 和 local memory 的空間。

一組thread構成一個 block,這些 thread 則共享有一份shared memory。

此外,所有的 thread(包括不同 block 的 thread)都共享一份

global memory、constant memory、和 texture memory。

不同的 grid 則有各自的 global memory、constant memory 和 texture memory。

*/

?

儲存層次

1

2

3

4

5

6

7

per-

threadregister                             1 cycle

per-threadlocal memory                     slow

per-block shared memory                   1 cycle

per-grid global memory                       500 cycle,not cached!!

constant and texture memories            500 cycle, but cached and read-only

分配記憶體:cudaMalloc,cudaFree,它們分配的是global memory

Hose-Device資料交換:cudaMemcpy

?

變數型別

1

2

3

4

5

__device__   // GPU的global memory空間,grid中所有執行緒可訪問

__constant__ // GPU的constant memory空間,grid中所有執行緒可訪問

__shared__   // GPU上的thread block空間,block中所有執行緒可訪問

local        // 位於SM內,僅本thread可訪問

// 在程式設計中,可以在變數名前面加上這些字首以區分。

?

資料型別

1

2

3

4

5

6

7

8

9

// 內建向量型別:

int1,int2,int3,int4,float1,float2, float3,float4 ...

// 紋理型別:

texture<Type, Dim, ReadMode>texRef;

// 內建dim3型別:定義grid和block的組織方法。例如:

dim3 dimGrid(2, 2);

dim3 dimBlock(4, 2, 2);

// CUDA函式CPU端呼叫方法

kernelFoo<<<dimGrid, dimBlock>>>(argument);

?

函式定義

1

2

3

4

5

6

7

8

9

10

__device__ // 執行於Device,僅能從Device呼叫。限制,不能用&取地址;不支援遞迴;不支援static variable;不支援可變長度引數

__global__ // void: 執行於Device,僅能從Host呼叫。此類函式必須返回void

__host__ // 執行於Host,僅能從Host呼叫,是函式的預設型別

// 在執行kernel函式時,必須提供execution configuration,即<<<....>>>的部分。

//   例如:

__global__ voidKernelFunc(...);

dim3 DimGrid(100, 50);// 5000 thread blocks

dim3 DimBlock(4, 8, 8);// 256 threads per block

size_tSharedMemBytes = 64; // 64 bytes of shared memory

KernelFunc<<< DimGrid, DimBlock, SharedMemBytes >>>(...);

?

數學函式

1

2

CUDA包含一些數學函式,如sinpow等。每一個函式包含有兩個版本,

例如正弦函式sin,一個普通版本sin,另一個不精確但速度極快的__sin版本。

?

內建變數

1

2

3

4

5

/*

gridDim, blockIdx, blockDim,

threadIdx, wrapsize.

這些內建變數不允許賦值的

*/

?

編寫程式

1

2

3

4

5

6

7

/*

目前CUDA僅能良好的支援C,在編寫含有CUDA程式碼的程式時,

首先要匯入標頭檔案cuda_runtime_api.h。檔名字尾為.cu,使用nvcc編譯器編譯。

目前最新的CUDA版本為5.0,可以在官方網站下載最新的工具包,網址為:

該工具包內包含了ToolKit、樣例等,安裝起來比原先的版本也方便了很多。

*/

?

相關擴充套件

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

1 GPU硬體

// i GPU一個最小單元稱為Streaming Processor(SP),全流水線單事件無序微處理器,

包含兩個ALU和一個FPU,多組暫存器檔案(registerfile,很多暫存器的組合),

這個SP沒有cache。事實上,現代GPU就是一組SP的array,即SPA。

每一個SP執行一個thread

// ii 多個SP組成Streaming Multiprocessor(SM)。

每一個SM執行一個block。每個SM包含8個SP;

2個special function unit(SFU):

這裡面有4個FPU可以進行超越函式和插值計算

MultiThreading Issue Unit:分發執行緒指令

具有指令和常量快取。

包含shared memory

// iii Texture Processor Cluster(TPC) :包含某些其他單元的一組SM

2 Single-Program Multiple-Data (SPMD)模型 

// i CPU以順序結構執行程式碼,

GPU以threads blocks組織併發執行的程式碼,即無數個threads同時執行

// ii 回顧一下CUDA的概念:

一個kernel程式執行在一個grid of threads blocks之中

一個threads block是一批相互合作的threads:

可以用過__syncthreads同步;

通過shared memory共享變數,不同block的不能同步。

// iii Threads block宣告:

可以包含有1到512個併發執行緒,具有唯一的blockID,可以是1,2,3D

同一個block中的執行緒執行同一個程式,不同的運算元,可以同步,每個執行緒具有唯一的ID

3 執行緒硬體原理

// i GPU通過Global block scheduler來排程block,

根據硬體架構分配block到某一個SM。

每個SM最多分配8個block,每個SM最多可接受768個thread

(可以是一個block包含512個thread

也可以是3個block每個包含256個thread(3*256=768!))。

同一個SM上面的block的尺寸必須相同。每個執行緒的排程與ID由該SM管理。

// ii SM滿負載工作效率最高!考慮某個Block,其尺寸可以為8*8,16*16,32*32

8*8:每個block有64個執行緒,

由於每個SM最多處理768個執行緒,因此需要768/64=12個block。

但是由於SM最多8個block,因此一個SM實際執行的執行緒為8*64=512個執行緒。

16*16:每個block有256個執行緒,SM可以同時接受三個block,3*256=768,滿負載

32*32:每個block有1024個執行緒,SM無法處理!

// iii Block是獨立執行的,每個Block內的threads是可協同的。

// iv 每個執行緒由SM中的一個SP執行。

當然,由於SM中僅有8個SP,768個執行緒是以warp為單位執行的,

每個warp包含32個執行緒,這是基於執行緒指令的流水線特性完成的。

Warp是SM基本排程單位,實際上,一個Warp是一個32路SIMD指令

。基本單位是half-warp。

如,SM滿負載工作有768個執行緒,則共有768/32=24個warp

,每一瞬時,只有一組warp在SM中執行。

Warp全部執行緒是執行同一個指令,

每個指令需要4個clockcycle,通過複雜的機制執行。

// v 一個thread的一生:

Grid在GPU上啟動;

block被分配到SM上;

SM把執行緒組織為warp;

SM排程執行warp;

執行結束後釋放資源;

block繼續被分配....

4 執行緒儲存模型

// i Register and local memory:執行緒私有,對程式設計師透明。

每個SM中有8192個register,分配給某些block,

block內部的thread只能使用分配的暫存器。

執行緒數多,每個執行緒使用的暫存器就少了。

// ii shared memory:block內共享,動態分配。

如__shared__ float region[N]。

shared memory 儲存器是被劃分為16個小單元,

與half-warp長度相同,稱為bank,每個bank可以提供自己的地址服務。

連續的32位word對映到連續的bank。

對同一bank的同時訪問稱為bank conflict。

儘量減少這種情形。

// iii Global memory:沒有快取!容易稱為效能瓶頸,是優化的關鍵!

一個half-warp裡面的16個執行緒對global memory的訪問可以被coalesce成整塊記憶體的訪問,如果:

資料長度為4,8或16bytes;地址連續;起始地址對齊;第N個執行緒訪問第N個數據。

Coalesce可以大大提升效能。

// uncoalesced

Coalesced方法:如果所有執行緒讀取同一地址,

不妨使用constant memory;

如果為不規則讀取可以使用texture記憶體

如果使用了某種結構體,其大小不是4 8 16的倍數,

可以通過__align(X)強制對齊,X=4 8 16



轉自http://luofl1992.is-programmer.com/posts/38830.html

相關推薦

cuda:架構不錯

CUDA程式設計中,習慣稱CPU為Host,GPU為Device。程式設計中最開始接觸的東西恐怕是並行架構,諸如Grid、Block的區別會讓人一頭霧水,我所看的書上所講述的內容比較抽象,對這些概念的內容沒有細講,於是在這裡作一個整理。 Grid、Block和Thread的

Hdfs架構檔案流程

偽分散式的HDFS 的NN,DN,SNN都是部署在同一臺機器上的。 HDFS的啟動:./start-dfs.sh HDFS檢視內容 hdfs dfs -ls 1.block的概念 hdfs預設一個block(塊)是134217728個位元組(128M),資料被切分以塊為單位儲存在

轉載 ->關於Android多語言國際化牛逼不錯

今天,簡單講講 android 裡如何將語言國際化,和各個國家語言的value資料夾的命名規則。 昨天,需要將app的字元資源國際化,可是卻不知道如何命名,在網上找了資料,終於解決了問題。 Android 文字資源國際化   1. 新建一箇中文資原始檔夾  

ORACLE 資料同步 容災備份恢復 主從架構分離 (OGGADGDSG高階複製流複製logmnr)

ORACLE 幾種同步災備手段(OGG,ADG,DSG,高階複製,流複製,logmnr) 2017年07月14日 13:45:47 小學生湯米 閱讀數:11073 目前所接觸的Oracle 的災備以及同步手段主要有ADG,OGG,DSG,高階複製,流複製以及自主開發的基於

轉載 ->關於Android多語言國際化牛逼不錯

今天,簡單講講 android 裡如何將語言國際化,和各個國家語言的value資料夾的命名規則。 昨天,需要將app的字元資源國際化,可是卻不知道如何命名,在網上找了資料,終於解決了問題。 Android 文字資源國際化 1. 新建一箇中文資原始檔夾     va

Redis配置主從架構實現讀分離

Redis的主從架構,能幫助我們實現讀多,寫少的情況,下面配置Redis架構,很簡單。 準備環境 vmware + rhel-server-7.0(101,102,103)+redis-3.2.0 1、在192.168.137.101安裝好redis3.

CUDA程式設計——GPU架構由spsmthreadblockgridwarp說起

  掌握部分硬體知識,有助於程式設計師編寫更好的CUDA程式,提升CUDA程式效能,本文目的是理清sp,sm,thread,block,grid,warp之間的關係。由於作者能力有限,難免有疏漏,懇請讀者批評指正。   首先我們要明確:SP(streaming

帶你成為JAVA架構師(架構非用架構

很多人做java開發2,3年後,都會感覺自己遇到瓶頸。什麼都會又什麼都不會,如何改變困境,為什麼很多人寫了7,8年還是一個碼農,工作中太多被動是因為不懂底層原理。公司的工作節奏又比較快,難有機會學習架構原理,也沒人教,所以這個時候,學習架構原理,擴充套件思維,對

純手SpringMVC架構用註解實現springmvc過程(動腦學院Jack老師課後自己練習的體會)

標籤: 1、第一步,首先搭建如下架構,其中,annotation中放置自己編寫的註解,主要包括service controller qualifier RequestMapping 第二步:完成對應的annotation: package com.cn.annotation; import java.

關於USB端點不錯——收錄一下…

USB裝置中的唯一可定址部分是裝置端點。端點是主機與裝置之間通訊的目的或來源。控制端點可以雙向傳輸資料,而其它端點只能在單方向傳輸資料。主機和裝置的通訊最終作用於裝置上的各個端點,它是主機與裝置間通訊流的一個邏輯終端。每個USB裝置有一個唯一的地址,這個地址是在裝置連上主機時,由主機分配的,而裝置中的每個端

華仔-技術部落格(《面向物件葵花寶典》程式碼的架構做技術的管理者)

面向物件葵花寶典 面向物件葵花寶典,主要從理論、實踐、技巧3個方面獨樹一幟的闡述了面向物件相關的知識和技能。教你如何從需求開始,一步一步、環環相扣的走到編碼階段,理論闡述別具一格,實戰技巧簡單好用,是面向物件快速入門和提升的”葵花

MySQL學習筆記--MySQL邏輯架構sql與載入順序以及七種JOIN模式圖解

一、MySQL的邏輯架構MySQL的最大特點是其外掛式的儲存引擎架構將查詢處理和其他的系統任務以及資料的儲存,提取相分離。這種架構可以根據業務的需求和實際需求選擇合適的儲存引擎。正因為外掛式引擎的特點它的架構可以在多種不同的場景中應用併發揮良好的效能。1. 連線層:為請求做連

React的Fiber架構深入理解其原理

熟悉React的朋友都知道,React支援jsx語法,我們可以直接將HTML程式碼寫到JS中間,然後渲染到頁面上,我們寫的HTML如果有更新的話,React還有虛擬DOM的對比,只更新變化的部分,而不重新渲染整個頁面,大大提高渲染效率。到了16.x,React更是使用了一個被稱為`Fiber`的架構,提升了使

Windows下使用Sublime text3快速編輯Linux文件Shell

title 技術分享 ext ext3 ima edit text 工具 inux 所需要配合的工具是WinSCP 添加完畢之後直接在目錄下雙擊要編輯的shell腳本文件,即可彈出Sublime Text的編輯器 然後咱通過Putty看看Linux虛擬機上的文件

設計四個線程當中共兩個線程每次對j添加1另外兩個線程每次對j降低1。循環100次出程序。

public read 設計 test6 ng- -m popu div for package cn.usst.DataTest6; /** * 設計四個線程,當中共兩個線程每次對j添加1,另外兩個線程每次對j降低1。循環100次,寫出程序。 * @ * *

javascript功能插件大集合前端的親們記得收藏

progress ogre 工作 寫作 自動調整 pen handle 國際化 沖突 導讀:GitHub 上有一個 Awesome – XXX 系列的資源整理。awesome-javascript 是 sorrycc 發起維護的 JS 資源列表,內容包括:包管理器、加載器、

對“使用MyEclipse的jsp代碼因有漢字而無法保存”問題的解決

編輯 window eclipse 保存 data 文本 myeclips gen trac 使用MyEclipse編輯jsp時。有時會出現“使用MyEclipse,寫的jsp代碼因有漢字而無法保存”的現象,怎樣解決呢? Window——&g

android:怎樣用一天時間出“飛機大戰”這種遊戲!(無框架-SurfaceView繪制)

col ride raw ech tro cti 開發人員 contex epo 序言作為一個android開發人員,時常想開發一個小遊戲娛樂一下大家,今天就說說,我是怎麽樣一天寫出一個簡單的“飛機大戰”的.體驗地址:http://www.wandoujia.com/ap

依賴註入和控制反轉的理解的太好了。

ace 語法 應用開發 資料 註入組 depend 設計思想 top ioc容器 學習過spring框架的人一定都會聽過Spring的IoC(控制反轉) 、DI(依賴註入)這兩個概念,對於初學Spring的人來說,總覺得IoC 、DI這兩個概念是模糊不清的,是很難理解的,今

ARM Cortex-A7架構高通210系列-MSM8909

大廠 制作 平板電腦 客戶端 維護 電阻 電腦 .cn 其它 核心板特性 A7架構 4核(4*1.1GHz(A7)) 產品尺寸小,便於客戶集成,減少產品體積; 支持4G LTE超高速上網,單板兼容移動/聯通/電信2G/3G/4G; 支持2+32存儲器,Micro SD支持