Gre*_*ack 9 optimization matlab
通过将矩阵分配到更大的分配内存中,matlab 会在“复制”它时以某种方式复制它,如果要复制的矩阵足够大,则会出现内存溢出。这是示例代码:
main_mat=zeros(500,500,2000);
n=500;
slice_matrix=zeros(500,500,n);
for k=1:4
parfor i=1:n
slice_matrix(:,:,i)=gather(gpuArray(rand(500,500)));
end
main_mat(:,:,1+(k-1)*n:1+(k-1)*n+n-1)=slice_matrix; %This is where the memory will likely overflow
end
Run Code Online (Sandbox Code Playgroud)
有什么方法可以slice_matrix
在main_mat
没有开销的情况下“粉碎” ?提前致谢。
编辑:
main_mat
预先分配时发生溢出。如果main_mat
用main_mat=zeros(500,500,1);
(较小的尺寸)初始化,则不会发生溢出,但由于在将矩阵分配给它之前没有完成分配,它会减慢速度。随着范围的k
增加,这将显着降低性能。
删除parfor
可能会解决您的问题。
parfor
在那里没有用。MATLABparfor
不使用共享内存并行性(即它不启动新线程),而是使用分布式内存并行性(它启动新进程)。它旨在将工作分配到一组或工作节点上。尽管它也可以在一个节点(或一台台式计算机)内工作以将工作分配到多个内核上,但这并不是在一个节点内实现并行性的最佳方式。
这意味着每个由 启动的进程都parfor
需要有自己的 副本slice_matrix
,这就是程序使用大量内存的原因。
请参阅MATLAB 文档中的“决定何时使用parfor
”parfor
以了解有关它以及何时使用它的更多信息。
归档时间: |
|
查看次数: |
275 次 |
最近记录: |