Ao atribuir uma matriz a uma memória alocada muito maior, o matlab de alguma forma a duplicará enquanto a 'copia' e, se a matriz a ser copiada for grande o suficiente, haverá excesso de memória. Este é o código de exemplo:
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
Alguma maneira de simplesmente 'esmagar' o slice_matrixpara o main_matsem a sobrecarga? Desde já, obrigado.
EDITAR:
O estouro ocorreu quando main_maté alocado previamente. Se main_matfor inicializado com main_mat=zeros(500,500,1);(tamanho menor), o estouro não ocorrerá, mas diminuirá a velocidade, pois a alocação não é feita antes que a matriz seja atribuída a ela. Isso reduzirá significativamente o desempenho conforme o intervalo de kaumentos.
memoryfunção? O gerente de tarefas? Um erro de memória do Matlab? Em que linha de código está acontecendo?
main_mat(:,:,1+(k-1)*n:1+(k-1)*n+n-1)é onde ocorre o problema de estouro de memória. É verificado quando eu aloquei o main_matantemão, ele irá estourar, se não o fizer, não. O Matlab retornará 'erro de falta de memória'.
h=h+slice_matrix(end)antes de main_mat(:,:,1+(k-1)*n:1+(k-1)*n+n-1)=slice_matrix;(e inicializar h com 0)? Suspeito que esta nova linha adicionada já cause problemas de memória.
parforloop para fins de otimização . Além disso,parforcopia seus dados para cada trabalhador separado, supondo que 4 trabalhadores dupliquem seus dados quatro vezes na RAM.