অনেক বড় বরাদ্দ মেমরির ক্ষেত্রে একটি ম্যাট্রিক্স নির্ধারণের মাধ্যমে, ম্যাটল্যাব এটি 'অনুলিপি করার' সময় কোনওভাবে এটির নকল করবে এবং ম্যাট্রিক্স যদি অনুলিপি করা যায় তবে মেমরির ওভারফ্লো হবে। এটি নমুনা কোড:
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
ফাংশন ব্যবহার করছেন ? টাস্ক-ম্যানেজার? মতলব থেকে একটি স্মৃতি ত্রুটি? কোডের কোন লাইনে এটি ঘটছে?
main_mat(:,:,1+(k-1)*n:1+(k-1)*n+n-1)
সেখানেই মেমরির ওভারফ্লো সমস্যাটি ঘটে। এটি যাচাই করা হয়েছিল যখন আমি main_mat
আগে থেকেই বরাদ্দ দিয়েছিলাম, এটি উপচে পড়বে, যদি আমি না করি তবে তা হবে না। মতলব 'স্মৃতি ত্রুটির বাইরে' ফিরে আসবে।
h=h+slice_matrix(end)
পূর্বে main_mat(:,:,1+(k-1)*n:1+(k-1)*n+n-1)=slice_matrix;
andোকাতে পারেন (এবং এইচ 0 দিয়ে আরম্ভ)? আমার সন্দেহ হয় যে এই নতুন যুক্ত লাইনটি ইতিমধ্যে আপনার স্মৃতি সমস্যার কারণ হয়ে দাঁড়াবে।
parfor
লুপে সেট করার পরামর্শ দেওয়া হচ্ছে । অতিরিক্তভাবে,parfor
প্রতিটি পৃথক কর্মীর কাছে আপনার ডেটা অনুলিপি করে, 4 জন কর্মী ধরে নিয়ে এটি র্যামে আপনার ডেটা চারবার নকল করে।