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