En affectant une matrice à une mémoire allouée beaucoup plus grande, matlab la dupliquera d'une manière ou d'une autre tout en la «copiant», et si la matrice à copier est suffisamment grande, il y aura un dépassement de mémoire. Voici l'exemple de code:
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
Est-il possible de simplement `` casser '' le slice_matrix
sur le main_mat
sans les frais généraux? Merci d'avance.
ÉDITER:
Le débordement s'est produit lors de l' main_mat
allocation préalable. Si main_mat
est initialisé avec main_mat=zeros(500,500,1);
(taille plus petite), le débordement ne se produira pas, mais il sera ralenti car l'allocation n'est pas effectuée avant que la matrice ne lui soit affectée. Cela réduira considérablement les performances à mesure que la plage d' k
augmentations.
memory
fonction? Le gestionnaire de tâches? Une erreur de mémoire de Matlab? À quelle ligne de code se produit-il?
main_mat(:,:,1+(k-1)*n:1+(k-1)*n+n-1)
c'est là que se produit le problème de débordement de mémoire. C'est vérifié quand j'ai alloué le main_mat
pré, ça va déborder, si je ne le fais pas, ça ne va pas. Matlab renverra «erreur de mémoire insuffisante».
h=h+slice_matrix(end)
avant main_mat(:,:,1+(k-1)*n:1+(k-1)*n+n-1)=slice_matrix;
(et initialiser h avec 0)? Je soupçonne que cette ligne nouvellement ajoutée entraînera déjà des problèmes de mémoire.
parfor
boucle à des fins d'optimisation . De plus,parfor
copie vos données sur chaque travailleur distinct, supposant ainsi que 4 travailleurs dupliquent vos données quatre fois dans la RAM.