有些顯示卡支援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的利用率,但是程序之...