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
答案 0 :(得分:0)
你在每次迭代中释放GPU内存,这样就永远不会满了。当RAM变满时,操作系统将您的硬盘用作虚拟内存,因此代码将减慢,但它将继续在主机端分配内存。也许CUDA将指针保存在主机内存上的设备内存中,这可能会在RAM填满时引起问题。
检查这个的一个简单方法是放置一个计数器,看看错误来自哪个迭代。然后首先在GPU上单独运行程序分配内存,然后单独在CPU上分配内存,如果两种情况下计数器都增加,那么我的假设是正确的。