Назначая матрицу в гораздо большую выделенную память, Matlab каким-то образом будет дублировать ее при «копировании», и если копируемая матрица будет достаточно большой, произойдет переполнение памяти. Это пример кода:
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
Любой способ просто "разбить" slice_matrixна main_matбез накладных расходов? Заранее спасибо.
РЕДАКТИРОВАТЬ:
Переполнение произошло, когда main_matвыделено заранее. Если main_matинициализируется с main_mat=zeros(500,500,1);(меньший размер), переполнение не произойдет, но оно будет замедлено, так как распределение не будет выполнено до того, как в него будет назначена матрица. Это значительно снизит производительность по мере увеличения диапазона k.
memoryфункцию? Задача-менеджер? Ошибка памяти от Matlab? По какой строке кода это происходит?
main_mat(:,:,1+(k-1)*n:1+(k-1)*n+n-1)где возникает проблема переполнения памяти. Это проверено, когда я выделил main_matзаранее, это переполнится, если я не сделаю, это не будет. Matlab вернет сообщение об ошибке «Недостаточно памяти».
h=h+slice_matrix(end)перед main_mat(:,:,1+(k-1)*n:1+(k-1)*n+n-1)=slice_matrix;(и инициализировать h с 0)? Я подозреваю, что эта добавленная строка уже вызовет проблемы с памятью.
parforцикл . Кроме того,parforкопирует ваши данные каждому отдельному работнику, таким образом, предполагая, что 4 работника дублируют ваши данные четыре раза в оперативной памяти.