কীভাবে অন্যকে "স্বীকৃতি ছাড়াই অপ্টিমাইজড" গণনাগত নিবিড় কোড শেখানো যায়?


11

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

লক্ষ্যগুলি হ'ল ডকুমেন্ট করা, এবং অপ্টিমাইজেশন কৌশলগুলি শেখানো, যাতে কোডটি অপরিবর্তনীয় না হয় এবং নতুন বিকাশকারীদের দ্বারা অপসারণের প্রবণ না হয়। (*)

(*) সম্ভাব্যতা সত্ত্বেও কিছু অপ্রকাশিত ভবিষ্যতের সিপিইউগুলিতে নির্দিষ্ট অপ্টিমাইজেশন সম্পূর্ণরূপে অকেজো, যেমন কোড যাইহোক মুছে ফেলা হবে।

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

সাধারণত, একটি সফ্টওয়্যার লেখক স্থান গ্রহণ প্রতিটি অপ্টিমাইজেশন / অ্যালগরিদম পুনর্লিখনের ডকুমেন্টেশন হিসাবে একটি ফাংশনের অনেকগুলি সংস্করণ রাখতে পারে। অন্যরা কীভাবে তাদের অপ্টিমাইজেশান কৌশলগুলি অধ্যয়নের জন্য এই সংস্করণগুলি উপলব্ধ করে?

সম্পর্কিত:


1
আপনি কোডটিতে বিভিন্ন সংস্করণ রেখেছিলেন, মন্তব্য করা হয়েছে, প্রচুর মন্তব্য সহ পাঠককে কী চলছে তা বলার জন্য।
মাইক ডুনলাভে

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

1
@ মাইকডুনলাভে: ওহ, দয়া করে এটির মন্তব্য করবেন না। একই ফাংশনের বেশ কয়েকটি বাস্তবায়ন রয়েছে এবং দ্রুততমটিকে কল করুন। এইভাবে আপনি সহজেই কোডের ভিন্ন সংস্করণে স্যুইচ করতে পারেন এবং সেগুলি সমস্ত বেনমার্ক করতে পারেন।
sleske

2
@ সালস্কে কখনও কখনও কেবলমাত্র আরও বাইনারি কোড থাকলে এটি ধীর হতে পারে।
কোয়ান্ট_দেব

@ কোয়ান্ট_দেব: হ্যাঁ, এটি ঘটতে পারে। আমি শুধু মনে করি যে কোডটি আপ টু ডেট রাখার জন্য নিয়মিত তৈরি করা এবং নিয়মিত চালানো (আদর্শভাবে) করা গুরুত্বপূর্ণ। সম্ভবত এটি কেবল ডিবাগ মোডে তৈরি করুন।
sleske

উত্তর:


10

সংক্ষিপ্ত উত্তর

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

পুরো উত্তর

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

আদর্শভাবে, আপনাকে আপনার বিল্ড প্রক্রিয়াতে পারফরম্যান্স টেস্টিং সন্নিবেশ করা দরকার, সুতরাং নতুন প্রযুক্তিগুলি পুরানো অপ্টিমাইজেশনকে অকার্যকর করার সময় আপনি খুঁজে পেতে পারেন।

মনে রাখবেন:

প্রোগ্রাম অপ্টিমাইজেশনের প্রথম বিধি: এটি করবেন না।

প্রোগ্রাম অপ্টিমাইজেশনের দ্বিতীয় বিধি (কেবল বিশেষজ্ঞদের জন্য!): এটি এখনও করবেন না ""

- মাইকেল এ। জ্যাকসন

এখন সময় বেঞ্চমার্কিং এবং পরীক্ষার প্রয়োজন কিনা তা জানতে ।

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

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

উদাহরণ

উদাহরণস্বরূপ, ধরুন আপনার কাছে একটি ফাস্ট ফুরিয়ার ট্রান্সফর্ম ফাংশন রয়েছে। হতে পারে আপনার মধ্যে একটি মৌলিক, অ্যালগরিদমিক বাস্তবায়ন fft.cএবং এর মধ্যে পরীক্ষা রয়েছে fft_tests.c

তারপরে পেন্টিয়ামের পাশাপাশি আসে এবং আপনি এমএমএক্স নির্দেশাবলীfft_mmx.c ব্যবহারের ক্ষেত্রে নির্দিষ্ট পয়েন্ট সংস্করণ প্রয়োগ করার সিদ্ধান্ত নেন । পরে পেন্টিয়াম 3 বরাবর আসে এবং আপনি স্ট্রিমিং সিমডি এক্সটেনশানগুলি ব্যবহার করে এমন একটি সংস্করণ যুক্ত করার সিদ্ধান্ত নেন ।fft_sse.c

এখন আপনি CUDA যুক্ত করতে চান , তাই আপনি যুক্ত করুন fft_cuda.cতবে আপনি বছরের পর বছর ধরে যে টেস্ট ডেটাসেটটি ব্যবহার করে চলেছেন তা দিয়ে সিউডিএ সংস্করণটি এসএসই সংস্করণটির চেয়ে ধীরতর! আপনি কিছু বিশ্লেষণ করেন এবং একটি ডেটাসেট যোগ করেন যা 100 গুণ বড় এবং আপনি প্রত্যাশিত গতি অর্জন করেন তবে এখন আপনি জানেন যে CUDA সংস্করণটি ব্যবহারের জন্য সেট আপের সময়টি তাৎপর্যপূর্ণ এবং ছোট ডেটাসেটের সাহায্যে আপনার একটি ব্যবহার করা উচিত সেট আপ ব্যয় ছাড়াই অ্যালগরিদম।

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

এর সবগুলিই ওওপি বাস্তবায়নের জন্য যায় যেখানে একটি বেস ক্লাস যা অরক্ষিত অ্যালগরিদম প্রয়োগ করে এবং উত্পন্ন ক্লাসগুলি বিভিন্ন অপ্টিমাইজেশন প্রয়োগ করে।

গুরুত্বপূর্ণ বিষয় হ'ল একই জিনিসগুলি একই রাখুন , যাতে পার্থক্য সুস্পষ্ট হয়


7

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

আপনি উল্লেখ না করেই, আমি Cএখানে ধরে নিচ্ছি ।

Cকোডের সবচেয়ে সহজ উপায় , একটি অপ্টিমাইজেশন করে (এবং জিনিসগুলি পোর্টেবল করার চেষ্টা করার সময়ও প্রযোজ্য) তা রাখা হয়

 
#ifdef OPTIMIZATION_XYZ_ENABLE 
   // your optimzied code here... 
#else  
   // your basic code here...

আপনি যখন #define OPTIMIZATION_XYZ_ENABLEমেকফাইলে সংকলনের সময় সক্ষম করেন তখন সবকিছু সেই অনুযায়ী কাজ করে।

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

মূল কোডটি সর্বদা একটি ফাংশন পয়েন্টারের মাধ্যমে কার্যকর করে


   codec->computed_idct(blocks); 

তবে ফাংশন পয়েন্টারগুলি উদাহরণের ধরণের উপর নির্ভর করে সংজ্ঞায়িত করা হয় (উদাহরণস্বরূপ, আইডিটি ফাংশনটি বিভিন্ন সিপিইউ আর্কিটেকচারের জন্য অনুকূলিত হয়েছে)।



if(OPTIMIZE_X86) {
  codec->computed_idct = compute_idct_x86; 
}
else if(OPTIMZE_ARM) {
  codec->computed_idct = compute_idct_ARM;
}
else {
  codec->computed_idct = compute_idct_C; 
}

আপনি দেখতে পাবেন libjpeg কোড এবং libmpeg2 কোড এবং হতে পারে ffmpeg যেমন কৌশল জন্য।


6

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

আমি খুঁজে পেয়েছি যে এই পদক্ষেপটি সফলভাবে শেষ করার জন্য তিনটি প্রয়োজনীয় উপাদান রয়েছে

  1. ব্যবহৃত অ্যালগরিদম অবশ্যই একদম পরিষ্কার be
  2. বাস্তবায়নের প্রতিটি লাইনের উদ্দেশ্য অবশ্যই পরিষ্কার হতে হবে।
  3. প্রত্যাশিত ফলাফল থেকে বিচ্যুতি যত তাড়াতাড়ি সম্ভব সনাক্ত করা উচিত।

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

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

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

আমার সবচেয়ে আন্তরিক সুপারিশটি হ'ল কোনও পদক্ষেপের হাতছাড়া না করা। আপনার পরে এগুলি প্রয়োজন হবে;)


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

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

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

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

5

আমি বিশ্বাস করি যে কোডটির বিস্তৃত মন্তব্য করার মাধ্যমে এটি সর্বোত্তমভাবে সমাধান করা হবে, যেখানে কোডের প্রতিটি উল্লেখযোগ্য ব্লকের আগে থেকেই ব্যাখ্যামূলক মন্তব্য রয়েছে।

মন্তব্যে স্পেসিফিকেশন বা হার্ডওয়্যার রেফারেন্স উপাদানগুলির উদ্ধৃতি অন্তর্ভুক্ত করা উচিত।

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

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

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


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