cuda的全稱是computer unified device architecture(計算機統一裝置架構)。cuda不只是一種程式語言,它包括nvidia對於gpgpu的完整的解決方案:從支援通用計算並行架構的gpu,到實現計算所需要的硬體驅動程式、程式設計介面、程式庫、編譯器、偵錯程式等。nvidia提供了一種較為簡便的方式編寫gpgpu**:cuda c。
我們將乙個cuda程式分為兩部分:主機端(host=cpu)和裝置(device=gpu)端。主機端的是cpu執行的程式部分,裝置端的是gpu上執行的程式部分。核心(kernel)是裝置端程式的另外一種叫法。
cuda c函式型別:
(1) 主機函式:它的呼叫、執行都僅由主機端來完成;
(2) 核心函式:它由主機端呼叫,裝置端並行執行,定義時必須要加上_global_限定符申明;
(3) 裝置函式:僅由裝置端呼叫、並行執行,定義時必須要加上_device_限定符申明。
順序操作應被程式設計為主機函式,可並行化操作應被程式設計為核心函式或者裝置函式。主機函式和核心函式都將在main函式中被封裝和呼叫。
gpu的計算核心是以一定數量的streaming processor(sp)組成的處理器陣列,sp的主要結構為乙個alu(邏輯運算單元),乙個fpu(浮點運算單元)以及乙個register file(暫存器堆)。8個sp組成乙個sm(streaming multi-processor),一定數量的sm組成乙個tpc(texture processing clusters)。
sm內包含有乙個instruction unit、乙個constant memory、乙個texture memory,8192個register、乙個16kb的share memory、8個stream processor(sp)和兩個special function units(sfu)。
thread是cuda模型中最基本的執行單元,執行最基本的程式指令。
block是一組協作thread,block內部允許共享儲存,每個block最多包含512個thread(算力1.x,算力2.x以上每個block最大執行緒數是1024)。乙個block中所有的執行緒在乙個流多處理器(sm)上併發地執行
grid是一組block,共享全域性記憶體,每乙個grid對應乙個kernel任務。
kernel是在gpu上執行的核心程式。
warp是mp的基本排程單位,每次執行的時候,由於mp數量不同,所以乙個block內的所有thread不一定全部同時執行,但是每個warp內的所有thread一定同時執行。
在程式執行的時候,實際上每32個thread組成乙個warp,每個 warp 塊都包含連續的執行緒,遞增執行緒 id 。
因此,我們在定義thread size的時候應使其為warp size的整數倍,也就是thread size應為32的整數倍。理論上thread越多,就越能彌補單個thread讀取資料的latency ,但是當thread越多,每個thread可用的暫存器也就越少,嚴重的時候甚至能造成kernel無法啟動。因此每個block最少應包含64個thread,一般選擇128或者256,具體視mp數目而定。乙個mp最多可以同時執行768個thread,但每個mp最多包含8個block。
Cuda計算點積
除錯 的過程中,發現了這樣乙個問題 include using namespace std intmain 本以為直接指定陣列大小和先生成指標再指定空間大小的sizeof 會是一樣大的,結果不是一樣大。因為這個錯誤,在cuda c中除錯了很久,最後終於發現是這裡錯了。cuda c,使用歸約法求點積 ...
CUDA執行緒索引計算
終於搞清楚了 thread 索引的計算方式,簡單來說很像小學學的除法公式 被除數 除數 商 餘數 用公式表示 最終的執行緒id blockid blocksize threadid 下面先理清幾個關鍵點 grid 中 含有若干個 blocks,其中 blocks 的數量由 griddim.x y z...
初識計算幾何
一 定義 計算幾何 問題的輸入一般是關於一組幾何物體 如點 線 的描述 輸出常常是有關這些物體的問題的回答,如直線是否相交,點圍成的面積等問題。二 基本元素 1 二維情形 1 點 2 線段 向量 3 直線 4 多邊形 5 圓 2 三維情形 1 多面體 2 平面 3 球 舉例 乙個二維向量的定義 st...