আমার কোডটির ক্রমিক কর্মক্ষমতা উন্নত করার জন্য কিছু ভাল কৌশল কী কী?


66

আমি গণনা বিজ্ঞানে কাজ করি এবং ফলস্বরূপ, আমি আমার কোডের একটি অ-তুচ্ছ পরিমাণ অনেক কোডের বৈজ্ঞানিক থ্রুপুট বাড়াতে, পাশাপাশি এই কোডগুলির দক্ষতা বোঝার চেষ্টা করে ব্যয় করি।

ধরে নেওয়া যাক আমি যে সফ্টওয়্যারটিতে কাজ করছি তার বনাম পড়ার যোগ্যতা / পুনরায় ব্যবহারযোগ্যতা / রক্ষণাবেক্ষণযোগ্য ট্রেড অফকে মূল্যায়ন করেছি এবং আমি সিদ্ধান্ত নিয়েছি যে পারফরম্যান্সে যাওয়ার সময় এসেছে time আসুন ধরে নেওয়া যাক আমি জানি আমার সমস্যাটির জন্য আমার কাছে আরও ভাল অ্যালগরিদম নেই (ফ্লপ / এস এবং মেমরি ব্যান্ডউইথের ক্ষেত্রে)। আপনিও ধরে নিতে পারেন যে আমার কোড বেসটি সি, সি ++, বা ফোর্টরানের মতো নিম্ন স্তরের ভাষায়। পরিশেষে, ধরে নেওয়া যাক কোডটিতে কোনও সমান্তরালতা থাকার দরকার নেই, বা আমরা কেবল একটি একক কোরতে পারফরম্যান্সে আগ্রহী।

প্রথমে চেষ্টা করার জন্য সবচেয়ে গুরুত্বপূর্ণ জিনিসগুলি কী কী? আমি কীভাবে জানব যে আমি কতটা পারফরম্যান্স পেতে পারি?

উত্তর:


66

প্রথমত, দক্ষ এবং ড্যান যেমন উল্লেখ করেছেন, প্রোফাইলিং জরুরি। আমি ব্যক্তিগতভাবে লিনাক্সে ইন্টেলের ভিটিউন অ্যাম্প্লিফায়ার ব্যবহার করি কারণ এটি আমাকে কী সময় কাটাতে ব্যয় করেছিল তার একটি খুব সূক্ষ্ম পর্যালোচনা দেয়।

আপনি যদি অ্যালগরিদম পরিবর্তন করতে যাচ্ছেন না (অর্থাত্ যদি আপনার সমস্ত অপ্টিমাইজেশন অপ্রচলিত হয়ে যায় এমন কোনও বড় পরিবর্তন হয় না), তবে আমি এমন কিছু সাধারণ বাস্তবায়ন বিশদ অনুসন্ধান করার পরামর্শ দিচ্ছি যা বড় পার্থক্য করতে পারে:

  • মেমোরিয়াল লোকেশন : এমন ডেটা যা একসাথে পড়া / ব্যবহার করা হয় তাও একসাথে সংরক্ষণ করা হয়, বা আপনি এখানে এবং সেখানে বিট এবং টুকরা তুলছেন?

  • স্মৃতি সারিবদ্ধকরণ : আপনার ডাবলগুলি কি আসলে 4 বাইটের সাথে সংযুক্ত রয়েছে? আপনি আপনার প্যাক কিভাবে structs? পেডেন্টিক হতে, posix_memalignপরিবর্তে ব্যবহার করুন malloc

  • ক্যাশে দক্ষতা : লোকাল বেশিরভাগ ক্যাশে দক্ষতার সমস্যাগুলির যত্ন নেয় তবে আপনি যদি প্রায়শই পড়েন / লেখেন এমন কিছু ছোট ডেটা স্ট্রাকচার থাকে তবে এটি ক্যাশে লাইনের পূর্ণসংখ্যা একাধিক বা ভগ্নাংশ হলে (সাধারণত 64৪ বাইট) সহায়তা করে। আপনার ডেটা ক্যাশে লাইনের আকারের সাথে সংযুক্ত করা থাকলে এটিও সহায়তা করে। এটি এক টুকরো ডেটা লোড করতে প্রয়োজনীয় পড়ার সংখ্যা হ্রাস করতে পারে।

  • ভেক্টরাইজেশন : না, হ্যান্ড-কোডড এসেইম্বেলার দিয়ে মানসিকভাবে চলবেন না। gccভেক্টর ধরণের অফার দেয় যা এসএসই / অ্যালটিভেক / যে কোনও নির্দেশিকা স্বয়ংক্রিয়ভাবে অনুবাদিত হয়।

  • নির্দেশ-স্তরের সমান্তরালতা : ভেক্টরাইজেশনের জারজ পুত্র। যদি কিছু প্রায়শই পুনরাবৃত্তি করা গণনা ভালভাবে ভেক্টরাইজ হয় না, আপনি একবারে ইনপুট মান সংগ্রহ করতে এবং কয়েকটি মান গণনা করার চেষ্টা করতে পারেন। এটি এক ধরণের লুপ আনরোলিংয়ের মতো। আপনি এখানে কী ব্যবহার করছেন তা হ'ল আপনার সিপিইউতে সাধারণত প্রতি কোর প্রতি একাধিক ভাসমান-পয়েন্ট ইউনিট থাকে।

  • পাটিগণিতের যথার্থতা : আপনি যা কিছু করেন তাতে আপনার কি সত্যই ডাবল-স্পষ্টিকান গাণিতিক প্রয়োজন? উদাহরণস্বরূপ, আপনি যদি কোনও নিউটন পুনরাবৃত্তিতে কোনও সংশোধন গণনা করছেন, আপনার সাধারণত যে সমস্ত অঙ্কগুলি গণনা করা হচ্ছে তার প্রয়োজন হবে না। আরও গভীরতর আলোচনার জন্য, এই কাগজটি দেখুন।

daxpy_cvec এই থ্রেডটিতে এর কয়েকটি কৌশল ব্যবহৃত হয় । এটি বলার পরেও, আপনি যদি ফোর্টরান (আমার বইগুলিতে নিম্ন স্তরের ভাষা নয়) ব্যবহার করছেন তবে এই বেশিরভাগ "কৌশল" এর উপর আপনার খুব কম নিয়ন্ত্রণ থাকবে।

আপনি যদি কিছু উত্সর্গীকৃত হার্ডওয়্যার, যেমন একটি ক্লাস্টার ব্যবহার করেন যা আপনার সমস্ত উত্পাদন পরিচালনার জন্য ব্যবহার করে থাকেন তবে আপনি ব্যবহৃত সিপিইউগুলির সুনির্দিষ্ট বিবরণেও পড়তে চাইতে পারেন। আপনি যে আর্কিটেকচারের জন্য সরাসরি এসেম্বলারের মধ্যে স্টাফ লিখতে হবে তা নয়, তবে এটি আপনাকে মিস করতে পারে এমন আরও কয়েকটি অপ্টিমাইজেশন খুঁজতে আপনাকে অনুপ্রাণিত করতে পারে। কোনও বৈশিষ্ট্য সম্পর্কে জেনে রাখা কোডটি লেখার প্রয়োজনীয় একটি প্রথম পদক্ষেপ যা এটি কাজে লাগাতে পারে।

হালনাগাদ

আমি এটি লেখার পরে অনেকক্ষণ হয়ে গেছে এবং আমি খেয়ালও করি নি যে এটি এত জনপ্রিয় উত্তর হয়ে গেছে। এই কারণে, আমি একটি গুরুত্বপূর্ণ বিষয় যুক্ত করতে চাই:

  • আপনার স্থানীয় কম্পিউটার সায়েন্টিস্টের সাথে কথা বলুন : অ্যালগরিদম এবং / অথবা কম্পিউটেশনগুলিকে আরও দক্ষ / মার্জিত / সমান্তরাল তৈরি করার ক্ষেত্রে একমাত্র শৃঙ্খলা তৈরি করা হত এবং আমরা সকলেই তাদের পরামর্শের জন্য জিজ্ঞাসা করতে পারি, তাহলে কি শীতল হবে না? ভাল, ভাল খবর, যে শৃঙ্খলা বিদ্যমান: কম্পিউটার বিজ্ঞান। সম্ভাবনাগুলি হ'ল, আপনার প্রতিষ্ঠানের এমনকি এটির জন্য নিখুঁত একটি বিভাগ রয়েছে। এই ছেলেদের সাথে কথা বলুন।

আমি অনেকগুলি কম্পিউটার-বিজ্ঞানীকে নিশ্চিত যে এটি হ'ল শৃঙ্খলা নিয়ে হতাশ আলোচনার স্মৃতিগুলিকে ফিরিয়ে আনবে যা কোনও কারণই বা অন্য ব্যক্তির উপাখ্যানগুলির স্মৃতিকে ফিরিয়ে আনবে না। হতাশ হবেন না। আন্তঃশৃঙ্খলাবদ্ধ সহযোগিতা একটি কৌতুকপূর্ণ জিনিস এবং এতে কিছুটা সময় লাগে তবে পুরষ্কারগুলি বিশাল আকার ধারণ করতে পারে।

আমার অভিজ্ঞতায়, কম্পিউটার সায়েন্টিস্ট (সিএস) হিসাবে, কৌশলটি প্রত্যাশা এবং যোগাযোগ উভয়ই সঠিকভাবে অর্জন করার।

প্রত্যাশা- অনুসারে, কোনও সিএস কেবল তখনই আপনাকে সহায়তা করবে যদি সে মনে করে যে আপনার সমস্যাটি আকর্ষণীয়। এটি আপনার লেখার একটি অংশের অনুকূলকরণ / ভেক্টরাইজ / সমান্তরাল করার চেষ্টা বাদ দিয়েছে তবে তারা বোঝেন না এমন সমস্যার জন্য সত্যই মন্তব্য করেননি। সিএসগুলি সাধারণত অন্তর্নিহিত সমস্যার প্রতি বেশি আগ্রহী হয়, যেমন এটি সমাধান করার জন্য ব্যবহৃত অ্যালগরিদম। তাদের আপনার সমাধান দিন না , তাদের আপনার সমস্যা দিন

এছাড়াও, " এই সমস্যাটি ইতিমধ্যে সমাধান হয়ে গেছে " বলার জন্য সিএসের জন্য প্রস্তুত থাকুন , এবং কেবল আপনাকে একটি কাগজের একটি উল্লেখ দিন। পরামর্শের একটি শব্দ: সেই কাগজটি পড়ুন এবং, যদি এটি সত্যিই আপনার সমস্যার ক্ষেত্রে প্রযোজ্য হয়, তবে যা কিছু অ্যালগরিদম তার পরামর্শ দেয় তা প্রয়োগ করুন। এটি কোনও সিএস চোরাচালান নয়, এটি একটি সিএস যা আপনাকে কেবল সহায়তা করেছিল। বিরক্ত হবেন না, মনে রাখবেন: সমস্যাটি যদি কম্পিউটেশনালভাবে আকর্ষণীয় না হয়, যেমন ইতিমধ্যে এটি সমাধান হয়ে গেছে এবং সমাধানটি সর্বোত্তম হিসাবে প্রদর্শিত হয়েছে, তারা এটিতে কাজ করবে না, এটি আপনার পক্ষে কম কোড করে।

কমিউনিকেশন -wise, মনে রাখবেন যে সবচেয়ে CSS আপনার ক্ষেত্রে বিশেষজ্ঞদের নয়, এবং পরিপ্রেক্ষিতে সমস্যা ব্যাখ্যা কি হিসাবে বিরোধিতা করছ কিভাবে এবং কেন । আমরা সাধারণত সত্যিই যত্নশীল না কেন , এবং কিভাবে হয়, ভাল, কি আমরা ভাল না।

উদাহরণস্বরূপ, আমি বর্তমানে এসপিএইচ এবং মাল্টিপোলসের উপর ভিত্তি করে তাদের সিমুলেশন কোডের আরও ভাল সংস্করণ লেখার জন্য একগুচ্ছ কম্পিউটেশনাল কসমোলজিস্টের সাথে কাজ করছি । গা darkপদার্থ এবং গ্যালাক্সি হ্যালোগুলির (হু?) পদে কথা বলা বন্ধ করতে এবং গণনার মূল অংশটি নিচে নেওয়ার জন্য এটি প্রায় তিনটি সভা গ্রহণ করেছিল , অর্থাৎ প্রতিটি কণার প্রদত্ত ব্যাসার্ধের মধ্যে তাদের সমস্ত প্রতিবেশী খুঁজে বের করতে হবে, কিছু গণনা করতে হবে তাদের উপর পরিমাণ, এবং তারপরে আবার সমস্ত কথিত প্রতিবেশীদের উপর দৌড়াতে এবং সেই পরিমাণটি অন্য কোনও গণিতে প্রয়োগ করুন। তারপরে কণাগুলি বা কমপক্ষে কয়েকটি সরান এবং এটি আবারও করুন। আপনি দেখতে পাচ্ছেন, প্রাক্তনটি অবিশ্বাস্যরূপে আকর্ষণীয় হতে পারে (এটি!), তবে দ্বিতীয়টি অ্যালগরিদমগুলি সম্পর্কে চিন্তাভাবনা শুরু করার জন্য আমার বুঝতে হবে।

তবে আমি মূল বিষয়টি থেকে সরে যাচ্ছি: আপনি যদি নিজের গণনাটি দ্রুত তৈরি করতে আগ্রহী হন এবং আপনি নিজে কম্পিউটার বিজ্ঞানী না হন তবে একজনের সাথে কথা বলুন।


4
প্রোফাইলিংয়ের সরঞ্জামগুলি যেতে যেতে আমি ভ্যালগ্রাইন্ডটি ভুলে যাব না ।
GertVdE

1
আমি আপনার সাথে একমত হয়েছি পেড্রো, যখন প্রোগ্রামটি অনুকূলিতকরণ হচ্ছে এফ 1 রেস গাড়িটির মতো, ইতিমধ্যে অনুকূলের কাছাকাছি। আমি যে প্রোগ্রামগুলি বাস্তবে দেখি তা বৈজ্ঞানিক এবং না, প্রায়শই ক্যাডিলাক কুপ ডিভিলিসের মতো হয়। আসল পারফরম্যান্স পেতে, টন ফ্যাট কেটে ফেলা যায়। এরপরে, চক্র-শেভিং এর প্রবাহকে আঘাত করতে শুরু করে।
মাইক ডুনলাভে

1
@ মাইকডুনলাভে: সম্পূর্ণরূপে একমত অ্যালগোরিদম সম্পর্কিত আরও সমস্যা সমাধানের জন্য আমি আমার উত্তরে একটি আপডেট যুক্ত করেছি।
পেড্রো

1
@MikeDunlavey, আমি আছি সি এস লোক :)
পেড্রো

2
আমি ইউ ম্যাস। লোয়েলে একটি বক্তৃতায় এটি প্রকাশ করেছি। এটি একটি লাইভ ডেমো ছিল, 730x স্পিডআপের সমস্ত স্তর দেখায়। আমার মনে হয় অর্ধ ডজনের মধ্যে একজন অধ্যাপক পয়েন্টটি পেয়েছেন।
মাইক ডুনলাভে

38

বৈজ্ঞানিক সফ্টওয়্যার অন্যান্য সফ্টওয়্যার থেকে এতটা আলাদা নয়, কী কীভাবে টিউনিংয়ের প্রয়োজন তা জানা উচিত।

আমি যে পদ্ধতিটি ব্যবহার করি তা এলোমেলোভাবে বিরতি দেওয়া । এটি আমার জন্য খুঁজে পেয়েছে এমন কিছু গতিসম্পন্ন:

যদি সময়ের একটি বৃহত ভগ্নাংশ যদি এর মতো ফাংশনে ব্যয় করা হয় logএবং expআমি দেখতে পারি যে সেগুলি থেকে ডাকা হচ্ছে এমন পয়েন্টগুলির একটি ফাংশন হিসাবে functions ফাংশনগুলির পক্ষে যুক্তিগুলি কী। প্রায়শই তাদের একই যুক্তি দিয়ে বারবার বলা হচ্ছে। যদি তা হয়, মেমোজাইজিং একটি বিশাল স্পিডআপ ফ্যাক্টর উত্পাদন করে।

আমি যদি বিএলএএস বা ল্যাপাক ফাংশন ব্যবহার করছি তবে আমি দেখতে পাচ্ছি যে অ্যারে, মাল্টিপিট্রি ম্যাট্রিকেস, কোলেস্কি ট্রান্সফর্ম ইত্যাদি অনুলিপি করতে রুটিনগুলিতে অনেক সময় ব্যয় হয়

  • অ্যারে অনুলিপি করার রুটিনটি গতির জন্য নয়, এটি সুবিধার জন্য রয়েছে। এটি করার সহজ উপায়টি আপনি খুঁজে পেতে পারেন convenient

  • ম্যাট্রিককে গুণ বা উল্টে যাওয়ার জন্য, বা কোলেস্কি রূপান্তরগুলি নেওয়ার জন্য রুটিনগুলি, উপরের বা নিম্ন ত্রিভুজের জন্য 'ইউ' বা 'এল' এর মতো বিকল্পগুলি নির্দিষ্ট করে চরিত্রের যুক্তিগুলি ধারণ করে। আবার, সেগুলি সুবিধার জন্য রয়েছে। যা আমি পেয়েছি তা ছিল, যেহেতু আমার ম্যাট্রিকগুলি খুব বেশি বড় ছিল না, রুটিনগুলি কেবলমাত্র বিকল্পগুলি ব্যাখ্যা করার জন্য অক্ষরগুলির সাথে তুলনা করার জন্য সাব্রোটিনকে কল করতে তাদের অর্ধেকের বেশি সময় ব্যয় করছিল । সর্বাধিক ব্যয়বহুল গণিতের রুটিনগুলির বিশেষ-উদ্দেশ্যে সংস্করণগুলি লেখার ফলে প্রচুর গতিবেগ তৈরি হয়েছিল।

আমি যদি কেবলমাত্র পরবর্তীটিতে প্রসারিত করতে পারি: ম্যাট্রিক্স-গুণিত রুটিন ডিজিএমএম তার চরিত্রের আর্গুমেন্টগুলি ডিকোড করার জন্য এলএসএএম কল করে। অন্তর্ভুক্ত শতাংশের সময় (কেবলমাত্র দেখার পরিসংখ্যানের একমাত্র মূল্য) প্রোফারাররা "ভাল" হিসাবে বিবেচিত ডিজিএমএমএমকে মোট সময়ের কিছু শতাংশ যেমন 80% ব্যবহার করে এবং এলএসএএম 50% এর মতো মোট সময়ের কিছু শতাংশ ব্যবহার করে দেখায়। প্রাক্তনটির দিকে তাকালে, আপনি বলার জন্য প্রলুব্ধ হবেন "ভাল এটি অবশ্যই ভারিভাবে অনুকূলিত হওয়া উচিত, তাই আমি এটি সম্পর্কে খুব বেশি কিছু করতে পারি না"। পরের দিকে তাকালে, আপনি "হু? সব কি সম্পর্কে বলার জন্য প্রলুব্ধ হবেন? এটি কেবল একটি ছোট্ট রুটিন। এই প্রোফাইলারটি অবশ্যই ভুল হতে হবে!"

এটি ভুল নয়, এটি আপনাকে যা জানা দরকার তা কেবল আপনাকে বলছে না। এলোমেলোভাবে বিরতি যা আপনাকে দেখায় তা হ'ল ডিজিএমএম স্ট্যাকের নমুনাগুলির 80% এবং এলএসএএম 50% এ থাকে। (এটি সনাক্ত করার জন্য আপনার প্রচুর নমুনার প্রয়োজন নেই 10 10 সাধারণত প্রচুর পরিমাণে।) আরও কী, সেই নমুনাগুলির মধ্যে অনেকটি, ডিজিএমএম কোডের কয়েকটি ভিন্ন লাইন থেকে এলএসএমএল কল করার প্রক্রিয়াধীন

সুতরাং এখন আপনি জানেন যে কেন উভয় রুটিন এত বেশি পরিমাণে সময় নিচ্ছে। আপনার কোডটিতে এই সমস্ত সময় ব্যয় করার জন্য তাদেরকে কোথা থেকে ডাকা হচ্ছে তাও আপনি জানেন । সে কারণেই আমি এলোমেলোভাবে বিরতি ব্যবহার করি এবং প্রোফাইলারদের জন্ডিসের দৃষ্টিভঙ্গি গ্রহণ করি, তারা যতই সুসজ্জিত হোক না কেন। কী হচ্ছে তা আপনাকে বলার চেয়ে তারা মাপকাঠিতে আগ্রহী।

গণিতের গ্রন্থাগারের রুটিনগুলি নবম ডিগ্রীতে অনুকূলিত করা হয়েছে বলে ধরে নেওয়া সহজ, তবে বাস্তবে তারা বিস্তৃত উদ্দেশ্যে ব্যবহারযোগ্য হতে অনুকূলিত হয়েছে optim অনুমান করা সহজ কি নয়, আপনাকে সত্যই কী চলছে তা দেখতে হবে ।

যুক্ত: সুতরাং আপনার শেষ দুটি প্রশ্নের উত্তর দিতে:

প্রথমে চেষ্টা করার জন্য সবচেয়ে গুরুত্বপূর্ণ জিনিসগুলি কী কী?

10-20 স্ট্যাকের নমুনাগুলি নিন এবং কেবল তাদের সংক্ষিপ্ত বিবরণ করবেন না, প্রত্যেকে আপনাকে কী বলছে তা বুঝতে পারেন। এটি প্রথম, শেষ এবং এর মধ্যে করুন। (তরুণ স্কাইওয়াকারে কোনও "চেষ্টা" নেই))

আমি কীভাবে জানব যে আমি কতটা পারফরম্যান্স পেতে পারি?

স্ট্যাকের নমুনাগুলি আপনাকে ভগ্নাংশের কী পরিমাণ সময় সাশ্রয় করবে তার একটি খুব রুক্ষ অনুমান দেবে। (এটি একটি বিতরণ অনুসরণ করে, যেখানে আপনি যে নমুনাগুলি ঠিক করতে যাচ্ছেন তা প্রদর্শন করে এবং মোট নমুনার সংখ্যা। এটি গণনা করে না আপনি যে কোডটি এটিকে প্রতিস্থাপন করতে ব্যবহার করেছিলেন তার দাম, যা আশাবাদী ছোট হবে)) তারপরে স্পিডআপ অনুপাতটি যা বড় হতে পারে। এটি গণিতগতভাবে কীভাবে আচরণ করে তা লক্ষ্য করুন। যদি , এবং , এর গড় এবং মোড 0.5, 2 এর দ্রুতগতির অনুপাতের জন্য হয় এখানে বিতরণটি এখানে: আপনি যদি ঝুঁকি-বিরুদ্ধ হন তবে হ্যাঁ, একটি ছোট সম্ভাবনা রয়েছে (.03%) যেxβ(s+1,(ns)+1)sn1/(1x)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,(ns)+1)nsy1/(1x)xyy1

         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)/(ns)s=ny

5, 4, 3 এবং 2 নমুনার মধ্যে 2 টি হিটর জন্য এটি গতিময় কারণগুলির বিতরণ এবং তাদের উপায়গুলির একটি প্লট। উদাহরণস্বরূপ, যদি 3 টি নমুনা নেওয়া হয় এবং তার মধ্যে 2 টি কোনও সমস্যার জন্য হিট হয় এবং সেই সমস্যাটি সরানো যায় তবে গড় গতিসম্পন্ন গুণক 4x হবে। 2 টি হিটটি যদি কেবল 2 টি নমুনায় দেখা যায়, গড় গতিসম্পূর্ণতা অপরিবর্তিত - ধারণাটি কারণ অসীম লুপগুলির সাথে প্রোগ্রামগুলি অ-শূন্য সম্ভাবনার সাথে বিদ্যমান!

এখানে চিত্র বর্ণনা লিখুন


1
উহম ... ভিটিউনের সরবরাহকৃত প্রোফাইলার কল গ্রাফ বা "ডাউন-আপ" টাইপের সংক্ষিপ্তসারগুলি দেখলে আপনি ঠিক এই তথ্যটি পান না?
পেড্রো

2
@ পেড্রো: যদি কেবলমাত্র। স্ট্যাকের নমুনায় (& সম্পর্কিত ভেরিয়েবলগুলি) পুরো কারণটি এনকোড করা হয়েছে যে সময় বাড়ানো ব্যয় হচ্ছে। কেন এটি ব্যয় হচ্ছে তা আপনি যদি না জানেন তবে আপনি এ থেকে মুক্তি পেতে পারবেন না। কিছু সমস্যা সীমিত তথ্যের সাথে পাওয়া যেতে পারে তবে প্রত্যেকটি নয় । যদি আপনি কেবল সেগুলির কিছু পান তবে প্রত্যেকটি নয়, তবে সমস্যাগুলি আপনাকে শেষের গতিবেগ থেকে আটকাবে না। এখানে এবং এখানে চেক করুন
মাইক ডুনলাভে

তাত্ক্ষণিকভাবে, আপনি আপনার পদ্ধতিটিকে খারাপ প্রোফাইলিংয়ের সাথে তুলনা করছেন ... আপনি প্রতিটি রুটিনের জন্য প্রোফাইলের মধ্য দিয়ে যেতে পারেন, মোট প্রয়োগের সময়টিতে এর অবদানের চেয়ে আলাদা এবং একই প্রভাব সহ উন্নতির সন্ধান করতে পারেন। আপনার পদ্ধতির বিষয়ে আমি যে বিষয়টি নিয়ে উদ্বিগ্ন তা হ'ল আপনার কোডের "হটস্পটগুলি" আরও ছোট হয়ে যাওয়ার সাথে সাথে আপনি ট্র্যাকিং শেষ করবেন।
পেড্রো

@ পেড্রো: আপনি একাধিক নমুনায় ফিক্স করতে পারবেন এমন কিছু না দেখা পর্যন্ত কেবল নমুনা নেওয়া চালিয়ে যান। বিটা ডিস্ট্রার এটি কতটা বাঁচাতে পারে তা বলে, যদি আপনি যত্ন নেন তবে আপনি যদি এটির চেয়ে কম স্পিডআপ পাওয়ার ভয় পেয়ে থাকেন তবে সচেতন হন যে আপনি যে সুযোগটি আরও বেশি হতে পারেন তা ফেলে দিচ্ছেন (এবং এটি ডান দিকের স্কুড) )। সংক্ষিপ্ত প্রোফাইলকারীদের সাথে আরও বড় বিপদটি মিথ্যা নেতিবাচক । সমস্যা হতে পারে, তবে আপনি যখনই প্রোফাইলারটি কোথায় হতে পারে সে সম্পর্কে খুব নির্দিষ্ট-নির্দিষ্ট না হওয়ায় আপনার অন্তর্দৃষ্টিটি এটাকে কমিয়ে দেবে বলে আশা করছেন ।
মাইক ডুনলাভে

@ পেড্রো: আমার জানা একমাত্র দুর্বলতা যখন এটির সময় স্ন্যাপশটের দিকে তাকালে আপনি বুঝতে পারবেন না যে সেই সময়টি কেন ব্যয় করা হচ্ছে, যেমন যদি এটি অনর্থক ইভেন্টগুলি কেবল প্রক্রিয়াকরণকারী যেখানে লুকিয়ে থাকে, বা অ্যাসিঙ্ক্রোনাস প্রোটোকলগুলি প্রক্রিয়াজাত করে। আরও "সাধারণ" কোডের জন্য, আমাকে একজন "ভাল" প্রোফাইলার দেখান এবং আমি আপনাকে এমন একটি সমস্যা দেখাব যাতে এটির সমস্যা রয়েছে বা এটি সন্ধান করতে পারে না (আপনাকে আপনার ফলস্বরূপ স্মার্টগুলিতে ফিরে যেতে বাধ্য করে)। সাধারণত এই জাতীয় সমস্যা তৈরির উপায়টি নিশ্চিত করা হয় যে পরিবেশিত উদ্দেশ্যটি স্থানীয়ভাবে ব্যাখ্যা করা যায় না। এবং এই জাতীয় সমস্যাগুলি সফ্টওয়্যারটিতে প্রচুর।
মাইক ডুনলাভে

23

আপনার কেবলমাত্র আপনার সংকলকটির অন্তরঙ্গ জ্ঞান থাকতে হবে তা নয়, আপনার লক্ষ্য স্থাপত্য এবং অপারেটিং সিস্টেম সম্পর্কে অন্তরঙ্গ জ্ঞানও রয়েছে ।

কর্মক্ষমতা প্রভাবিত করতে পারে কি?

আপনি যদি পারফরম্যান্সের প্রতিটি আউন্সকে চেপে ধরতে চান, তবে প্রতিবার আপনি যখন আপনার টার্গেটের আর্কিটেকচারটি পরিবর্তন করবেন, আপনাকে আপনার কোডটি টুইঙ্ক করে পুনরায় অনুকূল করতে হবে। কিছু কিছু যা একটি সিপিইউর সাথে অপ্টিমাইজেশন ছিল সেই একই সিপিইউর পরবর্তী পরবর্তী সংশোধনীতে উপ-অনুকূল হয়ে উঠতে পারে।

এর দুর্দান্ত উদাহরণটি হ'ল সিপিইউ ক্যাশে। আপনার প্রোগ্রামটিকে একটি সিপিইউ থেকে দ্রুত ছোট ক্যাশে দিয়ে কিছুটা ধীর, সামান্য বড় ক্যাশে দিয়ে সরান এবং আপনার প্রোফাইলটি উল্লেখযোগ্যভাবে পরিবর্তিত হতে পারে।

এমনকি লক্ষ্য স্থাপত্য পরিবর্তন না হলেও অপারেটিং সিস্টেমে নিম্ন স্তরের পরিবর্তনগুলিও কার্য সম্পাদনকে প্রভাবিত করতে পারে। স্পেকটার এবং মেল্টডাউন প্রশমন প্যাচগুলি কিছু কাজের চাপে বিশাল প্রভাব ফেলেছিল, সুতরাং এগুলি আপনার অপটিমাইজেশনের পুনরায় মূল্যায়ন করতে বাধ্য করতে পারে।

আমি কীভাবে আমার কোডটি অনুকূলিত রাখতে পারি?

অত্যন্ত অপ্টিমাইজড কোড বিকাশ করার সময়, আপনাকে এটিকে মডুলার রাখতে হবে এবং একই অ্যালগরিদমের বিভিন্ন সংস্করণটি অভ্যন্তরীণ এবং আউটকে সোজা করে আনা সহজভাবে উপলভ্য সংস্থানসমূহ এবং আকার / জটিলতার উপর নির্ভর করে রান টাইমে ব্যবহৃত নির্দিষ্ট সংস্করণ নির্বাচন করতে হবে need তথ্য প্রক্রিয়া করা হবে।

পরিমিতিটির অর্থ হ'ল আপনার সমস্ত অপটিমাইজড এবং অপরিশোধিত সংস্করণগুলিতে একই পরীক্ষার স্যুটটি ব্যবহার করতে সক্ষম হওয়া, আপনাকে যাচাই করতে দেয় যে তারা সকলে একইরকম আচরণ করে এবং প্রত্যেকে দ্রুত পছন্দ করার মতো তুলনায় দ্রুত প্রোফাইল দেয় । আমি কীভাবে অন্যকে "স্বীকৃতি ছাড়াই অপ্টিমাইজড" গণনাগতভাবে নিবিড় কোড ডকুমেন্ট করতে এবং শেখাতে পারি তার উত্তরে আমি আরও কিছুটা বিশদে যাচ্ছি ?

আরও পড়া

উপরন্তু, আমি অত্যন্ত উলরিখ Drepper এর চমৎকার কাগজ কটাক্ষপাত গ্রহণ সুপারিশ করবে কি প্রতিটি প্রোগ্রামার মেমরি সম্পর্কে জানা উচিত , যার শিরোনাম একটি সম্মান হয় ডেভিড গোল্ডবার্গ এর সমানভাবে কল্পনাপ্রসূত প্রতিটি কম্পিউটার বিজ্ঞানী সম্পর্কে ফ্লোটিং-পয়েন্ট পাটিগণিত কী জানা উচিত

মনে রাখবেন যে প্রতিটি অপ্টিমাইজেশনের ভবিষ্যতে অ্যান্টি-অপ্টিমাইজেশান হওয়ার সম্ভাবনা রয়েছে , তাই সর্বনিম্ন রাখতে হলে এটি একটি সম্ভাব্য কোড গন্ধ হিসাবে বিবেচনা করা উচিত। কোডিং করার সময় আমার উত্তর কি মাইক্রো-অপ্টিমাইজেশন গুরুত্বপূর্ণ? ব্যক্তিগত অভিজ্ঞতা থেকে এর একটি দৃ concrete় উদাহরণ সরবরাহ করে।


8

আমি মনে করি আপনি প্রশ্নটি খুব সংকীর্ণভাবে বাক্যবন্ধ করেছেন। আমার দৃষ্টিতে, একটি কার্যকর দৃষ্টিভঙ্গি এই ধারণার অধীনে বাস করা যে কেবলমাত্র 100 কাঠামোর চেয়ে বেশি কোডগুলিতে ডেটা স্ট্রাকচার এবং অ্যালগরিদমগুলিতে পরিবর্তনগুলি উল্লেখযোগ্য পারফরম্যান্স লাভ করতে পারে এবং আমি বিশ্বাস করি যে আমার কাছে এখনও কোনও পাল্টা নমুনা খুঁজে পাওয়া যায়নি এই দাবি


3
নীতিগতভাবে সম্মত, তবে কোনও একটি অ্যালগোরিদম / ডেটা-কাঠামোর কার্যকারিতা এবং অন্তর্নিহিত হার্ডওয়্যারের বিশদগুলির মধ্যে ইন্টারপ্লিটকে অবমূল্যায়ন করা উচিত নয়। উদাহরণস্বরূপ ভারসাম্য বাইনারি গাছগুলি ডেটা সন্ধান / সঞ্চয় করার জন্য দুর্দান্ত তবে গ্লোবাল মেমরির বিলম্বের উপর নির্ভর করে একটি হ্যাশ-টেবিল আরও ভাল হতে পারে।
পেড্রো

1
একমত। অ্যালগরিদম এবং ডেটা স্ট্রাকচার O (10) থেকে ও (100) উন্নতি সরবরাহ করতে পারে। তবে কয়েকটি কম্পিউট বাউন্ডেড সমস্যার জন্য (যেমন আণবিক গতিবিদ্যার গণনা, জ্যোতির্বিজ্ঞানগুলি, রিয়েল-টাইম চিত্র এবং ভিডিও প্রক্রিয়াকরণ, ফিনান্স) হিসাবে একটি অত্যন্ত সুরযুক্ত সমালোচনামূলক লুপটি একটি 3x থেকে 10x দ্রুত সামগ্রিক অ্যাপ্লিকেশন রানটাইমকে বোঝাতে পারে।
এফক্রুজ

আমি যথেষ্ট আকারের "উত্পাদন" কোডগুলিতে নেস্টেড লুপগুলিকে খারাপভাবে অর্ডার করেছি। এর বাইরে আমি মনে করি আপনি ঠিক বলেছেন।
dmckee

8

আপনার কোডটি প্রোফাইল করা উচিত আপনার প্রথম কাজটি। আপনি অনুকূলিতকরণ শুরু করার আগে আপনার প্রোগ্রামের কোন অংশগুলি আপনাকে কমিয়ে দিচ্ছে তা সন্ধান করতে চান , অন্যথায় আপনি আপনার কোডের এমন একটি অংশকে অনুকূল করতে পারেন যা কার্যকরভাবে কার্যকর করার সময়টুকু বেশিরভাগ সময় খায় নি।

লিনাক্স

জিআরফোফ বেশ ভাল, তবে এটি কেবল আপনাকে জানায় যে প্রতিটি লাইনের পরিবর্তে প্রতিটি ফাংশন দ্বারা কত সময় নেওয়া হয়।

অ্যাপল ওএস এক্স

আপনি শার্ক চেষ্টা করে দেখতে পারেন । এটি অ্যাপল বিকাশকারী সাইটের ডাউনলোডসমূহ> বিকাশকারী সরঞ্জামসমূহ> সিএইচডিডি 4.6.2 এর অধীনে এখানে পুরানো সংস্করণে উপলভ্য । সিএইচউডিতে অন্যান্য প্রোফাইলিং সরঞ্জামগুলি রয়েছে যেমন বিগটপ ফ্রন্ট্যান্ড, পিএমসি সূচক অনুসন্ধান সরঞ্জাম, শনি ফাংশন-স্তরের প্রোফাইলার এবং প্রচুর অন্যান্য কমান্ড। শার্ক একটি কমান্ডলাইন সংস্করণ নিয়ে আসবে।


+1 প্রোফাইল? হ্যাঁ, একভাবে ... এটি অনুমান করার চেয়ে অনেক ভাল, তবে এখানে এমন সমস্যাগুলির একটি তালিকা রয়েছে যা বিশেষত gprof এবং অন্যান্য অনেক প্রোফাইলার ক্ষেত্রে প্রযোজ্য।
মাইক ডুনলাভে

ওএস এক্স-এ শার্ক কি পুরানো কমান্ড? আরও এখানে । মাউন্টেন সিংহের সাথে, আমার কি যন্ত্র ব্যবহার করা উচিত?
এইচ এইচ

@ এইচএইচএইচ: এটি ম্যাক্সের জন্য জিইউআই প্রোফাইলার ছিল, যদিও দেখে মনে হচ্ছে এটি আর রক্ষণাবেক্ষণ করা হচ্ছে না। আমি এই উত্তরটি লেখার পর থেকে আমি কোনও অ্যাপল মেশিনে প্রোগ্রাম করি নি, তাই আমি আপনাকে বেশি সাহায্য করতে পারি না।
ড্যান

1
এটি অ্যাপল বিকাশকারী সাইটে ডাউনলোড> বিকাশকারী সরঞ্জাম> সিএইচডিডি 4.6.2 এর অধীনে উপলব্ধ। পুরোনো সংস্করণ এখানে "যোগাযোগ প্রস্তুতকারকের", বাগ সম্পর্কে কোন ধারনা: দুর্ভাগ্যবশত এই ইনস্টলেশন সফল না - এবং এটি কিছু প্রোফাইলিং সব ধরনের রয়েছে। শার্ককে সিংহের পরে দৃশ্যত এক্সকোড থেকে বের করে আনা হয়েছিল এবং পরে ম্যাকআপেডে ফ্রি হাতিয়ার হওয়ার পরে অ্যাপল দেবের সাইটে ফিরিয়ে দেওয়া হয়েছিল।
এইচ এইচ

@ এইচএইচ: আপনি আমার চেয়ে এই উত্তর দিতে আরও দক্ষ বলে মনে করছেন। আমার উত্তর এটি আপডেট করতে সম্পাদনা করতে নির্দ্বিধায় বা নিজের লেখা লিখুন।
ড্যান

7

আপনি কতটা পারফরম্যান্স পেতে পারেন তা আপনার কোডের প্রোফাইল থেকে ফলাফল নিন এবং আসুন আমরা আপনাকে এমন একটি টুকরো চিহ্নিত করব যা সময়ের "পি" ভগ্নাংশ নেয়। আপনি যদি কেবল "" "এর একটি উপাদান দ্বারা সেই টুকরোটির পারফরম্যান্সকে উন্নত করতে চান তবে আপনার সামগ্রিক গতিবেগ 1 / ((1-পি) + পি / গুলি) হবে। অতএব আপনি 1 / (1-পি) এর গুণক দ্বারা আপনার গতি সর্বাধিক বৃদ্ধি করতে পারেন। আশা করি আপনার হাই পি এর অঞ্চল রয়েছে! এটি সিরিয়াল অপ্টিমাইজেশনের জন্য আমদাহলের আইনের সমতুল্য ।


5

আপনার কোডটি অপ্টিমাইজ করা সাবধানতার সাথে করতে হবে। আসুন ধরে নেওয়া যাক আপনি ইতিমধ্যে কোডটি ডিবাগ করেছেন। আপনি নির্দিষ্ট অগ্রাধিকার অনুসরণ করলে আপনি অনেক সময় সাশ্রয় করতে পারেন, যথা:

  1. যেখানে সম্ভব সেখানে অত্যন্ত অনুকূল (বা পেশাদারি অনুকূল) লাইব্রেরি ব্যবহার করুন। কিছু উদাহরণগুলির মধ্যে এফএফটিডাব্লু, ওপেনব্লাস, ইন্টেল এমকেএল, এনএজি লাইব্রেরি ইত্যাদি অন্তর্ভুক্ত থাকতে পারে আপনি যদি না অত্যন্ত প্রতিভাবান (গোটোব্ল্যাএলএস এর বিকাশকারী এর মতো) না হন তবে আপনি সম্ভবত পেশাদারদের পরাজিত করতে পারবেন না।

  2. আপনার কোডের কোন অংশটি বেশিরভাগ সময় নেয় তা খুঁজে পেতে প্রোফাইলার (নীচে তালিকার বেশ কয়েকটি এই থ্রেডটিতে ইতিমধ্যে নামকরণ করা হয়েছে - ইন্টেল টিউন, ভ্যালগ্রিন্ড, জিআরফোফ, জিসিভ, ইত্যাদি) ব্যবহার করুন। খুব কমই বলা হয় এমন কোডের অংশগুলির অনুকূলকরণে সময় নষ্ট করার কোনও অর্থ নেই।

  3. প্রোফাইলের ফলাফলগুলি থেকে, আপনার কোডটির অংশটি দেখুন যা সবচেয়ে বেশি সময় নিয়েছিল। আপনার অ্যালগরিদমের প্রকৃতি কী তা নির্ধারণ করুন - এটি কি সিপিইউ আবদ্ধ বা মেমরির সীমাবদ্ধ? প্রতিটির জন্য অপ্টিমাইজেশন কৌশলগুলির একটি আলাদা সেট প্রয়োজন। যদি আপনি প্রচুর ক্যাশে মিস করেন তবে মেমরিটি বাধা হয়ে দাঁড়াতে পারে - সিপিইউ মেমরিটি উপলব্ধ হওয়ার অপেক্ষা করে ঘড়ির চক্র নষ্ট করছে। লুপটি আপনার সিস্টেমের L1 / L2 / L3 ক্যাশে ফিট করে কিনা তা চিন্তা করুন। আপনার লুপটিতে যদি "যদি" বিবৃতি থাকে, তবে প্রোফাইলার শাখার ভুল সম্পর্কে কিছু বলেছেন কিনা তা পরীক্ষা করে দেখুন? আপনার সিস্টেমের শাখা ভুল অনুমানের জরিমানা কী? যাইহোক, আপনি ইন্টেল অপটিমাইজেশন রেফারেন্স ম্যানুয়ালগুলি [1] থেকে শাখার ভুল ধারণা ডেটা পেতে পারেন। মনে রাখবেন যে শাখার ভুল অনুমানের জরিমানাটি প্রসেসর-নির্দিষ্ট, যেমন আপনি ইন্টেল ম্যানুয়ালটিতে দেখবেন।

  4. শেষ পর্যন্ত, প্রোফাইলার দ্বারা চিহ্নিত সমস্যাগুলি সমাধান করুন। ইতিমধ্যে এখানে বেশ কয়েকটি কৌশল নিয়ে আলোচনা করা হয়েছে। অপ্টিমাইজেশানের উপর বেশ কয়েকটি ভাল, নির্ভরযোগ্য, বিস্তৃত সংস্থানগুলিও উপলভ্য। মাত্র দু'জনের নামকরণের জন্য, এখানে রয়েছে ইন্টেল অপটিমাইজেশন রেফারেন্স ম্যানুয়াল [1], এবং পাঁচটি অপ্টিমাইজেশন ম্যানুয়াল অ্যাগনার ফগ [২]। নোট করুন যে কয়েকটি জিনিস আপনার যা করার দরকার নেই, সংকলক যদি ইতিমধ্যে এটি করে থাকে - উদাহরণস্বরূপ, লুপ আনরোলিং, মেমরি সারিবদ্ধ করা ইত্যাদি আপনার সংকলক ডকুমেন্টেশন সাবধানে পড়ুন।

তথ্যসূত্র:

[1] ইন্টেল and৪ এবং আইএ -২২ আর্কিটেকচার অপ্টিমাইজেশন রেফারেন্স ম্যানুয়াল: http://www.intel.sg/content/dam/doc/manual/64-ia-32-architectures-optimization-manual.pdf

[2] আগ্নার কুয়াশা, "সফ্টওয়্যার অপ্টিমাইজেশন রিসোর্স": http://www.agner.org/optimize/

  • "সি ++ এ সফ্টওয়্যার অনুকূলকরণ: উইন্ডোজ, লিনাক্স এবং ম্যাক প্ল্যাটফর্মগুলির জন্য একটি অনুকূলিতকরণ গাইড"
  • "অ্যাসেম্বলি ভাষায় সাব্রোটাইনগুলি অনুকূল করা: x86 প্ল্যাটফর্মের জন্য একটি অনুকূলিতকরণ গাইড"
  • "ইনটেল, এএমডি এবং ভিআইএ সিপিইউগুলির মাইক্রোর্কিটেকচার: অ্যাসেম্বলি প্রোগ্রামার এবং সংকলক নির্মাতাদের জন্য একটি অনুকূলকরণ গাইড"
  • "নির্দেশের সারণী: ইন্টেল, এএমডি এবং ভিআইএ সিপিইউগুলির জন্য নির্দেশনা লেটেন্সি, থ্রুপুট এবং মাইক্রো-অপারেশন ব্রেকডাউনগুলির তালিকা"
  • "বিভিন্ন সি ++ কম্পাইলার এবং অপারেটিং সিস্টেমের জন্য আহ্বান আহ্বান"

3

আমি এখানে অন্য অনেকের মতো গণ্য বিজ্ঞানী নই (তাই আমি ভুল হতে পারি :)) তবে এই দিনগুলিতে যতক্ষণ না আমরা স্ট্যান্ডার্ড ল্যাব ব্যবহার করি ততক্ষণ সিরিয়াল অভিনয়ে খুব বেশি সময় ব্যয় করার সামান্য অর্থ নেই। কোডটিকে আরও স্কেলযোগ্য করার জন্য কোনও অতিরিক্ত সময় / প্রচেষ্টা ব্যয় করা আরও সার্থক হতে পারে।

যেভাবে ক্ষেত্রে পারফরম্যান্স কীভাবে উন্নত হয়েছিল সে সম্পর্কে এখানে দুটি উদাহরণ (যদি আপনি ইতিমধ্যে সেগুলি না পড়ে থাকেন) তবে (অনির্দিষ্ট কাঠামোগত FE সমস্যাগুলির জন্য)।

ক্রমিক : বিমূর্ত এবং সম্পর্কিত পাঠ্যের দ্বিতীয় অর্ধেক দেখুন।

সমান্তরাল : বিশেষত আরম্ভকরণের পর্যায়, ৪.২ সেকেন্ডে।


3

এটি সম্ভবত উত্তরের চেয়ে আরও একটি মেটা-উত্তর ...

আপনার কম্পাইলারের সাথে আপনাকে অবশ্যই একটি অন্তরঙ্গ পরিচিতি বিকাশ করতে হবে। ম্যানুয়ালটি পড়ে এবং বিকল্পগুলির সাথে পরীক্ষা করে আপনি সবচেয়ে দক্ষতার সাথে এটি অর্জন করতে পারেন।

@ পেড্রো বিতরণগুলি প্রোগ্রামের পরিবর্তে সংকলনটি সামঞ্জস্য করে কার্যকর করা যেতে পারে advice


আমি শেষ বিষয়টির সাথে একমত নই। আপনার সংকলকটি কী করতে পারে তা জেনে রাখা একটি জিনিস তবে আপনার কোডটি লিখতে যাতে আপনার সংকলকটি এটির সাথে আসলে কিছু করতে পারে তা সম্পূর্ণ ভিন্ন সমস্যা। এমন কোনও সংকলক পতাকা নেই যা আপনার জন্য আপনার ডেটা বাছাই করবে, প্রয়োজনের সময় কম নির্ভুলতা ব্যবহার করবে বা আপনার অভ্যন্তরীণ লুপগুলি আবার লিখবে যেমনগুলির কয়েকটি বা কোনও শাখা নেই। আপনার সংকলকটি জানা ভাল জিনিস তবে এটি আপনাকে আরও ভাল কোড লিখতে সহায়তা করবে এটি প্রতি কোড অনুযায়ী আপনার কোডকে আরও ভাল করে তুলবে না।
পেড্রো

1

কোনও প্রোগ্রাম প্রোফাইল করার একটি সহজ উপায় (লিনাক্সে) মোডে ব্যবহার perfকরা stat। সহজ উপায়টি কেবল এটির মতো চলছে

perf stat ./my_program args ...

এবং এটি আপনাকে কার্যকর পরিসংখ্যানের পরিসংখ্যানের একগুচ্ছ দেবে:

Performance counter stats for './simd_test1':

     3884.559489 task-clock                #    1.000 CPUs utilized
              18 context-switches          #    0.005 K/sec
               0 cpu-migrations            #    0.000 K/sec
             383 page-faults               #    0.099 K/sec
  10,911,904,779 cycles                    #    2.809 GHz
 <not supported> stalled-cycles-frontend
 <not supported> stalled-cycles-backend
  14,346,983,161 instructions              #    1.31  insns per cycle
   2,143,017,630 branches                  #  551.676 M/sec
          28,892 branch-misses             #    0.00% of all branches

     3.885986246 seconds time elapsed

কখনও কখনও এটি ডি-ক্যাশে লোড এবং মিসগুলিও তালিকাভুক্ত করে। যদি আপনি প্রচুর ক্যাশে মিস করেন তবে আপনার প্রোগ্রামটি মেমরি নিবিড় এবং ক্যাশেগুলি ভালভাবে আচরণ করে না। এই দিনগুলিতে, সিপিইউগুলি মেমরি ব্যান্ডউইথের থেকে দ্রুততর হচ্ছে এবং সাধারণত সমস্যাটি সর্বদা মেমরি অ্যাক্সেস হয়।

perf record ./my_program; perf reportযা আপনি চেষ্টা করতে পারেন যা প্রোফাইলের একটি সহজ উপায়। আরও জানতে ম্যান পেজগুলি পড়ুন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.