প্রোফাইল-নির্দেশিত অপ্টিমাইজেশান

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

PGO নিম্নলিখিত পদক্ষেপগুলি সহ আপনার অ্যাপ্লিকেশন বা লাইব্রেরিতে স্থাপন করা যেতে পারে: 1. একটি প্রতিনিধি কাজের চাপ সনাক্ত করুন। 2. প্রোফাইল সংগ্রহ করুন। ৩. একটি রিলিজ বিল্ডে প্রোফাইলগুলি ব্যবহার করুন।

পদক্ষেপ 1: একটি প্রতিনিধি কাজের চাপ সনাক্ত করুন

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

সাধারণভাবে কর্মক্ষমতা ট্র্যাক রাখতে একটি ভাল কাজের চাপ সনাক্ত করাও উপকারী।

ধাপ 2: প্রোফাইল সংগ্রহ করুন

Profile collection involves three steps: - building native code with instrumentation, - running the instrumented app on the device and generating profiles, and - merging/post-processing the profiles on the host.

সরঞ্জামযুক্ত বিল্ড তৈরি করুন

অ্যাপ্লিকেশনটির একটি ইন্সট্রুমেন্টেড বিল্ডে ধাপ 1 থেকে কাজের চাপ চালিয়ে প্রোফাইলগুলি সংগ্রহ করা হয়। একটি ইন্সট্রুমেন্টেড বিল্ড তৈরি করতে, কম্পাইলার এবং লিঙ্কার ফ্ল্যাগে -fprofile-generate যোগ করুন। এই পতাকাটি একটি পৃথক বিল্ড ভেরিয়েবল দ্বারা নিয়ন্ত্রিত হওয়া উচিত কারণ একটি ডিফল্ট বিল্ডের সময় পতাকার প্রয়োজন হয় না।

প্রোফাইল তৈরি করুন

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

প্রোফাইল ফাইলের জন্য একটি পাথ সেট করার জন্য অ্যাপ্লিকেশন/ওয়ার্কলোডকে অতিরিক্ত কাজ করতে হবে এবং তারপরে স্পষ্টভাবে একটি প্রোফাইল লেখা ট্রিগার করতে হবে।

  • To set the profile file path, call __llvm_profile_set_filename(PROFILE_DIR "/default-%m.profraw . %m is useful when there are multiple shared libraries. %m` expands to a unique module signature for that library, resulting in a separate profile per library. See here for other useful pattern specifiers. PROFILE_DIR is a directory that is writable from the app. See the demo for detecting this directory at runtime.
  • স্পষ্টভাবে একটি প্রোফাইল লিখতে ট্রিগার করতে, __llvm_profile_write_file ফাংশনটি কল করুন।
extern "C" {
extern int __llvm_profile_set_filename(const char*);
extern int __llvm_profile_write_file(void);
}

#define PROFILE_DIR "<location-writable-from-app>"
void workload() {
  // ...
  // run workload
  // ...

  // set path and write profiles after workload execution
  __llvm_profile_set_filename(PROFILE_DIR "/default-%m.profraw");
  __llvm_profile_write_file();
  return;
}

NB: Generating the profile file is simpler if the workload is a standalone binary — just set the LLVM_PROFILE_FILE environment variable to %t/default-%m.profraw before running the binary.

পোস্ট-প্রসেস প্রোফাইল

প্রোফাইল ফাইলগুলি .profraw ফর্ম্যাটে রয়েছে। এগুলি প্রথমে adb pull ব্যবহার করে ডিভাইস থেকে আনতে হবে। আনার পরে, .profraw থেকে .profdata তে রূপান্তর করতে NDK-তে llvm-profdata ইউটিলিটি ব্যবহার করুন, যা পরে কম্পাইলারের কাছে পাঠানো যেতে পারে।

$NDK/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-profdata \
    merge --output=pgo_profile.profdata \
    <list-of-profraw-files>

প্রোফাইল ফাইল ফরম্যাটের সংস্করণের অমিল এড়াতে একই NDK রিলিজ থেকে llvm-profdata এবং clang ব্যবহার করুন।

পদক্ষেপ 3 অ্যাপ্লিকেশন তৈরি করতে প্রোফাইলগুলি ব্যবহার করুন

আপনার অ্যাপ্লিকেশনটির একটি রিলিজ বিল্ডের সময় পূর্ববর্তী পদক্ষেপ থেকে প্রোফাইলটি ব্যবহার করুন -fprofile-use=<>.profdata । কোড বিকশিত হওয়ার সাথে সাথে প্রোফাইলগুলি ব্যবহার করা যেতে পারে — ক্ল্যাং কম্পাইলার উত্স এবং প্রোফাইলগুলির মধ্যে সামান্য অমিল সহ্য করতে পারে।

NB: সাধারণভাবে, বেশিরভাগ লাইব্রেরির জন্য, প্রোফাইলগুলি আর্কিটেকচার জুড়ে সাধারণ। উদাহরণস্বরূপ, লাইব্রেরির arm64 বিল্ড থেকে উত্পন্ন প্রোফাইলগুলি সমস্ত আর্কিটেকচারের জন্য ব্যবহার করা যেতে পারে। সতর্কতাটি হ'ল যদি লাইব্রেরিতে আর্কিটেকচার-নির্দিষ্ট কোড পাথ থাকে (আর্ম বনাম x86 বা 32-বিট বনাম 64-বিট), এই জাতীয় প্রতিটি কনফিগারেশনের জন্য পৃথক প্রোফাইল ব্যবহার করা উচিত।

এটা সব একসাথে নির্বাণ

https://github.com/DanAlbert/ndk-samples/tree/pgo/pgo একটি অ্যাপ থেকে পিজিও ব্যবহার করার জন্য একটি এন্ড-টু-এন্ড ডেমো দেখায়। এটি অতিরিক্ত বিশদ প্রদান করে যা এই ডকটিতে স্কিম করা হয়েছে।

  • CMake বিল্ড নিয়মগুলি দেখায় কিভাবে একটি CMake ভেরিয়েবল সেটআপ করতে হয় যা ইন্সট্রুমেন্টেশনের সাথে নেটিভ কোড তৈরি করে। যখন বিল্ড ভেরিয়েবল সেট করা হয় না, তখন পূর্বে তৈরি করা PGO প্রোফাইল ব্যবহার করে নেটিভ কোড অপ্টিমাইজ করা হয়।
  • একটি ইন্সট্রুমেন্টেড বিল্ডে, pgodemo.cpp লেখে যে প্রোফাইলগুলি হল ওয়ার্কলোড এক্সিকিউশন।
  • applicationContext.cacheDir.toString() ব্যবহার করে MainActivity.kt- এ রানটাইমে প্রোফাইলগুলির জন্য একটি লিখনযোগ্য অবস্থান পাওয়া যায়।
  • adb root ছাড়াই ডিভাইস থেকে প্রোফাইল টেনে আনতে, এখানে adb রেসিপিটি ব্যবহার করুন।