為了提高並行運算速度,開始接觸cuda程式設計,cuda 在安裝的時候提供了很多示例,一般位於home目錄下,可以作為學習的參考,同時官網提供的入門教程,就是很好的學習資料。
cuda程式設計首先要轉換與cpu 下程式設計的思想,在cpu 下,我們一般都是按照順序進行執行,或者開幾個執行緒處理幾個任務,而在gpu 下,是分block 和 thread的,gpu由多個block(x,y ,z )組成,每個block 下由多了thread組成,都是根據id進行區分操作,這樣可以把乙個任務拆分成很多個執行緒去執行。
作為學習,我新建了cuda 檔案專案,cmake 進行檔案管理,目錄結構如下:
入門的專案為helloworld,主程式在main.cu中
本例子對兩個整數求和。
最外層的cmakelists.txt 管理用到的包和標頭檔案
project(
"cuda"
)cmake_minimum_required(version 2.8)
# 查詢cuda 檔案
find_package(cuda required)
include_directories($)
#add_subdirectory(addvector)
add_subdirectory(helloworld)
helloworld 檔案中的cmakelists.txt
project(helloworld)
cuda_add_executable(helloworld main.cu)
main.cu 中的**:
#include
// cuda runtime
#include
// __global__ 宣告 gpu 執行緒呼叫
__global__ void
sum(
int*a,
int*b,
int*c )
intmain
(int argc,
char
**ar**)
,b[1]=
,c[1]=
;// 宣告 device 變數
int*gpu_a,
*gpu_b,
*gpu_c;
// 開闢空間
cudamalloc((
void**
)&gpu_a,
sizeof
(int))
;cudamalloc((
void**
)&gpu_b,
sizeof
(int))
;cudamalloc((
void**
)&gpu_c,
sizeof
(int))
;// 講host 資料上載到gpu上
cudamemcpy
(gpu_a, a,
sizeof
(int
), cudamemcpyhosttodevice)
;cudamemcpy
(gpu_b, b,
sizeof
(int
), cudamemcpyhosttodevice)
;// 執行
sum<<
<1,
1>>
>
(gpu_a, gpu_b, gpu_c)
;cudamemcpy
(c, gpu_c,
sizeof
(int
), cudamemcpydevicetohost)
;// 釋放空間
cudafree
(gpu_a)
;cudafree
(gpu_b)
;cudafree
(gpu_c)
;// 列印
printf
(" %d + %d = %d \n"
, a[0]
, b[0]
, c[0]
);return0;
}
最後 cmake make 執行結果: socket網路程式設計入門寫hello world
1 伺服器端 include include include include include include include using namespace std void error handling const char message int main int argc,char ar in...
cuda程式設計 CUDA程式設計入門(四)並行歸約演算法
這一篇我們一起學習一下如何使用cuda實現並行歸約演算法。首先我們要知道什麼是並行歸約。並行歸約 reduction 是一種很基礎的並行演算法,簡單來說,我們有n個輸入資料,使用乙個符合結合律的二元操作符作用其上,最終生成1個結果。這個二元操作符可以是求和 取最大 取最小 平方 邏輯與或等等。我們以...
CUDA程式設計入門筆記1
要開始給專案中的程式做速度上的優化 由於cpu的計算速度比較慢 所以想用gpu來進行大量相同的計算 cuda c是對c c 語言進行拓展後形成的變種,相容c c 語法,檔案型別為 cu 檔案,編譯器為 nvcc 相比傳統的c c 主要新增了以下幾個方面 用來確定某個函式是在cpu還是gpu上執行,以...