Cuda程式的設計 2

2022-08-31 08:45:09 字數 3243 閱讀 7617

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 #include 

#include

void

function()

intmain()

nvcc  編譯選項  原始檔.cu 原始檔.cpp

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執行的時間時可能遇到的諸多問...