Çok daha büyük bir ayrılmış belleğe bir matris atayarak, matlab 'kopyalarken' bir şekilde çoğaltır ve kopyalanacak matris yeterince büyükse, bellek taşması olur. Bu örnek koddur:
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
Tepegöz olmadan slice_matrix
üzerine sadece 'parçalamak' için herhangi bir yolu var main_mat
mı? Şimdiden teşekkürler.
DÜZENLE:
Taşma main_mat
önceden tahsis edildiğinde meydana geldi . Eğer main_mat
ile başlatıldı main_mat=zeros(500,500,1);
(küçük boyutu), taşma meydana gelmez, ancak matris içine tahsis önce ayırma yapılmazsa gibi yavaşlatılmamış olur. Bu, menzil k
arttıkça performansı önemli ölçüde azaltacaktır .
memory
İşlevi kullanıyor musunuz ? Görev yöneticisi? Matlab'dan bir bellek hatası mı? Hangi kod satırında oluyor?
main_mat(:,:,1+(k-1)*n:1+(k-1)*n+n-1)
, nerede bellek taşması sorunu oluşur. main_mat
Önceden tahsis ettiğimde doğrulandı , taşacak, eğer yapmazsam etmeyecek. Matlab 'bellek yetersiz hatası' döndürür.
h=h+slice_matrix(end)
değerini main_mat(:,:,1+(k-1)*n:1+(k-1)*n+n-1)=slice_matrix;
başlatabilir misiniz?) Bu yeni eklenen satırın zaten bellek sorunlarınıza neden olacağından şüpheleniyorum.
parfor
. Ek olarak,parfor
verilerinizi her bir çalışana kopyalar, böylece 4 çalışanın verilerinizi RAM'de dört kez çoğalttığını varsayar.