除了前面提到的記憶體分配函式cudamalloc之外,這裡再簡單的介紹幾個常用的記憶體分配函式:cudamallocpitch、cudamalloc3d等。
cudaerror_t cudamallocpitch(void **devptr, size_t *pitch, size_t width, size_t height);
該函式用來分配指定大小的線性記憶體,寬度至少為width,高度為height,在分配2d陣列的時候建議使用該函式,而不用前面提到的cudamallocpitch函式,因為該函式在分配記憶體時會適當的填充一些位元組來保證對其要求,從而在按行訪問時,或者在二維陣列和裝置儲存器的其他區域間複製是,保證了最佳的效能!(通過呼叫cudamemcpy2d等類似函式)。那麼實際的分配的記憶體大小為:sizeof(t)*pitch * height,則訪問2d陣列中任意乙個元素[row,column]的計算公式如下:
t* pelement = (t*)((char*)baseaddress + row * pitch) + column;
第乙個引數,void**型別,devptr:用來接受被分配記憶體的其實位址
第二個引數,size_t*型別,pitch:用來接受實際行間距,即被填充後的實際寬度(單位位元組),大於等於第三個引數width
第三個引數,size_t型別,width:請求分配記憶體的寬度(單位位元組),如2d陣列的列數
第四個引數,size_t型別,height:請求分配記憶體的高度(單位位元組),如2d陣列的行數
cudaerror_t cudamalloc3d(struct cudapitchedptr* pitcheddevptr, struct cudaextent extent);
該函式用來申請裝置上的1d、2d、3d記憶體物件,同cudamallocpitch函式一樣,為了最佳的效能,會填充一些位元組。
第乙個引數,cudapitchptr*型別,pitcheddevptr:作為傳出引數,用於記錄分配得到的裝置記憶體資訊,具體結構如下:
struct cudapitchedptr
;
第二個引數,cudaextent型別,extent:作為傳入引數,傳入所請求申請的記憶體資訊,包括width、height、depth;具體結構如下:
struct cudaextent
;
#include #include using namespace std;
int main()
cout << "width: " << width << endl;
cout << "height: " << height << endl;
cout << "pitch: " << pitch << endl;
//2 use cudamalloc3d
cudapitchedptr pitchptr;
cudaextent extent;
extent.width = 10 * sizeof(float);
extent.height = 22 * sizeof(float);
extent.depth = 33 * sizeof(float);
err = cudamalloc3d(&pitchptr, extent);
if (err != cudasuccess)
cout << "\n\n";
cout << "width: " << extent.width << endl; //輸出申請記憶體的初始值
cout << "height: " << extent.height << endl;
cout << "depth: " << extent.depth << endl;
cout << endl;
cout << "pitch: " << pitchptr.pitch << endl; //輸出實際的寬度值
cout << "xsize: " << pitchptr.xsize << endl; //有效寬度--等於extent.width
cout << "ysize: " << pitchptr.ysize << endl; //有效高度--等於extent.height
注意,以上兩個記憶體分配函式分配的都是線性記憶體!
cudamemset3d,
cudamalloc3darray,
cudamallocarray,
cudafreearray,
cudamallochost(void**, size_t)
cudamallochost (c api)",
cudafreehost,
cudahostalloc,
make_cudapitchedptr, //用於建立cudapitchedptr物件
make_cudaextent //用於建立cudaextent物件
CUDA線性記憶體分配
概述 線性儲存器可以通過cudamalloc cudamallocpitch 和cudamalloc3d 分配 1 1d線性記憶體分配 1 cudamalloc void int 在裝置端分配記憶體 2 cudamemcpy void dest,void source,int size,enum d...
隨堂筆記(二) 記憶體分配函式
malloc 函式就是在記憶體中找一片指定大小的空間,然後將這個空間的首位址範圍給乙個指標變數,這裡的指標變數可以是乙個單獨的指標,也可以是乙個陣列的首位址,這要看malloc 函式中引數size的具體內容。void cdecl malloc in size t size 函式原型 int p in...
記憶體分配函式
2.c中提供堆區供給開發者分配記憶體空間,動態記憶體分配函式malloc,calloc,realloc 1 malloc函式的使用,原型為void malloc int length 引數為分配記憶體空間的大小 將記憶體分配4個位元組給乙個int型指標 返回值為任何指標 考慮到不同平台,可以使用si...