Ç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_matmı? Şimdiden teşekkürler.
DÜZENLE:
Taşma main_matönceden tahsis edildiğinde meydana geldi . Eğer main_matile 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 karttı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,parforverilerinizi her bir çalışana kopyalar, böylece 4 çalışanın verilerinizi RAM'de dört kez çoğalttığını varsayar.