是否有可能cudaMalloc分配失败,因为没有空闲的计算机内存?
尽管GPU内存可用,cudaMalloc在RAM(计算机内存)满时失败。
我的代码可以总结为以下示例代码:
int main()
{
size_t N=sizeof(int)*100000000;
while(true)
{
int *d_a,*d_b;
if ( cudaSuccess !=cudaMalloc(&d_a, N)) printf("Error Allocating GPU Memory");
if ( cudaSuccess !=cudaMalloc(&d_b, N)) printf("Error Allocating GPU Memory");
cudaMemset(d_a,1,N);
cudaMemset(d_b,2,N);
int *h_a= (int *)malloc(N);
int *h_b=(int *)malloc(N);
if(!h_a || !h_b) printf("Error Allocating CPU Memory");
cudaMemcpy(d_a,h_a, N, cudaMemcpyHostToDevice);
cudaMemcpy(d_b,h_b, N, cudaMemcpyHostToDevice);
cudaFree(d_a);
cudaFree(d_b);
}
getch();
return 1;
}
以下代码仅在计算机内存已满时才无法分配GPU内存!我得到的错误是Error Allocating GPU Memory
而不是Error Allocating CPU Memory
你在每次迭代中释放GPU内存,所以它永远不会满。操作系统使用你的硬盘作为虚拟内存,当RAM满了,所以代码会变慢,但它会继续在主机端分配内存。也许CUDA将指针指向主机内存上的设备内存,这可能会在RAM填满时导致问题。
检查这一点的一个简单方法是放置一个计数器并查看在哪个迭代中出现错误。然后首先运行程序单独在GPU上分配内存,然后单独在CPU上分配内存,如果计数器在这两种情况下都增加,那么我的假设是正确的。