【问题标题】:free memory allocated on device from host从主机分配到设备上的空闲内存
【发布时间】: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__,则为设备编译代码。在设备上,我必须使用mallocfree。只有在主机上,需要使用cudaMalloccudaFree
  • 只要 malloc 和 cudaMalloc 和 free 和 cudaFree 在同一个堆上运行,我认为就可以了。
  • 是什么让你认为你已经在设备上创建了一个类,然后在主机上释放了它? CUDA C programming guide v4.2 声明:“通过 malloc() 分配的内存不能使用运行时释放(即通过调用第 3.2.2 节中的任何空闲内存函数)。”在 B.17 节中,它是针对设备分配的内存(在设备堆上)进行的。
  • 另外,如果您认为在特定的 cudaFree 调用中没有收到错误,您可能应该在该 cudaFree 调用之后明确检查 cuda 错误。也许你是,但我没有在你发布的示例代码中看到它。

标签: c++ cuda


【解决方案1】:

对于 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(可能是因为它是一个设备指针,或者可能是因为它已经被释放)会被忽略。没有你的代码可玩,这一切都只是猜测。但如果您正在检查错误但没有得到一个,那么它可能会被忽略。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2014-11-24
      • 2011-07-13
      • 1970-01-01
      • 2010-12-16
      • 2018-10-09
      • 1970-01-01
      • 2015-03-21
      • 1970-01-01
      • 2021-07-22
      相关资源
      最近更新 更多