matlab下用cuda,内存分配失败

我自己写的cuda程序,用nvmex编译,在matlab下跑。程序单次运行占的显存大概是100mb多一点,但是我在matlab下只能运行一次,然后就提示内存分配失败,不知道是什么原因。每次申请的显存用完之后我都cudaFree了的。求问一下有谁遇到过类似的情况,或者知道怎么解决的帮忙解答一下,先谢过啦。

楼主您好。

抱歉不懂matlab和mex. 建议其他版主/会员为您提供建议。

感谢您的来访。

既然提示内存分配失败,那么请LZ检查下相关的分配问题。MEX似乎有自己的分配命令。
不过因为不使用matlab,所以无法给出进一步的建议。

请其他版主/网友补充。

祝您编码愉快。

cuda还可以加速matlab!?不错啊,想学!

您可以前往Math Works公司网站寻找相关介绍内容。

欢迎莅临cudazone,祝您愉快!

LZ发下.cu的代码看看,没有代码不好做判断。

我初步判断可能是因为我数据有问题,然后导致显存不够,所以申请失败。不过我不确定,是否只有显存不够的时候才会出现申请内存失败,还有其他的原因会造成申请失败么?

cuda确实很强大!

额,我可能没说清楚,我说的是显存分配失败,不过我现在觉得问题应该在我的数据上。

100MB左右的数据量对于大多数显卡都是没问题的,现在显卡显存动辄上GB。

似乎MEX分配显存也有自己的函数,以前好像有个帖子提到过,LZ不妨搜搜看。(当然也不排除我记错)

欢迎再次光临cudazone,祝您编码愉快。

一个关于MATLAB+CUDA的帖子
http://cudazone.nvidia.cn/forum/forum.php?mod=viewthread&tid=5652&extra=page%3D2&page=1

我对NVMEX不是很了解,据我所知,MEX实际上就是写一个动态链接库,而.cu文件的编译器还是nvcc。如果内存分配函数返回失败信息,应该是显存用完了。

您可以通过在分配显存的地方添加验证语句查证是否确实是内存申请失败,下面是一个例子。
cudaError_t cudaError;
cudaError=cudaMalloc ((void **)&A, ND*NN * sizeof(A[0]));
if (cudaError != cudaSuccess) { mexErrMsgTxt(“Out of Nvidia device memory.”); }

如果确实返回失败信息,那么您可以简单地通过gpu-z来查看显存的使用情况,看是否已经用满。

补充一点,内存分配失败还可能有这样的情况,如果你用的是Vista及以上的Windows产品,并且用的显卡模式为WDDM,不是Tesla卡专有的TCC:
The maximum size of a single memory allocation created by cudaMalloc or cuMemAlloc on WDDM devices is limited to:
MIN ( ( System Memory Size in MB - 512 MB ) / 2, PAGING_BUFFER_SEGMENT_SIZE )
For Vista, PAGING_BUFFER_SEGMENT_SIZE is approximately 2GB.
不过从你的描述来看如果每次只是分配100MB,应该不会有这样的问题。
参考链接:https://devtalk.nvidia.com/default/topic/415738/cuda-programming-and-performance/cudamalloc-is-returning-cudaerrormemoryallocation-what-could-be-the-reasons-/

嗯,问题已经解决了,程序跑起来没错了,不过具体是怎么回事还是不是很清楚。 不过貌似用matlab跑nvmex编译出来的cuda程序,在matlab关掉之前不会自动释放显存,这可能是后面申请显存出错的原因。

不能手工释放么?

我程序最后都cudaFree了的。不过貌似如果计算过程中出错,cuda的程序非正常结束,返回到matlab之后是不会自动释放的。。。