Bằng cách gán một ma trận vào một bộ nhớ được phân bổ lớn hơn nhiều, matlab bằng cách nào đó sẽ nhân đôi nó trong khi 'sao chép' nó và nếu ma trận được sao chép đủ lớn, sẽ có tràn bộ nhớ. Đây là mã mẫu:
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
Có cách nào để "đập" slice_matrix
cái main_mat
mà không cần quá cao không? Cảm ơn trước.
BIÊN TẬP:
Sự cố tràn xảy ra khi main_mat
được phân bổ trước. Nếu main_mat
được khởi tạo với main_mat=zeros(500,500,1);
(kích thước nhỏ hơn), tràn sẽ không xảy ra, nhưng nó sẽ bị chậm lại do việc phân bổ không được thực hiện trước khi ma trận được gán vào nó. Điều này sẽ làm giảm đáng kể hiệu suất khi phạm vi k
tăng.
memory
chức năng? Người quản lý nhiệm vụ? Một lỗi bộ nhớ từ Matlab? Tại dòng mã nào nó đang xảy ra?
main_mat(:,:,1+(k-1)*n:1+(k-1)*n+n-1)
là nơi xảy ra sự cố tràn bộ nhớ. Nó được xác minh khi tôi phân bổ main_mat
trước, nó sẽ tràn, nếu tôi không, nó sẽ không. Matlab sẽ trả về 'hết lỗi bộ nhớ'.
h=h+slice_matrix(end)
trước main_mat(:,:,1+(k-1)*n:1+(k-1)*n+n-1)=slice_matrix;
(và khởi tạo h bằng 0) không? Tôi nghi ngờ rằng dòng mới được thêm này sẽ gây ra vấn đề bộ nhớ của bạn.
parfor
vòng lặp cho mục đích tối ưu hóa . Ngoài ra,parfor
sao chép dữ liệu của bạn cho từng công nhân riêng biệt, do đó, giả sử 4 công nhân sẽ sao chép dữ liệu của bạn bốn lần trong RAM.