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