আপনি আপনার কোডের অন্যান্য সংস্করণ চালিয়ে ধারণাটি পেতে পারেন। আপনার লুপে কোনও ফাংশন ব্যবহার না করে স্পষ্টভাবে গণনাগুলি লিখতে বিবেচনা করুন
tic
Soln3 = ones(T, N);
for t = 1:T
for n = 1:N
Soln3(t, n) = 3*x(t, n)^2 + 2*x(t, n) - 1;
end
end
toc
আমার কম্পিউটারে গণনার সময়:
Soln1 1.158446 seconds.
Soln2 10.392475 seconds.
Soln3 0.239023 seconds.
Oli 0.010672 seconds.
এখন, পুরোপুরি 'ভেক্টরাইজড' সমাধানটি স্পষ্টভাবে দ্রুততম, আপনি দেখতে পাচ্ছেন যে প্রতিটি এক্স এন্ট্রির জন্য ডাকা একটি ফাংশনকে সংজ্ঞায়িত করা একটি বিশাল ওভারহেড। খালি স্পষ্টভাবে গণনা লিখে আমাদের ফ্যাক্টর 5 গতিবেগ পেয়েছে। আমি অনুমান করি এটি দেখায় যে ম্যাটল্যাবস জেআইটি সংকলক ইনলাইন ফাংশন সমর্থন করে না । সেখানে জ্নোভাইসের উত্তর অনুসারে, কোনও অনামিকার চেয়ে স্বাভাবিক ফাংশনটি লেখার চেয়ে ভাল। চেষ্টা করে দেখুন
পরবর্তী পদক্ষেপ - অভ্যন্তরীণ লুপটি সরান (ভেক্টরাইজ করুন):
tic
Soln4 = ones(T, N);
for t = 1:T
Soln4(t, :) = 3*x(t, :).^2 + 2*x(t, :) - 1;
end
toc
Soln4 0.053926 seconds.
আর একটি বিষয় 5 গতিবেগ: এই বিবৃতিতে এমন কিছু আছে যা বলেছে যে আপনার ম্যাটল্যাবে লুপগুলি এড়ানো উচিত ... বা সত্যই আছে? তাহলে এই একবার দেখুন
tic
Soln5 = ones(T, N);
for n = 1:N
Soln5(:, n) = 3*x(:, n).^2 + 2*x(:, n) - 1;
end
toc
Soln5 0.013875 seconds.
'সম্পূর্ণ' ভেক্টরাইজড সংস্করণটির অনেক কাছাকাছি। মতলব ম্যাট্রিকগুলি কলাম কিতাব অনুসারে সঞ্চয় করে। আপনার গণনাগুলি 'কলাম-ওয়াইজ' ভেক্টরাইজ করার জন্য সর্বদা (যখন সম্ভব) আপনার কাঠামো গঠন করা উচিত।
আমরা এখন সলন 3 এ ফিরে যেতে পারি। লুপের ক্রমটি 'সারি অনুসারে' রয়েছে। এটি পরিবর্তন করতে দিন
tic
Soln6 = ones(T, N);
for n = 1:N
for t = 1:T
Soln6(t, n) = 3*x(t, n)^2 + 2*x(t, n) - 1;
end
end
toc
Soln6 0.201661 seconds.
আরও ভাল, কিন্তু এখনও খুব খারাপ। একক লুপ - ভাল। ডাবল লুপ - খারাপ। আমার ধারণা ম্যাটল্যাব লুপগুলির কার্যকারিতা উন্নত করার জন্য কিছু শালীন কাজ করেছে তবে এখনও লুপের ওভারহেড রয়েছে। যদি আপনার ভিতরে কিছু ভারী কাজ হয় তবে আপনি খেয়াল করবেন না। তবে যেহেতু এই গণনাটি মেমরি ব্যান্ডউইথ সীমাবদ্ধ, আপনি লুপ ওভারহেড দেখতে পাবেন। আর তুমি হবে আরও বেশি পরিষ্কারভাবে সেখানে Func1 কলিং ওভারহেড দেখুন।
তাহলে অ্যারেফুনের কি অবস্থা? সেখানে কোনও ফাংশন অন্তর্ভুক্ত নয়, তাই প্রচুর ওভারহেড। তবে ডাবল নেস্টেড লুপের চেয়ে এত খারাপ কেন? প্রকৃতপক্ষে, সেলফান / অ্যারেফুন ব্যবহারের বিষয়টি বহুবার ব্যাপক আলোচনা করা হয়েছে (যেমন এখানে , এখানে , এখানে এবং এখানে ) হয়েছে । এই ফাংশনগুলি কেবল ধীর গতির, আপনি এগুলিকে সূক্ষ্ম শস্য গণনার জন্য ব্যবহার করতে পারবেন না। আপনি সেগুলি কোষ এবং অ্যারের মধ্যে কোড ব্রেভিটি এবং অভিনব রূপান্তরগুলির জন্য ব্যবহার করতে পারেন। তবে আপনি যা লিখেছেন তার চেয়ে ফাংশনটি ভারী হওয়া দরকার:
tic
Soln7 = arrayfun(@(a)(3*x(:,a).^2 + 2*x(:,a) - 1), 1:N, 'UniformOutput', false);
toc
Soln7 0.016786 seconds.
দ্রষ্টব্য যে সলন 7 এখন একটি ঘর .. কখনও কখনও এটি দরকারী। কোড পারফরম্যান্স এখন বেশ ভাল, এবং আউটপুট হিসাবে আপনার যদি সেল প্রয়োজন হয়, আপনি সম্পূর্ণ ভেক্টরাইজড সলিউশন ব্যবহার করার পরে আপনার ম্যাট্রিক্স রূপান্তর করতে হবে না।
তাহলে অ্যারেফুন সাধারণ লুপ কাঠামোর চেয়ে ধীর কেন? দুর্ভাগ্যক্রমে, আমাদের পক্ষে নিশ্চিতভাবে বলা অসম্ভব, যেহেতু কোনও উত্স কোড উপলব্ধ নেই। আপনি কেবল অনুমান করতে পারেন যেহেতু অ্যারেফুন একটি সাধারণ উদ্দেশ্য ফাংশন, যা বিভিন্ন ধরণের বিভিন্ন ডেটা স্ট্রাকচার এবং আর্গুমেন্ট পরিচালনা করে, তাই সাধারণ ক্ষেত্রে এটি খুব দ্রুত প্রয়োজন হয় না, যা আপনি লুপ নীড় হিসাবে সরাসরি প্রকাশ করতে পারেন। ওভারহেড কোথা থেকে আসে তা আমরা জানতে পারি না। ওভারহেড একটি ভাল বাস্তবায়ন দ্বারা এড়ানো যেতে পারে? হয়তো না. তবে দুর্ভাগ্যক্রমে কেবলমাত্র আমরা যা করতে পারি তা হল কেসগুলি সনাক্ত করতে পারফরম্যান্স অধ্যয়ন করা, যেখানে এটি ভালভাবে কাজ করে এবং সেগুলি যেখানে এটি হয় না।
আপডেট যেহেতু এই পরীক্ষার কার্যকর করার সময়টি খুব কম, নির্ভরযোগ্য ফলাফল পেতে আমি এখন পরীক্ষাগুলির চারপাশে একটি লুপ যুক্ত করেছি:
for i=1:1000
% compute
end
কিছু সময় নীচে দেওয়া হয়েছে:
Soln5 8.192912 seconds.
Soln7 13.419675 seconds.
Oli 8.089113 seconds.
আপনি দেখতে পাচ্ছেন যে অ্যারেফুনটি এখনও খারাপ, তবে কমপক্ষে কমপক্ষে তিনটি আদেশ ভেক্টরাইজড দ্রবণের চেয়ে খারাপ নয়। অন্যদিকে, কলাম-ভিত্তিক গণনাগুলির একটি একক লুপ সম্পূর্ণ ভেক্টরাইজড সংস্করণ হিসাবে তত দ্রুত ... এটি সবই একটি সিপিইউতে সম্পন্ন হয়েছিল। সোলন 5 এবং সোলন 7-এর ফলাফল পরিবর্তন হয় না যদি আমি 2 কোরে স্যুইচ করি - সোলন 5-এ আমাকে এটি সমান্তরাল করে তুলতে পারফর্ম ব্যবহার করতে হবে। স্পিডআপ সম্পর্কে ভুলে যান ... Soln7 সমান্তরালে চলবে না কারণ অ্যারেফুন সমান্তরালে চলবে না। অন্যদিকে ওলী ভেক্টরাইজড সংস্করণ:
Oli 5.508085 seconds.