CUDA學習筆記(2) 執行緒並行和塊並行

2021-08-28 05:10:50 字數 3531 閱讀 3802

有些顯示卡支援cuda有些不支援,那麼如何確定主機的顯示卡裝置是否支援cuda呢。可以使用下面的函式獲取顯示卡的相關資訊。

下面是關於這幾個函式的簡單使用:

cudaerror_t cudastatus;

int number =0;

cudadeviceprop prop;

cudastatus =

cudagetdevicecount

(&number)

;for

(int i =

0; i < number;

++i)

}

我的顯示卡為geforce gtx 960m,所以會列印下面的資訊

used gpu geforce gtx 960m

乙個執行緒塊中,可以含有多個執行緒。本例中將兩個陣列中的對應數字相加,獲取相加後的資料,**如下:

__global__ void

addkernel

(int

*c,int

*a,int

*b)// 執行緒並行

void

mytestcalc

(void);

int pdatab[5]

=;int pdatac[5]

=;// 申請a、b、c的記憶體

int*pdevdataa = nullptr,

*pdevdatab = nullptr,

*pdevdatac = nullptr;

cudamalloc

(&pdevdataa,

sizeof

(int)*

5);cudamalloc

(&pdevdatab,

sizeof

(int)*

5);cudamalloc

(&pdevdatac,

sizeof

(int)*

5);// 記憶體拷貝

cudamemcpy

(pdevdataa, pdataa,

sizeof

(int)*

5, cudamemcpyhosttodevice)

;cudamemcpy

(pdevdatab, pdatab,

sizeof

(int)*

5, cudamemcpyhosttodevice)

; addkernel<<

<1,

5>>

>

(pdevdatac, pdevdataa, pdevdatab)

;cudathreadsynchronize()

;cudamemcpy

(pdatac, pdevdatac,

sizeof

(int)*

5, cudamemcpydevicetohost)

;printf

("thread cala result is: %d, %d, %d, %d, %d\n"

, pdatac[0]

, pdatac[1]

, pdatac[2]

, pdatac[3]

, pdatac[4]

);cudafree

(pdevdataa)

;cudafree

(pdevdatab)

;cudafree

(pdevdatac)

;}

這裡因為傳入的執行緒數為一維的,所以threadidx.x就可以直接獲取當前執行緒的所在索引號。程式呼叫函式mytestcalc()後,程式執行結果為:

thread cala result is: 12, 24, 36, 48, 60

使用塊並行與上面的**類似,**如下:

__global__ void

addkernel

(int

*c,int

*a,int

*b)// 塊並行

void

mytestcalc

(void);

int pdatab[5]

=;int pdatac[5]

=;// 申請a、b、c的記憶體

int*pdevdataa = nullptr,

*pdevdatab = nullptr,

*pdevdatac = nullptr;

cudamalloc

(&pdevdataa,

sizeof

(int)*

5);cudamalloc

(&pdevdatab,

sizeof

(int)*

5);cudamalloc

(&pdevdatac,

sizeof

(int)*

5);// 記憶體拷貝

cudamemcpy

(pdevdataa, pdataa,

sizeof

(int)*

5, cudamemcpyhosttodevice)

;cudamemcpy

(pdevdatab, pdatab,

sizeof

(int)*

5, cudamemcpyhosttodevice)

;//addkernel<<<1, 5>>>(pdevdatac, pdevdataa, pdevdatab);

addkernel <<

<5,

1>>

>

(pdevdatac, pdevdataa, pdevdatab)

;cudathreadsynchronize()

;cudamemcpy

(pdatac, pdevdatac,

sizeof

(int)*

5, cudamemcpydevicetohost)

;printf

("block cala result is: %d, %d, %d, %d, %d\n"

, pdatac[0]

, pdatac[1]

, pdatac[2]

, pdatac[3]

, pdatac[4]

);cudafree

(pdevdataa)

;cudafree

(pdevdatab)

;cudafree

(pdevdatac)

;}

上面**相比執行緒並行的不同之處在於

threadidx.x替換為blockidx.x,來表示當前塊的id。

呼叫部分修改為addkernel <<<5, 1 >>>(pdevdatac, pdevdataa, pdevdatab);,表示使用5個執行緒塊來處理,每個執行緒塊中有乙個執行緒。

Cuda學習筆記(二) Cuda中對執行緒塊的設定

盡量滿足每個sm上面的最大執行緒數。每個sm支援的執行緒塊有上限,所以每個執行緒塊的執行緒數不能太少,並且最好為32或16的倍數。當乙個sm中的block的所有執行緒形成阻塞 同步或者等待 時,相應的sm會閒置導致效率下滑。通常讓block的數目是sm的2倍以上,方便sm對其進行排程,使其在時間軸上...

《基於CUDA的並行程式設計》學習筆記 三 中

cuda架構第一次引入了主機 host 端與裝置 device 端的概念。如下圖所示,乙個完整的cuda程式由主機 和裝置 兩部分組成。主機 在主機端cpu上序列執行,是普通的c 裝置 部分在裝置端gpu上並行執行,稱為核心 kernel kernel函式不是乙個完整的程式,而是任務中能被分解為並行...

執行緒學習筆記2

在兩個程序間進行socket通訊中,在其中乙個程序中建立新的執行緒,用於監聽,程式設計中發現自己對執行緒的操作僅限於執行緒的建立,銷毀,以及互斥量的操作,感覺還有許多關於執行緒的東西沒有掌握,so,需要好好學習總結一下,不足之處望指出 為什麼要引入執行緒呢?雖然程序可以提高cpu的利用率,但是程序之...