PKUFlyingPig / CMU10-714

Learning material for CMU10-714: Deep Learning System
214 stars 34 forks source link

关于hw4中显存的释放 #2

Open Billccx opened 7 months ago

Billccx commented 7 months ago

您好! 我阅读了ndarray_backend_cuda.cu中关于CudaArray的实现

struct CudaArray {
  CudaArray(const size_t size) {
    cudaError_t err = cudaMalloc(&ptr, size * ELEM_SIZE);
    if (err != cudaSuccess) throw std::runtime_error(cudaGetErrorString(err));
    this->size = size;
  }
  ~CudaArray() { cudaFree(ptr); }
  size_t ptr_as_int() { return (size_t)ptr; }

  scalar_t* ptr;
  size_t size;
};

CudaArray类在其析构函数中释放显存。那么请问CudaArray类的析构是如何触发的呢?我好像没有在代码中看到有关delete的操作,希望您能指点一下,谢谢!

PKUFlyingPig commented 7 months ago

C++中的变量在离开其作用域之后会自动触发析构函数,这是编译器保证的。请善用谷歌搜索。

-----原始邮件----- 发件人:"Chenxi Cui" @.> 发送时间:2024-03-20 23:10:12 (星期三) 收件人: PKUFlyingPig/CMU10-714 @.> 抄送: Subscribed @.***> 主题: [PKUFlyingPig/CMU10-714] 关于hw4中显存的释放 (Issue #2)

您好! 我阅读了ndarray_backend_cuda.cu中关于CudaArray的实现

struct CudaArray { CudaArray(const size_t size) { cudaError_t err = cudaMalloc(&ptr, size * ELEM_SIZE); if (err != cudaSuccess) throw std::runtime_error(cudaGetErrorString(err)); this->size = size; } ~CudaArray() { cudaFree(ptr); } size_t ptr_as_int() { return (size_t)ptr; }

scalar_t* ptr; size_t size; };

CudaArray类在其析构函数中释放显存。那么请问CudaArray类的析构是如何触发的呢?我好像没有在代码中看到有关delete的操作,希望您能指点一下,谢谢!

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you are subscribed to this thread.Message ID: @.***>

Billccx commented 7 months ago

C++中的变量在离开其作用域之后会自动触发析构函数,这是编译器保证的。请善用谷歌搜索。 -----原始邮件----- 发件人:"Chenxi Cui" @.> 发送时间:2024-03-20 23:10:12 (星期三) 收件人: PKUFlyingPig/CMU10-714 @.> 抄送: Subscribed @.> 主题: [PKUFlyingPig/CMU10-714] 关于hw4中显存的释放 (Issue #2) 您好! 我阅读了ndarray_backend_cuda.cu中关于CudaArray的实现 struct CudaArray { CudaArray(const size_t size) { cudaError_t err = cudaMalloc(&ptr, size ELEM_SIZE); if (err != cudaSuccess) throw std::runtime_error(cudaGetErrorString(err)); this->size = size; } ~CudaArray() { cudaFree(ptr); } size_t ptr_as_int() { return (size_t)ptr; } scalar_t ptr; size_t size; }; CudaArray类在其析构函数中释放显存。那么请问CudaArray类的析构是如何触发的呢?我好像没有在代码中看到有关delete的操作,希望您能指点一下,谢谢! — Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you are subscribed to this thread.Message ID: @.>

是的,感谢您的回复。

很抱歉我没有把问题表述清楚。您的意思是,CudaArray都是以局部变量的形式存放在栈区的么?

我之前看过一个非常类似的项目,那个项目中,gpu上的显存的申请和释放的时机与python侧tensor的生命周期紧密关联,因此那个项目在python侧tensor类的del方法中实现了释放gpu显存的逻辑,即通过ctypes调用了一个包含cudaFree的函数。配合python的垃圾回收机制,可以实现显存的自动释放。

不知道在hw4中是否也有类似的逻辑呢?谢谢

luansh01 commented 2 months ago

CudaArray绑定的python对象的_del_方法好像会执行CudaArray析构函数来释放内存。