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 开发者论文中。

4

2 回答 2

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 文档(它有类似的措辞。)我想知道: 1.)事情实际上是按照你想象的方式发生的。根据您在内核代码中分配变量的方式,我认为它可能会在内核完成时超出范围,这将隐式调用您的(设备端)析构函数。2.) 使用无效指针调用 cudaFree(可能是因为它是一个设备指针,或者可能是因为它已经被释放)会被忽略。没有你的代码可以玩,这一切都只是猜测。但是,如果您正在检查错误但没有得到错误,那么它可能会被忽略。

于 2012-09-29T23:53:42.630 回答
0

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

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

于 2012-09-29T23:30:59.727 回答