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_matrix
para o main_mat
sem a sobrecarga? Desde já, obrigado.
EDITAR:
O estouro ocorreu quando main_mat
é alocado previamente. Se main_mat
for 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 k
aumentos.
memory
funçã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_mat
antemã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.
parfor
loop para fins de otimização . Além disso,parfor
copia seus dados para cada trabalhador separado, supondo que 4 trabalhadores dupliquem seus dados quatro vezes na RAM.