cudaFree和cudaFreeHost无法释放堆分配的内存

cudaFree and cudaFreeHost fails to free heap allocated memory

本文关键字:分配 内存 释放 cudaFreeHost cudaFree      更新时间:2023-10-16

我写了一个类,在这个类中,堆中的构造函数内存是用cudaMallocHost((和cudaMallock((分配的。

如果我试图释放内存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;
}

错误是由您调用cudaDeviceReset()引起的。查看其文档:

显式销毁和清理与当前进程中的当前设备。此的任何后续API调用设备将重新初始化设备。

请注意,此功能将立即重置设备。它是呼叫者有责任确保设备不会当该函数被调用。

请注意,您的对象将在调用后被销毁。当你重置设备时,它将无法释放内存(这是在析构函数内部完成的(。

一种解决方案是使用newdelete在堆上分配对象,因此您可以在调用cudaDeviceReset()之前delete您的free1对象。