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_matrixna main_matbez obciążania? Z góry dziękuję.
EDYTOWAĆ:
Przepełnienie nastąpiło, gdy main_matzostało przydzielone wcześniej. Jeśli main_matzostanie 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 kwzrostem zakresu .
memoryfunkcji? 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_matwcześ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ą.
parforpętlę w celu optymalizacji . Dodatkowoparforskopiuj dane do każdego osobnego pracownika, zakładając, że 4 pracowników powiela dane cztery razy w pamięci RAM.