CUDA 常用的函式

洛欣發表於2010-06-11

cudaMalloc(void**,int):allocate int memory to void**

 

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。關於這個函式要注意的是:如果最後一個引數的型別不匹配也不會出錯,相比sun microsoftnVidia的工程師真爛。

 

cudaMemcpyToSymbol:將資料複製到__constant__變數中

cudaMemcpyFormSymbol: 同上相反

 

CudaThreadSynchronize():強制等待所有在此句之前啟動的runtime 任務完成。此後再進行下一個任務,有時如果下一個任務使用前一個任務的資料,而前一個任務並沒有處理完資料的話,也有可能導致失敗。

 

cudaMallocPitch(void**,int*,widthInBytes,height):這個函式是線上性記憶體中分配二維陣列,因此在使用時,還是用一維的方式使用。注意,width的單位是位元組,而height單位是資料型別,而第二個引數的含義下面一段話說明了。

c語言申請2維記憶體時,一般是連續存放的。a[y][x]存放在第y*widthofx*sizeof(元素)+x*sizeof(元素)個位元組。 但在cudaglobal 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),同時要記住的是:有些函式並沒有某些型別引數存在,也就沒有相應的函式。

std名稱空間內,利用過載,以統一的風格定義了所有的函式,這和java一致。

 

向量操作

 

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

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

相關文章