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