关于CUDA分配内存的问题

  • 7 replies
  • 161 views
关于CUDA分配内存的问题
« 于: 八月 09, 2019, 05:00:01 pm »
各位[名词2]好,小白最近刚学习用CUDA,然后在用cudamalloc()分配内存的时候,我发现当我分配的大小大于一定值的时候,就会出现内存分配失败的情况。我的显卡是GTX1060,6G内存,我查询GPU内存应该是有6144Mbytes,即6442450944bytes,但是当我设定具体如下:
cudaError_t err;
   err = cudaMalloc((void **)&cuc, height*height*sizeof(double));
   if( err != cudaSuccess)
   {
       printf("CUDA error: %s\n", cudaGetErrorString(err));
   }
我本来是设定height=21600,即总共才466560000bytes,1个double是1bytes吧?为什么才这么点就会超出内存呢?
请各位前辈指教

Re: 关于CUDA分配内存的问题
« 回复 #1 于: 八月 09, 2019, 05:11:12 pm »
各位[名词2]好,小白最近刚学习用CUDA,然后在用cudamalloc()分配内存的时候,我发现当我分配的大小大于一定值的时候,就会出现内存分配失败的情况。我的显卡是GTX1060,6G内存,我查询GPU内存应该是有6144Mbytes,即6442450944bytes,但是当我设定具体如下:
cudaError_t err;
   err = cudaMalloc((void **)&cuc, height*height*sizeof(double));
   if( err != cudaSuccess)
   {
       printf("CUDA error: %s\n", cudaGetErrorString(err));
   }
我本来是设定height=21600,即总共才466560000bytes,1个double是1bytes吧?为什么才这么点就会超出内存呢?
请各位前辈指教

一个double是8B,一个float是4B的。而不是1B。

注意尽量使用64-bit编译,以及,有的时候你不能一次性分配到所有的显存(但是你可以分配多次)。

Re: 关于CUDA分配内存的问题
« 回复 #2 于: 八月 09, 2019, 05:17:44 pm »
一个double是8B,一个float是4B的。而不是1B。

注意尽量使用64-bit编译,以及,有的时候你不能一次性分配到所有的显存(但是你可以分配多次)。
感谢您的回复,我是把bits和bytes搞混了嘛,我以为1double是8位,即8bits就是1字节,就是1bytes了。
我是在VS2010,X64环境下编译的,应该没有问题。
那么按照您的说法,我就算乘上8,这个也不会超出我内存啊,也就占据一半的样子。
您所说的可以多次分配,就是我可以对于同一个数组指针,分成前后几个语句多次分配的意思嘛?

Re: 关于CUDA分配内存的问题
« 回复 #3 于: 八月 09, 2019, 05:39:53 pm »
感谢您的回复,我是把bits和bytes搞混了嘛,我以为1double是8位,即8bits就是1字节,就是1bytes了。
我是在VS2010,X64环境下编译的,应该没有问题。
那么按照您的说法,我就算乘上8,这个也不会超出我内存啊,也就占据一半的样子。
您所说的可以多次分配,就是我可以对于同一个数组指针,分成前后几个语句多次分配的意思嘛?

就是说,如果你确定你的当前显存可用XX GB,例如5GB好像(见下一段),但是你可能无法直接一次性的分配到(连续的)5GB,但是如果你改成分配2GB,再分配3GB,却可能成功的这么一种现象。

具体查看当前可用显存,可以调用:
size_t available, total;
cudaMemGetInfo(&available, &total);
然后检查available的值。

Re: 关于CUDA分配内存的问题
« 回复 #4 于: 八月 09, 2019, 05:54:24 pm »
就是说,如果你确定你的当前显存可用XX GB,例如5GB好像(见下一段),但是你可能无法直接一次性的分配到(连续的)5GB,但是如果你改成分配2GB,再分配3GB,却可能成功的这么一种现象。

具体查看当前可用显存,可以调用:
size_t available, total;
cudaMemGetInfo(&available, &total);
然后检查available的值。
再次感谢您的回复,我试着自己去尝试一下是否可行

Re: 关于CUDA分配内存的问题
« 回复 #5 于: 八月 10, 2019, 04:35:28 pm »
就是说,如果你确定你的当前显存可用XX GB,例如5GB好像(见下一段),但是你可能无法直接一次性的分配到(连续的)5GB,但是如果你改成分配2GB,再分配3GB,却可能成功的这么一种现象。

具体查看当前可用显存,可以调用:
size_t available, total;
cudaMemGetInfo(&available, &total);
然后检查available的值。
[名词2],还是不好意思打扰您一下,我尝试了查看可用内存,发现我5G的内存左右,所以很显然并不是内存不够的原因,然后您说的通过多次分配,我不太理解,是我要设定多个参数分配之后再整合的意思嘛?能否贴一下简单的代码?谢谢!

Re: 关于CUDA分配内存的问题
« 回复 #6 于: 八月 12, 2019, 04:51:46 pm »
[名词2],还是不好意思打扰您一下,我尝试了查看可用内存,发现我5G的内存左右,所以很显然并不是内存不够的原因,然后您说的通过多次分配,我不太理解,是我要设定多个参数分配之后再整合的意思嘛?能否贴一下简单的代码?谢谢!

我不认为中文:“你发现当前可用....GB, 但是你无法一次性的分配到.....GB, 可以通过多次分配使用“有什么无法理解的。原谅我不能用俄语为你解释。

Re: 关于CUDA分配内存的问题
« 回复 #7 于: 八月 12, 2019, 04:54:19 pm »
我不认为中文:“你发现当前可用....GB, 但是你无法一次性的分配到.....GB, 可以通过多次分配使用“有什么无法理解的。原谅我不能用俄语为你解释。

此外,为了防止你不小心犯错,也建议单独:
size_t bytes = sizeof(double) * height * height;

再看看bytes是不是你想要的值(常见错误)。