โดยการกำหนดเมทริกซ์ให้กับหน่วยความจำที่จัดสรรให้มากขึ้น 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