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_mat
ohne Overhead auf das zu ? Danke im Voraus.
BEARBEITEN:
Der Überlauf trat auf, wenn er main_mat
vorher zugewiesen wurde. Wenn main_mat
mit 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 k
zunimmt.
memory
Funktion? 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_mat
zuvor 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.
parfor
Optimierungszwecken auf eine Schleife zu setzen . Kopiertparfor
Ihre Daten außerdem auf jeden einzelnen Worker. Unter der Annahme, dass 4 Worker Ihre Daten viermal im RAM duplizieren.