CUDA学习(五十一)
動(dòng)態(tài)全局內(nèi)存分配和操作:
動(dòng)態(tài)全局內(nèi)存分配和操作僅受計(jì)算能力2.x和更高的設(shè)備支持
從全局內(nèi)存中的固定大小的堆中動(dòng)態(tài)分配和釋放內(nèi)存:
void* memcpy(void* dest, const void* src, size_t size);將src指向的內(nèi)存位置的大小字節(jié)復(fù)制到dest指向的內(nèi)存位置。
void* memset(void* ptr, int value, size_t size);將src指向的內(nèi)存位置的大小字節(jié)復(fù)制到dest指向的內(nèi)存位置。
void* memset(void* ptr, int value, size_t size);將由ptr指向的內(nèi)存塊的大小字節(jié)設(shè)置為值(解釋為無(wú)符號(hào)字符)。
CUDA in-kernel malloc()函數(shù)至少?gòu)脑O(shè)備堆中分配大小字節(jié),并返回指向已分配內(nèi)存的指針,如果內(nèi)存不足以滿足請(qǐng)求,則返回NULL。 返回的指針保證與16字節(jié)的邊界對(duì)齊。
CUDA in-kernel free()函數(shù)釋放ptr指向的內(nèi)存,該內(nèi)存必須先前調(diào)用malloc()返回。 如果ptr為NULL,則對(duì)free()的調(diào)用將被忽略。 用相同的ptr重復(fù)調(diào)用free()具有未定義的行為。
由給定的CUDA線程通過(guò)malloc()分配的內(nèi)存仍然分配給CUDA上下文的生命周期,或直到通過(guò)調(diào)用free()明確釋放。 它可以被任何其他CUDA線程使用,甚至可以在隨后的內(nèi)核啟動(dòng)時(shí)使用。 任何CUDA線程都可以釋放由另一個(gè)線程分配的內(nèi)存,但應(yīng)注意確保同一個(gè)指針不會(huì)多次釋放。
堆內(nèi)存分配:
設(shè)備內(nèi)存堆具有固定大小,必須在使用malloc()或free()加載到上下文之前指定。 如果任何程序使用malloc()而沒(méi)有明確指定堆大小,則會(huì)分配一個(gè)八兆字節(jié)的默認(rèn)堆。
以下API函數(shù)獲取并設(shè)置堆大小:
授予的堆大小至少為大小字節(jié)。 cuCtxGetLimit()和cudaDeviceGetLimit()返回當(dāng)前請(qǐng)求的堆大小。
當(dāng)模塊加載到上下文中時(shí),堆的實(shí)際內(nèi)存分配發(fā)生在顯式地通過(guò)CUDA驅(qū)動(dòng)程序API(請(qǐng)參閱模塊)或隱式地通過(guò)CUDA運(yùn)行時(shí)API(請(qǐng)參閱CUDA C運(yùn)行時(shí))中。 如果內(nèi)存分配失敗,則模塊加載將生成一個(gè)CUDA_ERROR_SHARED_OBJECT_INIT_FAILED錯(cuò)誤。
一旦發(fā)生模塊加載并且不根據(jù)需要?jiǎng)討B(tài)調(diào)整堆大小,堆大小將無(wú)法更改。
為設(shè)備堆保留的內(nèi)存除了通過(guò)主機(jī)端CUDA API調(diào)用(如cudaMalloc())分配的內(nèi)存之外。
與主機(jī)內(nèi)存API的互操作性:
通過(guò)設(shè)備malloc()分配的內(nèi)存不能使用運(yùn)行時(shí)釋放(即通過(guò)調(diào)用設(shè)備內(nèi)存中的任何空閑內(nèi)存功能)。
同樣,通過(guò)運(yùn)行時(shí)分配的內(nèi)存(即通過(guò)調(diào)用設(shè)備內(nèi)存中的任何內(nèi)存分配函數(shù))不能通過(guò)free()釋放。
此外,設(shè)備malloc()內(nèi)存不能用于任何運(yùn)行時(shí)或驅(qū)動(dòng)程序API調(diào)用(即cudaMemcpy,cudaMemset等)。
此外,設(shè)備malloc()內(nèi)存不能用于任何運(yùn)行時(shí)或驅(qū)動(dòng)程序API調(diào)用(即cudaMemcpy,cudaMemset等)。
總結(jié)
以上是生活随笔為你收集整理的CUDA学习(五十一)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Python 使用 itchat+pil
- 下一篇: java 遍历类路径