动态全局内存分配和操作:
动态全局内存分配和操作仅受计算能力2.x和更高的设备支持
从全局内存中的固定大小的堆中动态分配和释放内存:
将src指向的内存位置的大小字节复制到dest指向的内存位置。
将由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等)。