Dengan menetapkan matriks ke dalam memori yang dialokasikan jauh lebih besar, matlab entah bagaimana akan menduplikatnya sambil 'menyalinnya, dan jika matriks yang akan disalin cukup besar, akan ada memori yang berlebihan. Ini adalah kode contoh:
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
Adakah cara untuk hanya 'menghancurkan' slice_matrix
ke atas main_mat
tanpa overhead? Terima kasih sebelumnya.
EDIT:
Overflow terjadi ketika main_mat
dialokasikan sebelumnya. Jika main_mat
diinisialisasi dengan main_mat=zeros(500,500,1);
(ukuran lebih kecil), overflow tidak akan terjadi, tetapi akan melambat karena alokasi tidak dilakukan sebelum matriks ditugaskan ke dalamnya. Ini akan secara signifikan mengurangi kinerja karena kisaran k
kenaikan
memory
fungsi ini? Manajer tugas? Kesalahan memori dari Matlab? Pada baris kode apa itu terjadi?
main_mat(:,:,1+(k-1)*n:1+(k-1)*n+n-1)
adalah di mana masalah memori meluap terjadi. Itu diverifikasi ketika saya mengalokasikan main_mat
sebelumnya, itu akan meluap, jika saya tidak, itu tidak akan. Matlab akan mengembalikan 'kehabisan memori kesalahan'.
h=h+slice_matrix(end)
sebelum main_mat(:,:,1+(k-1)*n:1+(k-1)*n+n-1)=slice_matrix;
(dan menginisialisasi h dengan 0)? Saya menduga bahwa baris yang baru ditambahkan ini sudah akan menyebabkan masalah memori Anda.
parfor
loop untuk tujuan optimasi . Selain itu,parfor
salin data Anda ke setiap pekerja yang terpisah, sehingga dengan asumsi 4 pekerja itu menggandakan data Anda empat kali dalam RAM.