Al asignar una matriz a una memoria asignada mucho más grande, matlab de alguna manera la duplicará mientras la 'copia', y si la matriz que se va a copiar es lo suficientemente grande, habrá un desbordamiento de memoria. Este es el código de muestra:
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
¿Alguna forma de simplemente 'aplastar' el slice_matrix
sobre main_mat
sin la sobrecarga? Gracias por adelantado.
EDITAR:
El desbordamiento se produjo cuando main_mat
se asigna de antemano. Si main_mat
se inicializa con main_mat=zeros(500,500,1);
(tamaño más pequeño), el desbordamiento no ocurrirá, pero se ralentizará ya que la asignación no se realiza antes de que se asigne la matriz. Esto reducirá significativamente el rendimiento a medida que k
aumenta el rango de aumento.
memory
función? El administrador de tareas? ¿Un error de memoria de Matlab? ¿En qué línea de código está sucediendo?
main_mat(:,:,1+(k-1)*n:1+(k-1)*n+n-1)
es donde ocurre el problema de desbordamiento de memoria. Se verifica cuando asigné de main_mat
antemano, se desbordará, si no lo hago, no lo hará. Matlab devolverá 'error de falta de memoria'.
h=h+slice_matrix(end)
antes de main_mat(:,:,1+(k-1)*n:1+(k-1)*n+n-1)=slice_matrix;
(e inicializar h con 0)? Sospecho que esta línea recién agregada ya causará problemas de memoria.
parfor
bucle para fines de optimización . Además,parfor
copia sus datos a cada trabajador por separado, suponiendo que 4 trabajadores dupliquen sus datos cuatro veces en RAM.