GPU代码运行2-3小时后cudaMalloc分配内存失败有什么原因吗?
我正在使用“Process Explorer”程序来检查全局内存使用情况。尽管 GPU 上的可用全局内存仍然可用,但 cudaMalloc 突然无法分配。
如何查看失败的主要原因?我正在这样做:
if ( cudaSuccess !=cudaMalloc((void **) &arr, sizeof(int)*100))
printf("Cannot Allocate Mem");
有没有更好的方法来打印cuda中失败的实际原因?
您可以执行以下操作:
cudaError_t err= cudaMalloc((void **) &arr, sizeof(int)*100);
if(err != cudaSuccess){
printf("The error is %s", cudaGetErrorString(err));
}
这将打印错误的确切原因。例如。无效的设备指针意味着您正在访问一个不指向任何内容的指针。
将
cudaMalloc
的输出与状态变量 cudaSuccess
进行比较。对于一个最小的工作示例,请参阅下面,请记住环保并释放空间!
// nvcc device_query.cu -o device_query; ./device_query
#include <stdio.h>
int main() {
int *arr;
cudaError_t err= cudaMalloc((void **) &arr, sizeof(int)*1024*1024*1024*10);
if(err != cudaSuccess){
printf("The error is %s", cudaGetErrorString(err));
}
cudaFree( arr );
}
由于故意过度分配,这给出了
root@38c6fcde90a4:/home/zkp/cuZK/test# nvcc device_query.cu -o device_query; ./device_query
The error is out of memory
这个示例本质上是一本伟大的书“CUDA by Example”中的一个配方,其中包含 GitHub 上的示例。