2013-02-01 39 views
1

我很肯定答案是否定的,但我只是想確定,因爲我不想內存泄漏。我是否需要釋放使用cudaMemcpyToSymbol分配的常量內存?

我使用下面的代碼

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

它不扔在我這把疑問,在我的腦海裏(我希望cudaFree將錯誤)的任何錯誤。

謝謝!

Kevin

回答

1

不,你不知道。據NVIDIA CUDA庫:

cudaFree(無效* devPtr)釋放的內存空間由devPtr, 必須已經由先前調用cudaMalloc()或 使用cudaMallocPitch()[返回指出... ]

+0

謝謝你的清楚和重點答案。 –

1

在這個問題中,你聲明常量void * VERTEX_NO_CONSTANT_PARAMETER。該聲明在常量內存中保留sizeof(void *)。這個4/8字節由CUDA驅動程序在CUDA模塊加載時分配,當CUDA模塊卸載時釋放。

如果您在主機代碼中調用cudaMalloc,並使用cudaMemcpyToSymbol將設備指針複製到VERTEX_NO_CONSTANT_PARAMETER,那麼在程序使用設備內存完成後,您仍然有責任使用cudaFree釋放設備內存。如果你沒有釋放內存,當CUDA上下文被銷燬時,驅動程序將釋放內存。

CUDA不提供API來動態分配常量內存。常量內存只能使用__constant__限定符進行靜態分配。

相關問題