在CUDA中,是否有一种方式可以在设备端函数中动态分配内存?我找不到任何这样的示例。
根据CUDA C编程手册:
B.15 动态全局内存分配
void* malloc(size_t size);
void free(void* ptr);
从全局内存的固定大小堆中动态分配和释放内存。
CUDA内核中的malloc()
函数至少从设备堆中分配size字节,并返回指向已分配内存的指针,如果没有足够的内存来满足请求,则返回NULL。返回的指针保证对齐到16字节边界。
CUDA内核中的free()
函数释放ptr
指向的内存,其中ptr
必须由先前调用malloc()
返回。如果ptr
为NULL
,则忽略对free()的调用。重复使用相同的指针调用free()具有未定义的行为。
通过malloc()
分配的内存在CUDA上下文的生命周期内始终保持分配状态,或直到显式地通过调用free()
释放。它可以被任何其他CUDA线程使用,即使是从后续的内核启动。任何CUDA线程都可以释放另一个线程分配的内存,但应注意确保不要多次释放同一指针。