1.cuda的程式設計模型
a. gpu(圖形處理器)早期主要應用於圖形渲染,使得應用程式能實現更強的視覺效果。(並行運算)
cuda是由英偉達為他們公司gpu創立的乙個平行計算平台和程式設計模型。cuda包含三大元件,分別是nvidia驅動、toolkit和
samples.toolkit裡面包含的nvcc編譯器、除錯工具和函式庫。
開發人員可以通過呼叫cuda函式庫中的api,來使用gpu進行平行計算。nvidia公司為了吸引更多的開發人員,對cuda進行了程式語言擴充套件,如cuda c/c++語言
b. cuda程式設計模型
在cuda的架構下,乙個程式分為兩個部分:host端和device端。host端是指在cpu上執行的部分,而device端則在gpu上執行的部分。device端的程式又稱 為「kernel」。通常host端程式會將資料準備好後,複製到顯示卡的記憶體中,再由顯示晶元執行device端程式,完成再由host端程式將結果從顯示卡的記憶體中取回。
2.cuda程式設計技術
a.第乙個cuda程式
#include #include#include
void
function()
intmain()
#include #includenvcc 編譯選項 原始檔.cu 原始檔.cpp#include
void
function()
intmain()
1. 在gpu上執行的函式通常稱為核函式。
2. 一般通過識別符號__global__修飾,呼叫通過《引數1,引數2>>>,
引數1代表執行緒格里有多少執行緒塊;引數2代表乙個執行緒塊裡有多少執行緒。
#cudamalloc(
1. 函式原型: cudaerror_t cudamalloc (void **devptr, size_t size)。
2. 函式用處:與c語言中的malloc函式一樣,只是此函式在gpu的記憶體你分配記憶體
3. 注意事項:
3.1. 可以將cudamalloc()分配的指標傳遞給在裝置上執行的函式;
3.2. 不可以在主機**中使用cudamalloc()分配的指標進行記憶體讀寫操作
# cudamemcpy()
1. 函式原型:
cudaerror_t cudamemcpy (void *dst, const void *src, size_t count, cudamemcpyk
2. 函式作用:與c語言中的memcpy函式一樣,只是此函式可以在主機記憶體和gpu
記憶體之間互相拷貝資料。
3. 函式引數:cudamemcpykind kind表示資料拷貝方向,如果kind賦值為
cudamemcpydevicetohost表示資料從裝置記憶體拷貝到主機記憶體。
#cudafree()
1. 函式原型:cudaerror_t cudafree ( void* devptr )。
2. 函式作用:與c語言中的free()函式一樣,只是此函式釋放的是cudamalloc()分配的記憶體
b.cuda執行緒
在cuda中,顯示晶元執行時的最小單位是thread,數個thread都可以組成乙個block。數個block可以組成grid。每個thread都有自己的乙份register 和local memory的空間。
同乙個block中的每個thread則有共享的乙份share memory
c.cuda記憶體
gpu的記憶體中可讀寫的有:暫存器(regiesters)、localmenory、共享記憶體(shared memory)和全域性記憶體(global memory),唯讀的有:常量記憶體(constant memory)和 紋理記憶體(texture memroy)。
之前cudamalloc 分配,複製的都是global memory。
共享記憶體則允許同乙個block中的執行緒共享這一段記憶體。
#include #include#include
#define n 10__global__
void vecadd(int *a, int *b, int *c)
}int main(void
) cudamalloc( (
void **)&dev_a, n * sizeof(int
) );
cudamalloc( (
void **)&dev_b, n * sizeof(int
) );
cudamalloc( (
void **)&dev_c, n * sizeof(int
) );
cudamemcpy(dev_a, a, n * sizeof(int
), cudamemcpyhosttodevice );
cudamemcpy(dev_b, b, n * sizeof(int
), cudamemcpyhosttodevice );
struct
timeval tpstart,tpend;
float
timeuse;
gettimeofday(&tpstart,null);
vecadd
<<<1, n>>>(dev_a, dev_b, dev_c);
gettimeofday(&tpend,null);
timeuse=1000000*(tpend.tv_sec-tpstart.tv_sec)+tpend.tv_usec-tpstart.tv_usec;
timeuse/=1000000
; printf(
"used time:%f\n
",timeuse);
cudamemcpy(c, dev_c, n * sizeof(int
), cudamemcpydevicetohost );
for (int i = 0; i < n; ++i)
cudafree(dev_a);
cudafree(dev_b);
cudafree(dev_c);
return0;
}
cuda 安裝 2安裝CUDA
編寫 王俊 北京工業職業技術學院 日期 2019年3月 注意 本章假定cuda檔案 cuda 9.0.xx linux.run已經按照0裝置復原的要求拷貝至 home downloads中。chmod a x cuda 9.0.xx linux.run sudo cuda 9.0.xx linux....
CUDA小記(2)執行第乙個CUDA程式
相信搭建完環境之後,你一定會迫不及待想要開始程式設計。等一下,讓我們先來看看官方的樣例 先對如何編譯 有個大致了解。1.看乙個簡單程式,asyncapi 0 檢視顯示卡型號,比較cpu與gpu效能。只有乙個.cu檔案記錄 我們先看一下.cu檔案。includes,system include inc...
CUDA程式計時
之前寫的cuda程式,想測量一下效能,網上很多用的是cpu端計時,很不準確。翻了一下書,發現這裡應該使用事件來計時。cuda中的事件本質上是乙個gpu時間戳,這個時間戳是在使用者指定的時間點上記錄的。由於gpu本身支援記錄時間戳,因此就避免了當使用cpu定時器來統計gpu執行的時間時可能遇到的諸多問...