一旦cudaMalloc返回内存不足,每个cuda API调用都会返回失败

dex*_*tol 0 c++ memory cuda

使用CUDA,是否可以像垃圾收集一样使用?

例如,当我收到内存不足错误时cudaMalloc(...),是否可以释放先前分配的数据并重试分配内存?

一旦cudaMalloc(...)返回内存不足,以下cuda调用似乎在此之后返回内存不足.即使我用之前分配的有效设备指针调用cudaFree,cudaFree也会返回内存不足...

cudaDeviceReset() 对我的案子来说,恢复状态不是一个好方法.

Avi*_*urg 5

一旦CUDA遇到错误,所有API调用都将返回该错误.如果错误破坏了CUDA上下文,除了重置设备(cudaDeviceReset)之外没什么可做的.如果CUDA上下文没有被破坏,那么状态可以被重置cudaSuccess调用cudaGetLastError().

根据Robert Crovella的评论,失败cudaMalloc可能不会破坏CUDA环境,因此你应该能够恢复.这不一定适用于错误的其他原因,并且每种情况可能不同.

  • 对于这个问题,这可能是正确的.但是,CUDA运行时API错误有两种:非粘性错误(CUDA上下文仍然可用)和粘性错误(CUDA上下文已损坏).我会说"状态可以被重置(*用于非粘性错误*)到..."我认为由于内存不足导致的`cudaMalloc`失败应该是非粘性的(即不破坏CUDA上下文)错误. (2认同)