CUDA學習筆記05 Mem申請的所有方式

2021-08-08 22:21:39 字數 4588 閱讀 3065

昨天小組討論,有人一直堅持讓我申請制定位置的記憶體,我真的是一臉懵逼,作為程式設計又5年的我從來沒想過這個問題,就好像c++中強制你申請l1 cache快取那樣,我內心中有萬只草泥馬路過:「臣妾做不到啊!!!」,為了給給所有人講清楚cuda程式設計是什麼,接下來的幾篇部落格主要就是講解cuda的硬體和軟體結構,首先應該寫硬體部分,但是我這裡想先寫cuda的記憶體申請部分。

cudamallochost函式

__host__cudaerror_t cudamallochost (void

**ptr, size_t size)

allocates page-locked memory on the host.

申請的是page-locked的host記憶體,就是說申請的記憶體所在的page永遠待在記憶體,不會被交換出去。

parameters

ptr - pointer to allocated host memory

size - requested allocation size in

bytes

returns - cudasuccess, cudaerrormemoryallocation

cudamalloc 函式

__host____device__cudaerror_t cudamalloc (void **devptr, size_t size)

allocate memory on the device.

就是申請的記憶體。和c裡面的malloc函式一樣

parameters

devptr - pointer to allocated device memory

size - requested allocation size

in bytes

returns - cudasuccess, cudaerrormemoryallocation

cudamalloc3d函式

__host__cudaerror_t cudamalloc3d (cu *pitcheddevptr, cudaextent extent) allocates logical 1

d, 2

d, or 3

d memory objects on the devic

parameters

pitcheddevptr - pointer to allocated pitched device memory

extent - requested allocation size (width field in bytes),結構體如下:

struct cudaextent

;returns - cudasuccess, cudaerrormemoryallocation、

分配1d、2

d、3d線性記憶體,也可用於申請紋理記憶體

cudamalloc3darray函式,和上面的cudamalloc3d函式用法一致

__host__cudaerror_t cudamalloc3darray (cudaarray_t *array, const cudachannelformatdesc *desc, cudaextent extent, unsigned int flags)

allocate an array

on the device.

parameters

array - pointer to allocated array

in device memory

desc - requested channel format

struct cudachannelformatdesc

;extent - requested allocation size (width field in elements)

flags - flags

for extensions

returns - cudasuccess, cudaerrormemoryallocation

cudamallocarray陣列記憶體申請

__host__cudaerror_t cudamallocarray (cudaarray_t *array, const cudachannelformatdesc *desc, size_t width, size_t height, unsigned int flags)

allocate an array

on the device.

parameters

array - pointer to allocated array

in device memory

desc - requested channel format

width - requested array allocation width

height - requested array allocation height

flags - requested properties of allocated array

returns

cudasuccess, cudaerrormemoryallocation

cudamallocmanaged函式

__host__cudaerror_t cudamallocmanaged (void **devptr, size_t size, unsigned int flags)

allocates memory that will be automatically managed by

the unified memory system.

parameters

devptr - pointer to allocated device memory

size - requested allocation size in

bytes

flags - must be either cudamemattachglobal or cudamemattachhost (defaults to cudamemattachglobal)

returns

cudasuccess, cudaerrormemoryallocation cudaerrornotsupported

cudaerrorinvalidvalue

使用函式cudamallocmanaged()開闢一塊儲存空間,無論是在kernel函式中還是main函式中,都可以使用這塊記憶體,達到了統一定址的目的。

通過這種方式大大的簡化了**的複雜度,因為cuda6之前沒有統一定址,進行gpu計算的步驟稍許麻煩:

1. 在視訊記憶體上開闢空間 

2. 將記憶體上的資料拷貝到視訊記憶體

3. 呼叫cuda核進行計算

4. 將視訊記憶體上處理過的資料拷貝到記憶體上

而統一定址的最大優勢就是避免了人為的資料拷貝,為什麼說人為呢,是因為即使是統一定址也是要進行資料拷貝的,只不過現在這一部分有程式自動完成,而不用程式設計師操心了。因此,統一定址後程式的執行效率並不會顯著改善,僅僅是為了方便而已。

on the device. 紋理記憶體申請

parameters

in device memory

desc - requested channel format

extent - requested allocation size (width field in elements)

numlevels - number of mipmap levels to allocate

flags - flags

for extensions

returns - cudasuccess, cudaerrormemoryallocation

__host__cudaerror_t cudamallocpitch (void **devptr,

size_t *pitch, size_t width, size_t height)

allocates pitched memory on the device.

parameters

devptr - pointer to allocated pitched device memory

pitch - pitch for allocation

width - requested pitched allocation width (in bytes)

height - requested pitched allocation height

returns - cudasuccess, cudaerrormemoryallocation

分配指定大小的線性記憶體

好的上面就是所有的cuda提供的記憶體申請方式,從上面可以看到,無論是c/c++還是cuda申請記憶體只是制定size就可以了,至於這個記憶體到底在**,這個是編譯器做的事情,我們無法直接制定記憶體申請的具體的物理位置,這是一件好事情,這樣程式設計師只需要專注於申請記憶體,然後去用就行了,不用擔心記憶體的管理(這裡的管理值得涉及到具體物理位置的記憶體的管理),這個nvidia已經幫我們做好了。

總的來說,申請到的記憶體具體在哪乙個位置是nvcc編譯器決定的,我們無法決定。

學習筆記 mem族函式

功能 將以source作為起始位址的資料複製num個位元組到以destination為起始位址的資料中,不支援destination和source重疊的情況。函式返回destination指標。memcpy函式實現 void mymemcpy void dest,const void src,int...

cuda學習筆記 1

cuda cu 的目的是並行運算。只要在c c 中呼叫以 global 為關鍵字修飾的函式 global void function type inputarraya,type inputarrayb,type outputarraya 稱為核函式,經nvcc編譯,識別到核函式就會編譯成gpu指令碼...

Cuda學習筆記(三) Cuda程式設計Tips

cuda中對核心函式的呼叫 m n m表示執行緒塊的個數,n表示每個執行緒塊的執行緒數,m個執行緒塊構成乙個執行緒格。m和n可以是一維的或者二維 三維 的,即使n是一維的,那麼m也可以是二維的。共享記憶體對於每個執行緒塊建立乙個副本,但是共享記憶體對於所有的執行緒塊中的執行緒都是相同的。執行緒同步語...