【发布时间】:2016-07-26 23:25:43
【问题描述】:
从主机函数中释放设备分配的内存是否有效? 我正在编写一些应该在主机和设备上使用的 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 开发者论文中。
【问题讨论】:
-
我认为你的情况倒退了。如果定义了
__CUDA_ARCH__,那么您不想使用cuda函数吗? -
如果定义了
__CUDA_ARCH__,则为设备编译代码。在设备上,我必须使用malloc和free。只有在主机上,需要使用cudaMalloc和cudaFree -
只要 malloc 和 cudaMalloc 和 free 和 cudaFree 在同一个堆上运行,我认为就可以了。
-
是什么让你认为你已经在设备上创建了一个类,然后在主机上释放了它? CUDA C programming guide v4.2 声明:“通过 malloc() 分配的内存不能使用运行时释放(即通过调用第 3.2.2 节中的任何空闲内存函数)。”在 B.17 节中,它是针对设备分配的内存(在设备堆上)进行的。
-
另外,如果您认为在特定的 cudaFree 调用中没有收到错误,您可能应该在该 cudaFree 调用之后明确检查 cuda 错误。也许你是,但我没有在你发布的示例代码中看到它。