বৈজ্ঞানিক সফ্টওয়্যার অন্যান্য সফ্টওয়্যার থেকে এতটা আলাদা নয়, কী কীভাবে টিউনিংয়ের প্রয়োজন তা জানা উচিত।
আমি যে পদ্ধতিটি ব্যবহার করি তা এলোমেলোভাবে বিরতি দেওয়া । এটি আমার জন্য খুঁজে পেয়েছে এমন কিছু গতিসম্পন্ন:
যদি সময়ের একটি বৃহত ভগ্নাংশ যদি এর মতো ফাংশনে ব্যয় করা হয় log
এবং exp
আমি দেখতে পারি যে সেগুলি থেকে ডাকা হচ্ছে এমন পয়েন্টগুলির একটি ফাংশন হিসাবে functions ফাংশনগুলির পক্ষে যুক্তিগুলি কী। প্রায়শই তাদের একই যুক্তি দিয়ে বারবার বলা হচ্ছে। যদি তা হয়, মেমোজাইজিং একটি বিশাল স্পিডআপ ফ্যাক্টর উত্পাদন করে।
আমি যদি বিএলএএস বা ল্যাপাক ফাংশন ব্যবহার করছি তবে আমি দেখতে পাচ্ছি যে অ্যারে, মাল্টিপিট্রি ম্যাট্রিকেস, কোলেস্কি ট্রান্সফর্ম ইত্যাদি অনুলিপি করতে রুটিনগুলিতে অনেক সময় ব্যয় হয়
অ্যারে অনুলিপি করার রুটিনটি গতির জন্য নয়, এটি সুবিধার জন্য রয়েছে। এটি করার সহজ উপায়টি আপনি খুঁজে পেতে পারেন convenient
ম্যাট্রিককে গুণ বা উল্টে যাওয়ার জন্য, বা কোলেস্কি রূপান্তরগুলি নেওয়ার জন্য রুটিনগুলি, উপরের বা নিম্ন ত্রিভুজের জন্য 'ইউ' বা 'এল' এর মতো বিকল্পগুলি নির্দিষ্ট করে চরিত্রের যুক্তিগুলি ধারণ করে। আবার, সেগুলি সুবিধার জন্য রয়েছে। যা আমি পেয়েছি তা ছিল, যেহেতু আমার ম্যাট্রিকগুলি খুব বেশি বড় ছিল না, রুটিনগুলি কেবলমাত্র বিকল্পগুলি ব্যাখ্যা করার জন্য অক্ষরগুলির সাথে তুলনা করার জন্য সাব্রোটিনকে কল করতে তাদের অর্ধেকের বেশি সময় ব্যয় করছিল । সর্বাধিক ব্যয়বহুল গণিতের রুটিনগুলির বিশেষ-উদ্দেশ্যে সংস্করণগুলি লেখার ফলে প্রচুর গতিবেগ তৈরি হয়েছিল।
আমি যদি কেবলমাত্র পরবর্তীটিতে প্রসারিত করতে পারি: ম্যাট্রিক্স-গুণিত রুটিন ডিজিএমএম তার চরিত্রের আর্গুমেন্টগুলি ডিকোড করার জন্য এলএসএএম কল করে। অন্তর্ভুক্ত শতাংশের সময় (কেবলমাত্র দেখার পরিসংখ্যানের একমাত্র মূল্য) প্রোফারাররা "ভাল" হিসাবে বিবেচিত ডিজিএমএমএমকে মোট সময়ের কিছু শতাংশ যেমন 80% ব্যবহার করে এবং এলএসএএম 50% এর মতো মোট সময়ের কিছু শতাংশ ব্যবহার করে দেখায়। প্রাক্তনটির দিকে তাকালে, আপনি বলার জন্য প্রলুব্ধ হবেন "ভাল এটি অবশ্যই ভারিভাবে অনুকূলিত হওয়া উচিত, তাই আমি এটি সম্পর্কে খুব বেশি কিছু করতে পারি না"। পরের দিকে তাকালে, আপনি "হু? সব কি সম্পর্কে বলার জন্য প্রলুব্ধ হবেন? এটি কেবল একটি ছোট্ট রুটিন। এই প্রোফাইলারটি অবশ্যই ভুল হতে হবে!"
এটি ভুল নয়, এটি আপনাকে যা জানা দরকার তা কেবল আপনাকে বলছে না। এলোমেলোভাবে বিরতি যা আপনাকে দেখায় তা হ'ল ডিজিএমএম স্ট্যাকের নমুনাগুলির 80% এবং এলএসএএম 50% এ থাকে। (এটি সনাক্ত করার জন্য আপনার প্রচুর নমুনার প্রয়োজন নেই 10 10 সাধারণত প্রচুর পরিমাণে।) আরও কী, সেই নমুনাগুলির মধ্যে অনেকটি, ডিজিএমএম কোডের কয়েকটি ভিন্ন লাইন থেকে এলএসএমএল কল করার প্রক্রিয়াধীন ।
সুতরাং এখন আপনি জানেন যে কেন উভয় রুটিন এত বেশি পরিমাণে সময় নিচ্ছে। আপনার কোডটিতে এই সমস্ত সময় ব্যয় করার জন্য তাদেরকে কোথা থেকে ডাকা হচ্ছে তাও আপনি জানেন । সে কারণেই আমি এলোমেলোভাবে বিরতি ব্যবহার করি এবং প্রোফাইলারদের জন্ডিসের দৃষ্টিভঙ্গি গ্রহণ করি, তারা যতই সুসজ্জিত হোক না কেন। কী হচ্ছে তা আপনাকে বলার চেয়ে তারা মাপকাঠিতে আগ্রহী।
গণিতের গ্রন্থাগারের রুটিনগুলি নবম ডিগ্রীতে অনুকূলিত করা হয়েছে বলে ধরে নেওয়া সহজ, তবে বাস্তবে তারা বিস্তৃত উদ্দেশ্যে ব্যবহারযোগ্য হতে অনুকূলিত হয়েছে optim অনুমান করা সহজ কি নয়, আপনাকে সত্যই কী চলছে তা দেখতে হবে ।
যুক্ত: সুতরাং আপনার শেষ দুটি প্রশ্নের উত্তর দিতে:
প্রথমে চেষ্টা করার জন্য সবচেয়ে গুরুত্বপূর্ণ জিনিসগুলি কী কী?
10-20 স্ট্যাকের নমুনাগুলি নিন এবং কেবল তাদের সংক্ষিপ্ত বিবরণ করবেন না, প্রত্যেকে আপনাকে কী বলছে তা বুঝতে পারেন। এটি প্রথম, শেষ এবং এর মধ্যে করুন। (তরুণ স্কাইওয়াকারে কোনও "চেষ্টা" নেই))
আমি কীভাবে জানব যে আমি কতটা পারফরম্যান্স পেতে পারি?
স্ট্যাকের নমুনাগুলি আপনাকে ভগ্নাংশের কী পরিমাণ সময় সাশ্রয় করবে তার একটি খুব রুক্ষ অনুমান দেবে। (এটি একটি বিতরণ অনুসরণ করে, যেখানে আপনি যে নমুনাগুলি ঠিক করতে যাচ্ছেন তা প্রদর্শন করে এবং মোট নমুনার সংখ্যা। এটি গণনা করে না আপনি যে কোডটি এটিকে প্রতিস্থাপন করতে ব্যবহার করেছিলেন তার দাম, যা আশাবাদী ছোট হবে)) তারপরে স্পিডআপ অনুপাতটি যা বড় হতে পারে। এটি গণিতগতভাবে কীভাবে আচরণ করে তা লক্ষ্য করুন। যদি , এবং , এর গড় এবং মোড 0.5, 2 এর দ্রুতগতির অনুপাতের জন্য হয় এখানে বিতরণটি এখানে:
আপনি যদি ঝুঁকি-বিরুদ্ধ হন তবে হ্যাঁ, একটি ছোট সম্ভাবনা রয়েছে (.03%) যেxβ(s+1,(n−s)+1)sn1/(1−x)n=10s=5x
x ১১% এর থেকেও কম গতিবেগের জন্য, 0.1 এর চেয়ে কম। তবে ব্যালেন্সিং এটি একটি সমান সম্ভাবনা যা 10 এর চেয়ে বেশি স্পিডআপ অনুপাতের জন্য 0.9 এর চেয়ে বেশি! আপনি যদি প্রোগ্রামের গতির অনুপাতে অর্থ পাচ্ছেন, তবে এটি খারাপ প্রতিক্রিয়া নয়।x
যেমনটি আমি আপনাকে আগে দেখিয়েছি, আপনি আর পুরোপুরি পুনরাবৃত্তি করতে পারবেন যতক্ষণ না আপনি আর না করতে পারেন, এবং মিশ্রিত স্পিডআপ অনুপাতটি বেশ বড় হতে পারে।
যুক্ত: মিথ্যা ইতিবাচক সম্পর্কে পেড্রোর উদ্বেগের প্রতিক্রিয়া হিসাবে, আমাকে এমন একটি উদাহরণ তৈরির চেষ্টা করুন যেখানে তারা ঘটতে পারে বলে আশা করা যায়। আমরা কখনই কোনও সম্ভাব্য সমস্যার উপরে কাজ করি না যদি না আমরা এটি দুটি বা ততোধিক বার না দেখি, তাই আমরা যখন খুব কম সময়ে সম্ভব সমস্যাটি দেখি তখন বিশেষত যখন নমুনার মোট সংখ্যাটি বড় হয় তখন আমরা মিথ্যা ধনাত্মকতাগুলির প্রত্যাশা করব। মনে করুন আমরা 20 টি নমুনা নিয়েছি এবং এটি দুটিবার দেখেছি। এটি অনুমান করে যে এর ব্যয়টি মোট বাস্তবায়ন সময়ের 10%, এটির বিতরণের মোড। (বিতরণের গড় উচ্চতর - এটি ।) নীচের গ্রাফের নিম্ন বক্ররেখা তার বিতরণ:(s+1)/(n+2)=3/22=13.6%
যদি আমরা 40 টিরও বেশি নমুনা নিয়েছি (একবারে আমার আগে কখনও ছিল না তার চেয়ে বেশি) এবং কেবল তার মধ্যে দুটিতে সমস্যা দেখেছি কিনা তা বিবেচনা করুন। লম্বা বক্ররেখার হিসাবে দেখানো হয়েছে যে সমস্যার আনুমানিক ব্যয় (মোড) 5%।
"মিথ্যা পজিটিভ" কী? এটি হ'ল যদি আপনি কোনও সমস্যার সমাধান করেন তবে আপনি প্রত্যাশার চেয়ে এত ছোট লাভ বুঝতে পেরেছেন যে এটি স্থির করার জন্য আপনি আফসোস করছেন। কার্ভগুলি দেখায় (যদি সমস্যাটি "ছোট" হয়) তবে লাভগুলি এটি প্রদর্শিত নমুনাগুলির ভগ্নাংশের চেয়ে কম হতে পারে, গড়ে এটি বড় হবে।
আরও মারাত্মক ঝুঁকি রয়েছে - একটি "মিথ্যা নেতিবাচক"। সমস্যাটি থাকলেও তা খুঁজে পাওয়া যায় না। (এটিতে অবদান "নিশ্চিতকরণ পক্ষপাত", যেখানে প্রমাণের অভাবে অনুপস্থিতির প্রমাণ হিসাবে গণ্য হয়))
আপনি প্রোফাইলারের (যা ভাল) সাথে যা পান তা হ'ল সমস্যাটি আসলে কী তা সম্পর্কে খুব কম সুনির্দিষ্ট তথ্যের ব্যয়ে আপনি অনেক বেশি সুনির্দিষ্ট পরিমাপ (এইভাবে মিথ্যা ধনাত্মক হওয়ার সম্ভাবনা কম) পান (সুতরাং এটি সন্ধান করার এবং পাওয়ার সম্ভাবনা কম) যে কোন লাভ)। এটি সামগ্রিক গতিবেগ সীমিত করে যা অর্জন করা যায়।
আমি প্রোফাইলার ব্যবহারকারীদের প্রকৃতপক্ষে বাস্তবায়িত হওয়া দ্রুতগতির কারণগুলি প্রতিবেদন করতে উত্সাহিত করব।
পুনরায় তৈরি করার জন্য আরও একটি বিষয় রয়েছে। মিথ্যা ইতিবাচক সম্পর্কে পেড্রোর প্রশ্ন।
তিনি উল্লেখ করেছিলেন যে অত্যন্ত অনুকূলিত কোডে ছোট সমস্যা থেকে নামার সময় কোনও অসুবিধা হতে পারে। (আমার কাছে, একটি ছোট সমস্যা হ'ল যা মোট সময়ের 5% বা তার চেয়ে কম পরিমাণে থাকে))
যেহেতু এটা সম্পূর্ণরূপে সম্ভব একটি প্রোগ্রাম যা 5% ছাড়া সম্পূর্ণই অনুকূল হয় গঠন করা, এই বিন্দুটি কেবল প্রায়োগিক, হিসাবে সুরাহা করা যেতে পারে এই উত্তর । অভিজ্ঞতা অভিজ্ঞতা থেকে সাধারণীকরণ করতে, এটি এরকম হয়:
লিখিত হিসাবে একটি প্রোগ্রামে সাধারণত অপ্টিমাইজেশনের বেশ কয়েকটি সুযোগ থাকে। (আমরা তাদের "সমস্যাগুলি" বলতে পারি তবে তারা প্রায়শই পুরোপুরি ভাল কোড হয়, কেবল যথেষ্ট উন্নতির জন্য সক্ষম)) এই চিত্রটি কিছু সময় (100s বলুন) নেওয়ার একটি কৃত্রিম প্রোগ্রামের চিত্রিত করে এবং এতে A, B, C, ... এটি যখন খুঁজে পাওয়া যায় এবং ঠিক করা হয় তবে মূল 100 এর 30%, 21%, ইত্যাদি সংরক্ষণ করুন।
লক্ষ্য করুন যে এফের মূল সময়টির 5% খরচ হয়, সুতরাং এটি "ছোট" এবং 40 বা ততোধিক নমুনা ছাড়াই খুঁজে পাওয়া শক্ত।
যাইহোক, প্রথম 10 টি নমুনা সহজেই সমস্যা A খুঁজে পায় * ** যখন এটি স্থির হয়, তখন 100/70 = 1.43x গতিবেগের জন্য প্রোগ্রামটি কেবল 70s লাগে takes এটি কেবল প্রোগ্রামকে দ্রুত করে তোলে না, সেই অনুপাত অনুসারে, বাকি সমস্যাগুলি গ্রহণের শতাংশটি বাড়িয়ে তোলে। উদাহরণস্বরূপ, সমস্যা বি প্রকৃতপক্ষে 21 সেকেন্ড নিয়েছিল যা মোট 21% ছিল, তবে A কে অপসারণের পরে বি 70 এর দশকের মধ্যে 21 বা 30% নেয়, সুতরাং যখন পুরো প্রক্রিয়াটি পুনরাবৃত্তি হয় তখন এটি সন্ধান করা সহজ।
একবার প্রক্রিয়াটি পাঁচবার পুনরাবৃত্তি হয়ে গেলে, এখন সম্পাদনের সময়টি 16.8 হয়, যার মধ্যে F 30%, 5% নয়, সুতরাং 10 টি নমুনা সহজেই এটি সন্ধান করে।
সুতরাং যে বিষয়। অভিজ্ঞতাই, প্রোগ্রামগুলিতে আকারগুলির বন্টন করে এমন একাধিক সমস্যা থাকে এবং যে কোনও সমস্যা পাওয়া যায় এবং ঠিক করা হয় তা বাকিগুলির সন্ধান সহজ করে তোলে। এটি সম্পাদন করার জন্য, সমস্যাগুলির কোনওটি এড়ানো যায় না কারণ তারা যদি থাকে তবে তারা সময় নিয়ে সেখানে বসে পুরো স্পিডআপ সীমাবদ্ধ করে এবং অবশিষ্ট সমস্যাগুলিকে প্রশস্ত করতে ব্যর্থ হয়।
এজন্য যে সমস্যাগুলি লুকিয়ে রয়েছে তা খুঁজে পাওয়া খুব গুরুত্বপূর্ণ ।
যদি এ এর মাধ্যমে এ-এর সমস্যাগুলি পাওয়া যায় এবং তা স্থির করা হয় তবে গতিবেগ 100 / 11.8 = 8.5x। যদি এর মধ্যে একটি মিস হয়, উদাহরণস্বরূপ ডি, তবে স্পিডআপটি কেবলমাত্র 100 / (11.8 + 10.3) = 4.5x।
এটা মিথ্যা নেতিবাচক জন্য মূল্য দেওয়া।
সুতরাং, যখন প্রোফাইলার "এখানে কোনও উল্লেখযোগ্য সমস্যা বলে মনে হচ্ছে না" (যেমন ভাল কোডার এটি কার্যত সর্বোত্তম কোড), সম্ভবত এটি সঠিক, এবং সম্ভবত এটি তা নয়। (একটি মিথ্যা নেতিবাচক ।) উচ্চতর গতিরোধের জন্য ঠিক করার জন্য আরও সমস্যা আছে কিনা তা আপনি নিশ্চিতভাবে জানেন না, যদি না আপনি অন্য কোনও প্রোফাইলিং পদ্ধতির চেষ্টা করেন এবং না আবিষ্কার করেন যে। আমার অভিজ্ঞতায়, প্রোফাইলিং পদ্ধতির জন্য সংখ্যক সংখ্যক নমুনার সংক্ষিপ্তসার প্রয়োজন নেই, তবে কয়েকটি সংখ্যক নমুনা প্রয়োজন, যেখানে প্রতিটি নমুনা অপ্টিমাইজেশনের জন্য কোনও সুযোগকে স্বীকৃতি দেওয়ার জন্য যথেষ্ট পরিমাণে বোঝা যায়।
** কোনও সমস্যাটি খুঁজে পেতে এটি সর্বনিম্ন 2 টি হিট লাগে, যদি না কারও কাছে পূর্ববর্তী জ্ঞান থাকে যে একটি (কাছাকাছি) অসীম লুপ রয়েছে। (লাল টিক চিহ্নগুলি এলোমেলো 10 টি নমুনা উপস্থাপন করে); 2 বা ততোধিক হিট পেতে প্রয়োজনীয় নমুনার গড় সংখ্যা, যখন সমস্যাটি 30% হয়, ( নেতিবাচক দ্বিপদী বিতরণ ) হয়। 10 টি নমুনা 85% সম্ভাব্যতা সহ 20 টি নমুনা - 99.2% ( দ্বিপদী বিতরণ ) সহ এটি সন্ধান করে। সমস্যা খোঁজার আর এ, সম্ভাবনা পেতে, মূল্যায়ন , উদাহরণস্বরূপ: ।2/0.3=6.671 - pbinom(1, numberOfSamples, sizeOfProblem)
1 - pbinom(1, 20, 0.3) = 0.9923627
সংযোজন: সময় সাশ্রয়ের সময়, , একটি বিটা বিতরণ অনুসরণ করে , যেখানে নমুনাগুলির সংখ্যা, এবং সেই সংখ্যাটি যা সমস্যাটি দেখায়। তবে স্পিডআপ অনুপাত সমান (সবকটি সংরক্ষণ করা হয়েছে বলে ধরে নেওয়া), এবং এর বন্টন বুঝতে আকর্ষণীয় হবে । দেখা যাচ্ছে একটি বিটাপ্রিম বিতরণ অনুসরণ করে । আমি এই আচরণে পৌঁছে 2 মিলিয়ন নমুনা দিয়ে এটিকে সিমুলেটেড করেছি:β ( গুলি + 1 , ( এন - গুলি ) + 1 ) এন এস ওয়াই 1 / ( 1 - এক্স ) এক্স ওয়াই ওয়াই - 1xβ(s+1,(n−s)+1)nsy1/(1−x)xyy−1
distribution of speedup
ratio y
s, n 5%-ile 95%-ile mean
2, 2 1.58 59.30 32.36
2, 3 1.33 10.25 4.00
2, 4 1.23 5.28 2.50
2, 5 1.18 3.69 2.00
2,10 1.09 1.89 1.37
2,20 1.04 1.37 1.17
2,40 1.02 1.17 1.08
3, 3 1.90 78.34 42.94
3, 4 1.52 13.10 5.00
3, 5 1.37 6.53 3.00
3,10 1.16 2.29 1.57
3,20 1.07 1.49 1.24
3,40 1.04 1.22 1.11
4, 4 2.22 98.02 52.36
4, 5 1.72 15.95 6.00
4,10 1.25 2.86 1.83
4,20 1.11 1.62 1.31
4,40 1.05 1.26 1.14
5, 5 2.54 117.27 64.29
5,10 1.37 3.69 2.20
5,20 1.15 1.78 1.40
5,40 1.07 1.31 1.17
প্রথম দুটি কলাম দ্রুতগতির অনুপাতের জন্য 90% আত্মবিশ্বাসের ব্যবধান দেয়। গড় স্পিডআপ অনুপাত সমান যেখানে ক্ষেত্রে বাদে । সেক্ষেত্রে এটি অপরিজ্ঞাত এবং প্রকৃতপক্ষে, যেমন আমি সিমুলেটেড মানগুলির সংখ্যা বৃদ্ধি করি, তত অনুভূতিক গড় বৃদ্ধি পায়।s = n y(n+1)/(n−s)s=ny
5, 4, 3 এবং 2 নমুনার মধ্যে 2 টি হিটর জন্য এটি গতিময় কারণগুলির বিতরণ এবং তাদের উপায়গুলির একটি প্লট। উদাহরণস্বরূপ, যদি 3 টি নমুনা নেওয়া হয় এবং তার মধ্যে 2 টি কোনও সমস্যার জন্য হিট হয় এবং সেই সমস্যাটি সরানো যায় তবে গড় গতিসম্পন্ন গুণক 4x হবে। 2 টি হিটটি যদি কেবল 2 টি নমুনায় দেখা যায়, গড় গতিসম্পূর্ণতা অপরিবর্তিত - ধারণাটি কারণ অসীম লুপগুলির সাথে প্রোগ্রামগুলি অ-শূন্য সম্ভাবনার সাথে বিদ্যমান!