cuda**(.cu)的目的是並行運算。只要在c/c++**中呼叫以 __global__為關鍵字修飾的函式( __ global __ void function( type *inputarraya, type *inputarrayb, type *outputarraya) ),稱為核函式,**經nvcc編譯,識別到核函式就會編譯成gpu指令碼; 呼叫該函式時,要在函式名稱加上<<>>( function<<>>( type *inputarraya, type *inputarrayb, type *outputarraya) )。不過,gpu 只能操作gpu上的變數,所以在呼叫 __ global __ 函式之前,先用cudamalloc申請好在cuda變數記憶體(__global函式的引數:input array,output array),並用cudamemcpy (cudamemcpyhosttodevice)賦值輸入array。待函式執行完成後,執行結果儲存在輸出array中,用cudamemcpy (cudamemcpydevicetohost)把執行結果從gpu記憶體中copy到cpu中,平行計算完成,用cudafree釋放之前申請的cuda變數記憶體。 以上就是cpu**中呼叫gpu的流程。
呼叫 cuda 核函式需要指定呼叫多少個block,每個block包含多少個thread。其中,多個block組成乙個grid. 共呼叫了 blockspergrid*threadsperblock 個並行執行的執行緒,所以要在cuda核函式中明確的指定每個執行緒執行時對應的array index。注意:thread, block有.x, .y二維資料,但有時只用其中一維.x 。下面將給出乙個簡單的demo,執行 c=a+b ( c[i] = a[i] + b[i] )運算。
#include
"../common/book.h"
#define n 10
__global__ void
add(
int*a,
int*b,
int*c )
intmain
(void
)// copy the arrays 'a' and 'b' to the gpu
handle_error
(cudamemcpy
( dev_a, a, n *
sizeof
(int),
cudamemcpyhosttodevice ));
handle_error
(cudamemcpy
( dev_b, b, n *
sizeof
(int),
cudamemcpyhosttodevice ));
//n blocks, 1 thread per block for n length arrays parallel computation(add)
add<<
1>>
>
( dev_a, dev_b, dev_c )
;// copy the array 'c' back from the gpu to the cpu
handle_error
(cudamemcpy
( c, dev_c, n *
sizeof
(int),
cudamemcpydevicetohost ));
// display the results
for(
int i=
0; i
)// free the memory allocated on the gpu
handle_error
(cudafree
( dev_a ));
handle_error
(cudafree
( dev_b ));
handle_error
(cudafree
( dev_c ));
return0;
}
CUDA學習筆記(1) Hello CUDA
cuda的安裝網上的教程有很多,這裡就不做介紹了。cuda使用c語言的語法,擴充套件了一些關鍵字,下面我們使用cuda編寫第乙個程式hello cuda。這裡使用vs 2015新建乙個cuda的專案,在新建專案中,選擇cuda,如下圖顯示 程式 如下 include cuda runtime.h i...
cuda學習筆記1 hello world實戰
因為要用tensorrt寫自定義層,一定會用到cuda,所以學一下。fuc.cu fuc.h test.cu cmakelists.txt include include fuc.h global void kernel extern global void kernel include inclu...
CUDA學習備忘1
一 cuda流程 1設定可用裝置 cudasetdevice 2在gpu上申請資料記憶體 cudamalloc 3將host cpu 資料複製到device gpu cudamemcpy 4呼叫kernel,kernel dg grid db block ns 共享記憶體 s 流5根據情況同步執行緒...