【问题标题】:cudaMalloc fails when Computer memory is used使用计算机内存时 cudaMalloc 失败
【发布时间】:2012-01-29 02:56:30
【问题描述】:

cudaMalloc 分配失败是否可能是因为没有可用的计算机内存?
虽然 GPU 内存可用,但当 RAM(计算机内存)已满时,cudaMalloc 会失败。
我的代码可以总结为以下示例代码:

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

【问题讨论】:

  • 可能 cudaMalloc 也需要一些主机内存才能完成。

标签: c++ memory malloc cuda


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2019-02-26
    • 2012-11-30
    • 2012-01-27
    • 1970-01-01
    • 1970-01-01
    • 2021-11-05
    • 1970-01-01
    • 1970-01-01
    • 2015-09-03
    相关资源
    最近更新 更多