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_matrixke atas main_mattanpa overhead? Terima kasih sebelumnya.
EDIT:
Overflow terjadi ketika main_matdialokasikan sebelumnya. Jika main_matdiinisialisasi 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 kkenaikan
memoryfungsi 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_matsebelumnya, 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.
parforloop untuk tujuan optimasi . Selain itu,parforsalin data Anda ke setiap pekerja yang terpisah, sehingga dengan asumsi 4 pekerja itu menggandakan data Anda empat kali dalam RAM.