【发布时间】:2023-04-03 00:10:02
【问题描述】:
通过将矩阵分配到更大的分配内存中,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 范围的增加,这将显着降低性能。
【问题讨论】:
-
至于你的循环:it's recommended to set the outer loop to a
parforloop for optimisation purposes。此外,parfor将您的数据复制到每个单独的工作人员,因此假设有 4 个工作人员,它会将您的数据在 RAM 中复制四次。 -
你有什么迹象表明Matlab实际上是在复制内存?你在使用
memory函数吗?任务管理器? Matlab的内存错误?它发生在哪一行代码? -
如您所见,我在代码中注释的位置,
main_mat(:,:,1+(k-1)*n:1+(k-1)*n+n-1)是发生内存溢出问题的位置。当我预先分配main_mat时验证过,它会溢出,如果我不这样做,它就不会。 Matlab 将返回“内存不足错误”。 -
您的 500x500x2000 矩阵是否适合内存?它约为 4 Gb。请参阅stackoverflow.com/q/51987892/7328782,了解为什么只有在写入数组时才会发生内存不足错误。
-
为了更好地理解您的问题,您能否在
main_mat(:,:,1+(k-1)*n:1+(k-1)*n+n-1)=slice_matrix;之前插入h=h+slice_matrix(end)(并将h 初始化为0)?我怀疑这条新添加的行已经导致您的内存问题。
标签: matlab optimization