我很确定答案是否定的,但我只是想确保因为我不想要内存泄漏。
我正在使用以下代码
__constant__ void* VERTEX_NO_CONSTANT_PARAMETER;
HANDLE_ERROR( cudaMemcpyToSymbol( VERTEX_NO_CONSTANT_PARAMETER, &vertexNo, sizeof( int ) ) );
HANDLE_ERROR( cudaFree( VERTEX_NO_CONSTANT_PARAMETER ) );
它不会给我带来任何错误,这会让我产生怀疑(我希望cudaFree会出错)。
谢谢!
凯文
答案 0 :(得分:2)
在问题中,您声明常量void * VERTEX_NO_CONSTANT_PARAMETER。声明在常量内存中保留sizeof(void *)。这个4/8字节由CUDA驱动程序在加载CUDA模块时分配,并在卸载CUDA模块时释放。
如果您在主机代码中调用cudaMalloc并使用cudaMemcpyToSymbol将设备指针复制到VERTEX_NO_CONSTANT_PARAMETER,那么在使用设备内存完成程序后,您仍然需要使用cudaFree释放设备内存。如果不释放内存,驱动程序将在CUDA上下文被破坏时释放内存。
CUDA不提供动态分配常量内存的API。只能使用__constant__
限定符静态分配常量内存。
答案 1 :(得分:1)
不,你没有。根据NVIDIA cuda图书馆:
cudaFree(void * devPtr)释放devPtr指向的内存空间, 必须由之前调用cudaMalloc()或 cudaMallocPitch()[...]