通过将矩阵分配到更大的已分配内存中,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
slice_matrix
有main_mat
没有什么方法可以将其“粉碎” 到没有开销的地方?提前致谢。
编辑:
main_mat
事先分配时发生溢出。如果main_mat
使用main_mat=zeros(500,500,1);
(较小的尺寸)初始化,则不会发生溢出,但是由于在分配矩阵之前未进行分配,因此溢出会变慢。随着范围的k
增加,这将大大降低性能。
main_mat(:,:,1+(k-1)*n:1+(k-1)*n+n-1)
是发生内存溢出问题的地方。当我main_mat
预先分配它时,它会被验证,如果不分配,它将溢出。Matlab将返回“内存不足错误”。
h=h+slice_matrix(end)
before main_mat(:,:,1+(k-1)*n:1+(k-1)*n+n-1)=slice_matrix;
(并用0初始化h)吗?我怀疑这条新添加的行将已经引起您的内存问题。
parfor
循环。此外,parfor
将您的数据复制到每个单独的工作程序中,因此假设有4个工作程序将数据复制到RAM中四次。