Durch Zuweisen einer Matrix zu einem viel größeren zugewiesenen Speicher dupliziert matlab sie irgendwie, während sie "kopiert" wird. Wenn die zu kopierende Matrix groß genug ist, kommt es zu einem Speicherüberlauf. Dies ist der Beispielcode:
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
Jeder Weg, um nur die zu "zerschlagen" slice_matrix das main_matohne Overhead auf das zu ? Danke im Voraus.
BEARBEITEN:
Der Überlauf trat auf, wenn er main_matvorher zugewiesen wurde. Wenn main_matmit main_mat=zeros(500,500,1);(kleinere Größe) initialisiert wird , tritt der Überlauf nicht auf, er verlangsamt sich jedoch, da die Zuordnung nicht erfolgt, bevor die Matrix zugewiesen wird. Dies verringert die Leistung erheblich, wenn der Bereich kzunimmt.
memoryFunktion? Der Task-Manager? Ein Speicherfehler von Matlab? In welcher Codezeile passiert es?
main_mat(:,:,1+(k-1)*n:1+(k-1)*n+n-1)das Problem des Speicherüberlaufs auf. Es wird überprüft, wenn ich das main_matzuvor zugewiesen habe . Es läuft über, wenn ich es nicht tue, wird es nicht überlaufen. Matlab gibt den Fehler "Nicht genügend Speicher" zurück.
h=h+slice_matrix(end)Vorher einfügen main_mat(:,:,1+(k-1)*n:1+(k-1)*n+n-1)=slice_matrix;(und h mit 0 initialisieren)? Ich vermute, dass diese neu hinzugefügte Zeile bereits Speicherprobleme verursacht.
parforOptimierungszwecken auf eine Schleife zu setzen . KopiertparforIhre Daten außerdem auf jeden einzelnen Worker. Unter der Annahme, dass 4 Worker Ihre Daten viermal im RAM duplizieren.