โดยการกำหนดเมทริกซ์ให้กับหน่วยความจำที่จัดสรรให้มากขึ้น 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;
(และเตรียมข้อมูลเบื้องต้นด้วย 0) ได้หรือไม่ ฉันสงสัยว่าบรรทัดที่เพิ่มใหม่นี้จะทำให้เกิดปัญหาหน่วยความจำของคุณแล้ว
parfor
วงเพื่อเพิ่มประสิทธิภาพ นอกจากนี้parfor
คัดลอกข้อมูลของคุณไปยังผู้ปฏิบัติงานแต่ละคนแยกกันดังนั้นสมมติว่า 4 คนงานทำซ้ำข้อมูลของคุณสี่ครั้งใน RAM