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_matrixsobre main_matsin la sobrecarga? Gracias por adelantado.
EDITAR:
El desbordamiento se produjo cuando main_matse asigna de antemano. Si main_matse 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 kaumenta el rango de aumento.
memoryfunció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_matantemano, 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.
parforbucle para fines de optimización . Además,parforcopia sus datos a cada trabajador por separado, suponiendo que 4 trabajadores dupliquen sus datos cuatro veces en RAM.