2012-09-29 69 views
2

從主機功能釋放設備分配的內存有效嗎? 我在寫一些應該在主機和設備上使用的C++類。我的構造函數和析構函數是這樣的:在主機設備上分配的空閒內存

class myClass { 
public: 
__host__ __device__ myClass() { 
#if defined(__CUDA_ARCH__) 
    data = (char*)malloc(DATA_SIZE); 
#else 
    cudaMalloc(&data,DATA_SIZE); 
#endif 
} 

__host__ __device__ ~myClass() { 
#if defined(__CUDA_ARCH__) 
    free(data); 
#else 
    cudaFree(data); 
#endif 
} 

private: 
    char* data; 
} 

上面的代碼編譯,如果我的設備和自由它的主機上建立一個一流的,我沒有得到一個錯誤。但是這種情況在CUDA開發人員論文中沒有記錄。

+0

我認爲你有你的情況倒退。如果定義了__CUDA_ARCH__,那麼你不想使用'cuda'函數嗎? –

+1

如果定義了__CUDA_ARCH__,則會爲設備編譯代碼。在設備上,我必須使用'malloc'和'free'。只有在主機上,需要使用'cudaMalloc'和'cudaFree' –

+0

只要malloc和cudaMalloc以及free和cudaFree在同一堆上運行,我會認爲它會好的。 – grieve

回答

2

對於CUDA 4.2和CUDA 5.0 RC,CUDA C程序員指南在B.17節提到:「通過malloc()分配的內存不能使用運行時釋放(即通過調用任何空閒內存的 (這是從CUDA 5.0 RC文檔獲取的特殊文本,在原始文檔中,Device Memory是3.2.2節的超鏈接)CUDA 4.2文檔可以在here找到(它有類似的措詞)。我想知道是否:1.)事情實際上正在發生你的想法。根據你在內核代碼中如何分配變量,我認爲它可能會在內核完成時超出範圍,這會隱式調用你的(設備端)析構函數。 2.)使用無效指針調用cudaFree(可能是因爲它是一個設備指針,或者可能是因爲它已被釋放)而被忽略。沒有你的代碼玩,這只是猜測。但是如果你正在檢查錯誤而沒有得到錯誤,那麼它可能會被忽略。

0

除非NVIDIA最近解除了這個限制,否則必須通過in-kernel malloc()通過調用in-kernel free()來釋放內存。即不能調用cudaFree()來釋放內存中使用malloc()分配的內存。

它可能不會返回錯誤,但它也可能泄漏內存。