Назначая матрицу в гораздо большую выделенную память, 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 работника дублируют ваши данные четыре раза в оперативной памяти.