CUDA常用函式介紹

yyfn風辰發表於2010-04-21
cudaMalloc(void** p, int size):分配size位元組的儲存器,並將其首地址賦給*p,至於引數為什麼是二級指標,可在C語言中找到答案

cudaMallocHost():這個方法是在主機上分配空間,可以加快傳輸速度,因此在寫cuda時,應該使用此函式取代Malloc,引數同上一函式

cudaMemcpy(void* dest,void* source,int size,enum direction):copy size data form. source to         dest,direction must be right,you must be careful。關於這個函式要注意的是:如果最後一個引數的型別不匹配也不會出錯。

cudaMemcpyToSymbol:將資料複製到__constant__,__device__變數中
cudaMemcpyFormSymbol: 同上相反

CudaThreadSynchronize():強制等待所有在此句之前啟動的runtime 任務完成。其實現方式採用的輪詢。

__syncthreads():此函式用於保證block內所有執行緒都執行到呼叫處,常用它來保證一致性。

cudaMallocPitch(void**,int*,widthInBytes,height):這個函式是線上性記憶體中分配二維陣列,因此在使用時,還是用一維的方式使用。注意,width的單位是位元組,而height單位是資料型別,而第二個引數的含義下面一段話說明了。
c語言申請2維記憶體時,一般是連續存放的。a[y][x]存放在第y*widthofx*sizeof(元素)+x*sizeof(元素)個位元組。 但在cuda的global memory訪問中,從256位元組對齊的地址(addr=0, 256, 512, ...)開始的連續訪問是最有效率的。這樣,為了提高記憶體訪問的效率,有了cudaMallocPitch函式。cudaMallocPitch函式分配的記憶體中,陣列的每一行的第一個元素的開始地址都保證是對齊的。因為每行有多少個資料是不確定的,widthofx*sizeof(元素)不一定是256的倍數。故此,為保證陣列的每一行的第一個元素的開始地址對齊,cudaMallocPitch在分配記憶體時,每行會多分配一些位元組,以保證widthofx*sizeof(元素)+多分配的位元組是256的倍數(對齊)。這樣,上面的y*widthofx*sizeof(元素)+x*sizeof(元素)來計算a[y][x]的地址就不正確了。 而應該是y*[widthofx*sizeof(元素)+多分配的位元組]+x*sizeof(元素)。而函式中返回的pitch的值就是widthofx*sizeof(元素)+多分配的位元組。 說明:widthInBytes作為輸入引數,應該是widthofx*sizeof(元素);這樣的話,複製內容時也要作相應的修改。

cuda中的數學函式,普通的和標準c中一樣,如果是對int操作,直接使用本名,如果操作long型別對數,在本名前加l,如果操作雙精度浮點數,在本名前加f,如果操作單精度,在本名前後都加上f,如 max(int,int),lmax(long,long),fmax(double,double),fmaxf(float,float),同時要記住的是:有些函式並沒有某些型別引數存在,也就沒有相應的函式。

向量操作

cuda對於向量在cutil_math.h中過載了很多操作符,如負號,+, -, *(包括向量乘和數乘),/(向量的對應座標相除和數除),+=,-=,*=,lerp(三個引數,含義為求一個值,使得該值和第一個引數的距離與每一個引數和第二個引數的距離的比值是第三個引數,型別於高中的線段的分割點), dot(點乘),length(返回二範數),normalize(對向量進行單位化),rsqrtf(求開方的倒數)

[ 本帖最後由 yyfn風辰 於 2010-4-21 21:14 編輯 ]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23057064/viewspace-660373/,如需轉載,請註明出處,否則將追究法律責任。

相關文章