বৈজ্ঞানিক সফ্টওয়্যার কতটা অপ্টিমাইজ করা উচিত?


13

বৈজ্ঞানিক ফলাফল সরবরাহ করার বা যুক্তিসঙ্গত সময়ে "ব্রেক-থ্রো" অর্জন করার ক্ষেত্রে উচ্চতর কার্যকারিতা একটি গুরুত্বপূর্ণ বিষয় হতে পারে significant

সফ্টওয়্যার বিকাশকারীদের একটি অ্যাপ্লিকেশন অনুকূলকরণে কত সময় এবং প্রচেষ্টা বিনিয়োগ করা উচিত? মূল মানদণ্ডগুলি কী কী ব্যবহার করা হয়?


বিজ্ঞানীরা যে প্রোগ্রামগুলি প্রায়শই লেখেন এটি খুব দীর্ঘ সময়ের জন্য চালিত হয় (যেমন সিমুলেশন)। প্রোগ্রামার সময় এবং কম্পিউটার চলমান সময় তুলনীয় হতে পারে। এটি আজকের "স্বাভাবিক" প্রোগ্রামার কাজের থেকে খুব আলাদা। কম্পিউটিংয়ের প্রথম দিনগুলির মতো, সিমুলেশনটি আরও দ্রুত তৈরি করতে এবং আরও দ্রুত শেষ করতে এবং কাজটি দ্রুত সম্পন্ন করার জন্য প্রায়শই কিছু প্রচেষ্টা (এবং প্রোগ্রামার সময়) বিনিয়োগ করা উপযুক্ত।
Szabolcs

উত্তর:


15

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

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

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


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

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

1
@ অ্যালান: একটি একক পরিবর্তন থেকে 10,000 ফ্যাক্টর পাওয়া গেল তখন অবশ্যই এটি একটি অ -নির্বাচিত বাস্তবায়ন ছিল। পূর্ববর্তী কোডটি সময় জটিলতার কারণে অপ্রয়োজনীয় স্থান দ্বারা ততটা আহত হয়েছিল: ক্যাচিং পারফরম্যান্সটি অত্যাশ্চর্য ছিল। তবে কথাটা কি তাই না?
dmckee --- প্রাক্তন-মডারেটর বিড়ালছানা

8

আপনি কীভাবে "অনুকূলিতকরণ" সংজ্ঞায়িত করবেন? হ্যান্ড-টিউনড অ্যাসেমব্লারারের সাহায্যে আরও ভাল অ্যালগরিদম বা গণনার মডেলগুলির বিকাশ থেকে শুরু করে পুরো স্পেকট্রাম রয়েছে।

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

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

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


4

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

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

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


4

মৃত্যুদন্ড কার্যকর করার গতি অর্জনে আপনাকে এত বেশি লোক-মাস (এবং এগুলি সর্বদা পৌরাণিক :-)) ব্যয় করার (ব্যয়) বিশ্লেষণ করতে হবে। আপনাকে বুঝতে হবে যে এই সফ্টওয়্যারটির টুকরোটি কতবার ব্যবহৃত হবে এবং কত লোকের দ্বারা আপনি লাভটি অনুমান করতে পারেন।

থাম্বের নিয়ম, সর্বদা হিসাবে, বিখ্যাত 80/20 নিয়ম rule কিছু মুহুর্তে এটি চলমান সময় কয়েক শতাংশ (বা তারও কম) অর্জনে আরও বেশি বেশি সময় ব্যয় করার জন্য আর কোনও যোগ দেয় না। তবে আপনাকে বিশ্লেষণ করতে হবে।

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

ডোনাল্ড নুথকে উদ্ধৃত করার জন্য: "অকালীন অপটিমাইজেশন হ'ল সমস্ত মন্দের মূল" " সুতরাং আপনার কোড প্রোফাইল করুন, তবে খুব শীঘ্রই নয়।


আপনি কি পেরেটো নীতি (80/20) বিধি সম্পর্কে উল্লেখ করছেন? যদি তা হয়, তবে আপনার অর্থ কি এই যে 20% কোডটি ধীর-ডাউনের 80% উত্পাদন করে তার উপর আমাদের অপ্টিমাইজেশনের প্রচেষ্টাগুলিকে ফোকাস করা উচিত? অথবা আপনি যদি বলতে চান যে আপনি যদি কেবলমাত্র 20% স্পিডআপ আশা করতে পারেন, তবে এটি কেবল অপ্টিমাইজ করার মতো নয়?
পল

না, আমি এটিকে কেবল একধরণের নীতি হিসাবে ব্যবহার করেছি, ঠিক 80/20 নয়। কিছু মুহুর্তে, আপনি মাত্র কয়েক শতাংশ অর্জনে এত প্রচেষ্টা ব্যয় করবেন যে এটি আর চেষ্টা করার মতো নয়।
GertVdE

3

কিছু অতিরিক্ত পরামর্শ:

  1. কোনও কার্যনির্বাহী প্রোগ্রামের কোনও অপ্টিমাইজেশন করার আগে, নিশ্চিত হয়ে নিন যে আপনার কাছে পরীক্ষার কেসগুলির একটি ভাল সেট রয়েছে যা কোডের অখণ্ডতা বজায় রাখতে সহায়তা করে। দ্রুত ভুল ফলাফল পাওয়ার কোনও মানে নেই।
  2. যদি আপনার অপ্টিমাইজেশন কোডটি কম পাঠযোগ্য করে তোলে তবে মূল সংস্করণটি কমপক্ষে কমেন্টের আকারে রাখুন, তবে সংকলন ও রান টাইমে বিকল্প সংস্করণ হিসাবে বেছে নেওয়া আরও ভাল। আপনার সমস্যা এবং আপনার মেশিনগুলি বিকশিত হওয়ার সাথে সাথে আপনার অপ্টিমাইজেশনের প্রয়োজনীয়তাগুলি পরিবর্তিত হতে পারে এবং আপনি এখন থেকে পাঁচ বছর ধরে অপ্টিমাইজেশনের জন্য মূল কোডটি আরও ভাল সূচনা পয়েন্ট হতে পারে।
  3. যদি আপনার অনুকূলিত সংস্করণটি সর্বনিম্ন প্রভাবের হয়ে থাকে তবে কোডটি কম পাঠযোগ্য, কম সার্বজনীন, বা কম স্থিতিশীল করে তোলে তবে মূল সংস্করণে ফিরে যান। আপনি লাভের চেয়ে বেশি হারান lose
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.