从主机分配在设备上的可用内存

时间:2012-09-29 20:18:37

标签: c++ cuda

从主机功能释放设备分配的内存是否有效? 我正在编写一些应该在主机和设备上使用的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开发者论文中。

2 个答案:

答案 0 :(得分:2)

对于CUDA 4.2和CUDA 5.0 RC,CUDA C程序员指南在B.17节中提到:“通过malloc()分配的内存不能使用运行时释放(即通过调用任何内容) 来自设备存储器的可用存储器功能)。 “(此特定文本取自CUDA 5.0 RC文档。在原始文档中,设备内存是指向3.2.2节的超链接)可以找到CUDA 4.2文档here(它有类似的措辞。)我我想知道是否:1。)事情实际上是按照你的思维方式发生的。根据你在内核代码中如何分配变量,我认为它可能会在内核完成时超出范围,这会隐含地调用你的(设备) -)析构函数.2)用无效指针调用cudaFree(也许是因为它是一个设备指针,或者因为它已经被释放)只是被忽略了。没有你的代码可以玩,这只是猜测。但是如果你正在检查错误而没有得到错误,那么它可能会被忽略。

答案 1 :(得分:0)

除非NVIDIA最近解除了这个限制,否则你必须通过调用in-kernel free()来通过内核malloc()释放内存。即你不能调用cudaFree()来释放内核中使用malloc()分配的内存。

它可能没有返回错误,但它也可能泄漏了内存。