我是否需要释放使用cudaMemcpyToSymbol分配的常量内存?

时间:2013-02-01 21:35:51

标签: cuda

我很确定答案是否定的,但我只是想确保因为我不想要内存泄漏。

我正在使用以下代码

__constant__ void* VERTEX_NO_CONSTANT_PARAMETER;
HANDLE_ERROR( cudaMemcpyToSymbol( VERTEX_NO_CONSTANT_PARAMETER, &vertexNo, sizeof( int ) ) );
HANDLE_ERROR( cudaFree( VERTEX_NO_CONSTANT_PARAMETER ) );

它不会给我带来任何错误,这会让我产生怀疑(我希望cudaFree会出错)。

谢谢!

凯文

2 个答案:

答案 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()[...]