使用计算机内存时,cudaMalloc失败

时间:2011-12-28 11:13:00

标签: c++ memory malloc cuda

cudaMalloc是否有可能无法分配,因为没有免费的计算机内存? 虽然GPU内存可用,但当RAM(计算机内存)已满时,cudaMalloc会失败 我的代码可以在以下示例代码中进行sumamrized:

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

1 个答案:

答案 0 :(得分:0)

你在每次迭代中释放GPU内存,这样就永远不会满了。当RAM变满时,操作系统将您的硬盘用作虚拟内存,因此代码将减慢,但它将继续在主机端分配内存。也许CUDA将指针保存在主机内存上的设备内存中,这可能会在RAM填满时引起问题。

检查这个的一个简单方法是放置一个计数器,看看错误来自哪个迭代。然后首先在GPU上单独运行程序分配内存,然后单独在CPU上分配内存,如果两种情况下计数器都增加,那么我的假设是正确的。