2015-09-24 39 views
1

我已經寫了一個類,在堆中的構造函數內存分配與cudaMallocHost()和cudaMalloc()。cudaFree和cudaFreeHost無法釋放堆分配的內存

如果我嘗試免費存儲器cudaFree()或cudaFreeHost(),GPUassert抱怨:

GPUassert:無效裝置指針../src/main.cu 97

GPUassert:無效的參數../src/main.cu 95

我在具有計算能力2.1的設備上使用CUDA TK 7.0。

我想我錯過了一些基本的東西。 我可以創建在設備上分配內存的對象嗎?

class FreeMe { 

public: 
    FreeMe(int size); 
    ~FreeMe(void); 

private: 
    float *A, *dA; 
    int size; 
}; 

FreeMe::FreeMe(int size) : 
     size(size) { 
    gpuErrchk(cudaMallocHost((void**) &A, sizeof(float) * size)); 
    gpuErrchk(cudaMalloc((void**) &dA, sizeof(float) * size)); 
} 
FreeMe::~FreeMe(void) { 
    std::cout << "FreeMe obj deleted: Free ..." << std::endl; 
    gpuErrchk(cudaFreeHost(A)); 
    gpuErrchk(cudaFree(dA)); 
} 

int main(int argc, char **argv) { 
    int size = 3; 

    FreeMe free1(size); 

    cudaDeviceReset(); 
    std::cout << "Program terminated successfully." << std::endl; 
    return EXIT_SUCCESS; 
} 
+0

我不確定,但也許你需要首先初始化CUDA。 – Unick

+4

也看起來像cudaFreeHost之後調用cudaDeviceReset。 – Unick

回答

4

錯誤是由您致電cudaDeviceReset()引起的。縱觀its documentation

明確破壞並清除在當前進程 當前設備相關聯的所有資源。對此 設備的任何後續API調用都將重新初始化設備。

請注意,此功能會立即重置設備。當調用該函數 時,主叫方有責任確保該設備不是被該進程中的任何其他主機線程訪問的 。

請注意,您的對象將被銷燬之後表示調用。當你重置你的設備時,它將無法釋放內存(這是在析構函數內完成的)。

一個解決辦法是分配使用newdelete堆的對象,所以你可以前調用cudaDeviceReset()deletefree1對象

+0

非常感謝,完全沒有注意範圍。 – w0rldeat3r

+0

不客氣! – syntagma