Memory management CUDA在设备功能中分配内存

Memory management CUDA在设备功能中分配内存,memory-management,cuda,dynamic-memory-allocation,Memory Management,Cuda,Dynamic Memory Allocation,CUDA中有没有一种方法可以在设备端函数中动态分配内存? 我找不到任何这样做的例子 从CUDA C编程手册: B.15动态全局内存分配 void* malloc(size_t size); void free(void* ptr); 从全局内存中的固定大小堆动态分配和释放内存 内核中的CUDAmalloc()函数从设备堆中至少分配大小字节,并返回指向已分配内存的指针,如果内存不足,则返回NULL。返回的指针保证与16字节边界对齐 内核中的CUDAfree()函数解除分配由ptr指向的内存,

CUDA中有没有一种方法可以在设备端函数中动态分配内存? 我找不到任何这样做的例子

从CUDA C编程手册:

B.15动态全局内存分配

void* malloc(size_t size); 
void free(void* ptr); 
从全局内存中的固定大小堆动态分配和释放内存

内核中的CUDA
malloc()
函数从设备堆中至少分配大小字节,并返回指向已分配内存的指针,如果内存不足,则返回NULL。返回的指针保证与16字节边界对齐

内核中的CUDA
free()
函数解除分配由
ptr
指向的内存,该内存必须由先前调用
malloc()
返回。如果
ptr
NULL
,则忽略对free()的调用。使用相同的ptr重复调用free()具有未定义的行为

给定CUDA线程通过
malloc()
分配的内存在CUDA上下文的生存期内保持分配状态,或者直到调用
free()
显式释放为止。它可以被任何其他CUDA线程使用,甚至可以从后续的内核启动中使用。任何CUDA线程都可以释放另一个线程分配的内存,但应注意确保同一指针不会被多次释放

根据需要,您应该能够在设备函数中使用malloc()和free()

第122页

B.15动态全局内存分配 void*malloc(大小); 无空隙(空隙*ptr); 从全局内存中的固定大小堆动态分配和释放内存

手册中给出的示例

__global__ void mallocTest()
{
    char* ptr = (char*)malloc(123);
    printf(“Thread %d got pointer: %p\n”, threadIdx.x, ptr);
    free(ptr);
}

void main()
{
    // Set a heap size of 128 megabytes. Note that this must
    // be done before any kernel is launched.
    cudaThreadSetLimit(cudaLimitMallocHeapSize, 128*1024*1024);
    mallocTest<<<1, 5>>>();
    cudaThreadSynchronize();
}
\uuuu全局\uuuuu无效mallocTest()
{
char*ptr=(char*)malloc(123);
printf(“线程%d获得指针:%p\n”,threadIdx.x,ptr);
免费(ptr);
}
void main()
{
//将堆大小设置为128 MB。请注意,这必须
//必须在启动任何内核之前完成。
cudaThreadSetLimit(cudaLimitMallocHeapSize,128*1024*1024);
mallocTest();
cudaThreadSynchronize();
}

您需要编译器参数-arch=sm_20和支持>2x体系结构的卡。

是。我知道这是一个有点异国情调的要求,但我正在移植现有的代码baseHi@Nate,当我使用malloc和free-on-global函数时,它会给我编译错误,比如不能调用主机函数malloc和free-on-device。我是否缺少一些头文件?您知道如何检查gpu支持的体系结构吗?谢谢