2015-09-24 35 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