Assegnando una matrice a una memoria allocata molto più grande, matlab in qualche modo la duplicherà mentre la 'copia', e se la matrice da copiare è abbastanza grande, ci sarà un overflow di memoria. Questo è il codice di esempio:
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
Qualche modo di 'fracassare' il slice_matrix
sul main_mat
senza il sovraccarico? Grazie in anticipo.
MODIFICARE:
L'overflow si main_mat
è verificato quando è stato allocato in anticipo. Se main_mat
viene inizializzato con main_mat=zeros(500,500,1);
(dimensioni più piccole), l'overflow non si verificherà, ma rallenterà poiché l'allocazione non viene eseguita prima dell'assegnazione della matrice. Ciò ridurrà significativamente le prestazioni man mano che k
aumenta la gamma .
memory
funzione? Il responsabile delle attività? Un errore di memoria da Matlab? A quale linea di codice sta accadendo?
main_mat(:,:,1+(k-1)*n:1+(k-1)*n+n-1)
è dove si verifica il problema di overflow della memoria. È verificato quando ho allocato in main_mat
anticipo, traboccerà, se non lo faccio, non lo farà. Matlab restituirà "errore di memoria esaurita".
h=h+slice_matrix(end)
precedente main_mat(:,:,1+(k-1)*n:1+(k-1)*n+n-1)=slice_matrix;
(e inizializzare h con 0)? Sospetto che questa nuova riga aggiunta causi già problemi di memoria.
parfor
loop per scopi di ottimizzazione . Inoltre,parfor
copia i tuoi dati su ciascun lavoratore separato, assumendo così 4 lavoratori che duplicano i tuoi dati quattro volte nella RAM.