2

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

我正在使用以下代码

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

它不会向我抛出任何让我怀疑的错误(我希望 cudaFree 会出错)。

谢谢!

凯文

4

2 回答 2

2

在问题中,您声明常量 void* VERTEX_NO_CONSTANT_PARAMETER。声明将 sizeof(void*) 保留在常量内存中。这 4/8 字节由 CUDA 驱动程序在加载 CUDA 模块时分配,并在卸载 CUDA 模块时释放。

如果您在主机代码中调用 cudaMalloc 并使用 cudaMemcpyToSymbol 将设备指针复制到 VERTEX_NO_CONSTANT_PARAMETER ,那么在程序使用设备内存完成后,您仍然有责任使用 cudaFree 释放设备内存。如果您不释放内存,驱动程序将在 CUDA 上下文被销毁时释放内存。

CUDA 不提供动态分配常量内存的 API。常量内存只能使用__constant__限定符静态分配。

于 2013-02-02T05:07:19.587 回答
1

不,你没有。根据 NVIDIA cuda 库:

cudaFree (void *devPtr) 释放 devPtr 指向的内存空间,它必须由先前调用 cudaMalloc() 或 cudaMallocPitch() [...]

于 2013-02-01T23:13:46.353 回答