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_matrixsur le main_matsans les frais généraux? Merci d'avance.
ÉDITER:
Le débordement s'est produit lors de l' main_matallocation préalable. Si main_matest 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' kaugmentations.
memoryfonction? 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_matpré, ç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.
parforboucle à des fins d'optimisation . De plus,parforcopie vos données sur chaque travailleur distinct, supposant ainsi que 4 travailleurs dupliquent vos données quatre fois dans la RAM.