Przypisując macierz do znacznie większej przydzielonej pamięci, Matlab w jakiś sposób powieli ją podczas „kopiowania”, a jeśli matryca do skopiowania jest wystarczająco duża, nastąpi przepełnienie pamięci. To jest przykładowy kod:
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
Każdy sposób, aby po prostu "rozbić zwanej dalej slice_matrix
na main_mat
bez obciążania? Z góry dziękuję.
EDYTOWAĆ:
Przepełnienie nastąpiło, gdy main_mat
zostało przydzielone wcześniej. Jeśli main_mat
zostanie zainicjowany za pomocą main_mat=zeros(500,500,1);
(mniejszy rozmiar), przepełnienie nie nastąpi, ale zostanie spowolnione, ponieważ alokacja nie zostanie wykonana przed przypisaniem do niej macierzy. Znacząco obniży to wydajność wraz ze k
wzrostem zakresu .
memory
funkcji? Menedżer zadań? Błąd pamięci Matlaba? Przy jakiej linii kodu to się dzieje?
main_mat(:,:,1+(k-1)*n:1+(k-1)*n+n-1)
występuje problem z przepełnieniem pamięci. Jest to weryfikowane, kiedy przydzieliłem main_mat
wcześniej, przepełni się, jeśli nie, nie będzie. Matlab zwróci błąd braku pamięci.
h=h+slice_matrix(end)
przed main_mat(:,:,1+(k-1)*n:1+(k-1)*n+n-1)=slice_matrix;
(i zainicjować h za pomocą 0)? Podejrzewam, że ta nowo dodana linia już spowoduje problemy z pamięcią.
parfor
pętlę w celu optymalizacji . Dodatkowoparfor
skopiuj dane do każdego osobnego pracownika, zakładając, że 4 pracowników powiela dane cztery razy w pamięci RAM.