如何“复制”矩阵而不在内存中创建导致内存溢出的临时矩阵?

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_matrixmain_mat没有开销的情况下“粉碎” ?提前致谢。

编辑:

main_mat预先分配时发生溢出。如果main_matmain_mat=zeros(500,500,1);(较小的尺寸)初始化,则不会发生溢出,但由于在将矩阵分配给它之前没有完成分配,它会减慢速度。随着范围的k增加,这将显着降低性能。

Cri*_*ngo 1

删除parfor可能会解决您的问题。

parfor在那里没有用。MATLABparfor不使用共享内存并行性(即它不启动新线程),而是使用分布式内存并行性(它启动新进程)。它旨在将工作分配到一组或工作节点上。尽管它也可以在一个节点(或一台台式计算机)内工作以将工作分配到多个内核上,但这并不是在一个节点内实现并行性的最佳方式。

这意味着每个由 启动的进程都parfor需要有自己的 副本slice_matrix,这就是程序使用大量内存的原因。

请参阅MATLAB 文档中的“决定何时使用parforparfor以了解有关它以及何时使用它的更多信息。