2012-09-29 29 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()分配的内存。

它可能不会返回错误,但它也可能泄漏内存。