প্রোফাইল-গাইডেড অপ্টিমাইজেশান (PGO) একটি সুপরিচিত কম্পাইলার অপ্টিমাইজেশান কৌশল। PGO-তে, একটি প্রোগ্রামের এক্সিকিউশন থেকে রানটাইম প্রোফাইলগুলি ইনলাইনিং এবং কোড লেআউট সম্পর্কে সর্বোত্তম পছন্দ করতে কম্পাইলার দ্বারা ব্যবহার করা হয়। এটি উন্নত কর্মক্ষমতা এবং হ্রাস কোড আকার বাড়ে.
PGO নিম্নলিখিত পদক্ষেপগুলি সহ আপনার অ্যাপ্লিকেশন বা লাইব্রেরিতে স্থাপন করা যেতে পারে: 1. একটি প্রতিনিধি কাজের চাপ সনাক্ত করুন। 2. প্রোফাইল সংগ্রহ করুন। 3. একটি রিলিজ বিল্ডে প্রোফাইলগুলি ব্যবহার করুন৷
ধাপ 1: একটি প্রতিনিধি কাজের চাপ সনাক্ত করুন
প্রথমে, আপনার আবেদনের জন্য একটি প্রতিনিধি বেঞ্চমার্ক বা কাজের চাপ শনাক্ত করুন। এটি একটি গুরুত্বপূর্ণ পদক্ষেপ কারণ কাজের চাপ থেকে সংগৃহীত প্রোফাইলগুলি কোডের গরম এবং ঠান্ডা অঞ্চলগুলিকে চিহ্নিত করে৷ প্রোফাইলগুলি ব্যবহার করার সময়, কম্পাইলার আক্রমনাত্মক অপ্টিমাইজেশন এবং গরম অঞ্চলে ইনলাইনিং সঞ্চালন করবে। কম্পাইলার পারফরম্যান্স বন্ধ করার সময় ঠান্ডা অঞ্চলের কোড আকার কমাতেও বেছে নিতে পারে।
সাধারণভাবে কর্মক্ষমতা ট্র্যাক রাখতে একটি ভাল কাজের চাপ সনাক্ত করাও উপকারী।
ধাপ 2: প্রোফাইল সংগ্রহ করুন
প্রোফাইল সংগ্রহের তিনটি ধাপ রয়েছে: - ইন্সট্রুমেন্টেশন সহ নেটিভ কোড তৈরি করা, - ডিভাইসে ইন্সট্রুমেন্টেড অ্যাপ চালানো এবং প্রোফাইল তৈরি করা, এবং - হোস্টে প্রোফাইলগুলি মার্জ/পোস্ট-প্রসেস করা।
ইন্সট্রুমেন্টেড বিল্ড তৈরি করুন
অ্যাপ্লিকেশনটির একটি ইন্সট্রুমেন্টেড বিল্ডে ধাপ 1 থেকে কাজের চাপ চালিয়ে প্রোফাইলগুলি সংগ্রহ করা হয়। একটি ইন্সট্রুমেন্টেড বিল্ড তৈরি করতে, কম্পাইলার এবং লিঙ্কার ফ্ল্যাগে -fprofile-generate
যোগ করুন। এই পতাকাটি একটি পৃথক বিল্ড ভেরিয়েবল দ্বারা নিয়ন্ত্রিত হওয়া উচিত কারণ একটি ডিফল্ট বিল্ডের সময় পতাকার প্রয়োজন হয় না।
প্রোফাইল তৈরি করুন
এরপরে, ডিভাইসে ইন্সট্রুমেন্টেড অ্যাপ চালান এবং প্রোফাইল তৈরি করুন। প্রোফাইলগুলি মেমরিতে সংগ্রহ করা হয় যখন ইনস্ট্রুমেন্টেড বাইনারি চালানো হয় এবং প্রস্থান করার সময় একটি ফাইলে লেখা হয়। যাইহোক, atexit
সাথে নিবন্ধিত ফাংশনগুলিকে একটি অ্যান্ড্রয়েড অ্যাপে কল করা হয় না - অ্যাপটি কেবল মারা যায়।
প্রোফাইল ফাইলের জন্য একটি পাথ সেট করার জন্য অ্যাপ্লিকেশন/ওয়ার্কলোডকে অতিরিক্ত কাজ করতে হবে এবং তারপরে স্পষ্টভাবে একটি প্রোফাইল লেখা ট্রিগার করতে হবে।
- প্রোফাইল ফাইল পাথ সেট করতে,
__llvm_profile_set_filename(PROFILE_DIR "/default-%m.profraw
এ কল করুন। একাধিক ভাগ করা লাইব্রেরি থাকলে%m
উপযোগী হয়।%m
সেই লাইব্রেরির জন্য একটি অনন্য মডিউল স্বাক্ষরে প্রসারিত হয়, যার ফলে প্রতি লাইব্রেরিতে একটি পৃথক প্রোফাইল তৈরি হয়। অন্যান্য দরকারী প্যাটার্ন স্পেসিফায়ারের জন্য এখানে দেখুনPROFILE_DIR
হল একটি ডিরেক্টরী যা রানটাইমে এই ডিরেক্টরিটি সনাক্ত করার জন্য। - স্পষ্টভাবে একটি প্রোফাইল লিখতে ট্রিগার করতে,
__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;
}
দ্রষ্টব্য: প্রোফাইল ফাইল তৈরি করা সহজ যদি কাজের চাপটি একটি স্বতন্ত্র বাইনারি হয় — বাইনারি চালানোর আগে শুধু LLVM_PROFILE_FILE
এনভায়রনমেন্ট ভেরিয়েবলটিকে %t/default-%m.profraw
এ সেট করুন।
পোস্ট-প্রসেস প্রোফাইল
প্রোফাইল ফাইল .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
রেসিপিটি ব্যবহার করুন।
প্রোফাইল-গাইডেড অপ্টিমাইজেশান (PGO) একটি সুপরিচিত কম্পাইলার অপ্টিমাইজেশান কৌশল। PGO-তে, একটি প্রোগ্রামের এক্সিকিউশন থেকে রানটাইম প্রোফাইলগুলি ইনলাইনিং এবং কোড লেআউট সম্পর্কে সর্বোত্তম পছন্দ করতে কম্পাইলার দ্বারা ব্যবহার করা হয়। এটি উন্নত কর্মক্ষমতা এবং হ্রাস কোড আকার বাড়ে.
PGO নিম্নলিখিত পদক্ষেপগুলি সহ আপনার অ্যাপ্লিকেশন বা লাইব্রেরিতে স্থাপন করা যেতে পারে: 1. একটি প্রতিনিধি কাজের চাপ সনাক্ত করুন। 2. প্রোফাইল সংগ্রহ করুন। 3. একটি রিলিজ বিল্ডে প্রোফাইলগুলি ব্যবহার করুন৷
ধাপ 1: একটি প্রতিনিধি কাজের চাপ সনাক্ত করুন
প্রথমে, আপনার আবেদনের জন্য একটি প্রতিনিধি বেঞ্চমার্ক বা কাজের চাপ শনাক্ত করুন। এটি একটি গুরুত্বপূর্ণ পদক্ষেপ কারণ কাজের চাপ থেকে সংগৃহীত প্রোফাইলগুলি কোডের গরম এবং ঠান্ডা অঞ্চলগুলিকে চিহ্নিত করে৷ প্রোফাইলগুলি ব্যবহার করার সময়, কম্পাইলার আক্রমনাত্মক অপ্টিমাইজেশন এবং গরম অঞ্চলে ইনলাইনিং সঞ্চালন করবে। কম্পাইলার পারফরম্যান্স বন্ধ করার সময় ঠান্ডা অঞ্চলের কোড আকার কমাতেও বেছে নিতে পারে।
সাধারণভাবে কর্মক্ষমতা ট্র্যাক রাখতে একটি ভাল কাজের চাপ সনাক্ত করাও উপকারী।
ধাপ 2: প্রোফাইল সংগ্রহ করুন
প্রোফাইল সংগ্রহের তিনটি ধাপ রয়েছে: - ইন্সট্রুমেন্টেশন সহ নেটিভ কোড তৈরি করা, - ডিভাইসে ইন্সট্রুমেন্টেড অ্যাপ চালানো এবং প্রোফাইল তৈরি করা, এবং - হোস্টে প্রোফাইলগুলি মার্জ/পোস্ট-প্রসেস করা।
ইন্সট্রুমেন্টেড বিল্ড তৈরি করুন
অ্যাপ্লিকেশনটির একটি ইন্সট্রুমেন্টেড বিল্ডে ধাপ 1 থেকে কাজের চাপ চালিয়ে প্রোফাইলগুলি সংগ্রহ করা হয়। একটি ইন্সট্রুমেন্টেড বিল্ড তৈরি করতে, কম্পাইলার এবং লিঙ্কার ফ্ল্যাগে -fprofile-generate
যোগ করুন। এই পতাকাটি একটি পৃথক বিল্ড ভেরিয়েবল দ্বারা নিয়ন্ত্রিত হওয়া উচিত কারণ একটি ডিফল্ট বিল্ডের সময় পতাকার প্রয়োজন হয় না।
প্রোফাইল তৈরি করুন
এরপরে, ডিভাইসে ইন্সট্রুমেন্টেড অ্যাপ চালান এবং প্রোফাইল তৈরি করুন। প্রোফাইলগুলি মেমরিতে সংগ্রহ করা হয় যখন ইনস্ট্রুমেন্টেড বাইনারি চালানো হয় এবং প্রস্থান করার সময় একটি ফাইলে লেখা হয়। যাইহোক, atexit
সাথে নিবন্ধিত ফাংশনগুলিকে একটি অ্যান্ড্রয়েড অ্যাপে কল করা হয় না - অ্যাপটি কেবল মারা যায়।
প্রোফাইল ফাইলের জন্য একটি পাথ সেট করার জন্য অ্যাপ্লিকেশন/ওয়ার্কলোডকে অতিরিক্ত কাজ করতে হবে এবং তারপরে স্পষ্টভাবে একটি প্রোফাইল লেখা ট্রিগার করতে হবে।
- প্রোফাইল ফাইল পাথ সেট করতে,
__llvm_profile_set_filename(PROFILE_DIR "/default-%m.profraw
এ কল করুন। একাধিক ভাগ করা লাইব্রেরি থাকলে%m
উপযোগী হয়।%m
সেই লাইব্রেরির জন্য একটি অনন্য মডিউল স্বাক্ষরে প্রসারিত হয়, যার ফলে প্রতি লাইব্রেরিতে একটি পৃথক প্রোফাইল তৈরি হয়। অন্যান্য দরকারী প্যাটার্ন স্পেসিফায়ারের জন্য এখানে দেখুনPROFILE_DIR
হল একটি ডিরেক্টরী যা রানটাইমে এই ডিরেক্টরিটি সনাক্ত করার জন্য। - স্পষ্টভাবে একটি প্রোফাইল লিখতে ট্রিগার করতে,
__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;
}
দ্রষ্টব্য: প্রোফাইল ফাইল তৈরি করা সহজ যদি কাজের চাপটি একটি স্বতন্ত্র বাইনারি হয় — বাইনারি চালানোর আগে শুধু LLVM_PROFILE_FILE
এনভায়রনমেন্ট ভেরিয়েবলটিকে %t/default-%m.profraw
এ সেট করুন।
পোস্ট-প্রসেস প্রোফাইল
প্রোফাইল ফাইল .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
রেসিপিটি ব্যবহার করুন।
প্রোফাইল-গাইডেড অপ্টিমাইজেশান (PGO) একটি সুপরিচিত কম্পাইলার অপ্টিমাইজেশান কৌশল। PGO-তে, একটি প্রোগ্রামের এক্সিকিউশন থেকে রানটাইম প্রোফাইলগুলি ইনলাইনিং এবং কোড লেআউট সম্পর্কে সর্বোত্তম পছন্দ করতে কম্পাইলার দ্বারা ব্যবহার করা হয়। এটি উন্নত কর্মক্ষমতা এবং হ্রাস কোড আকার বাড়ে.
PGO নিম্নলিখিত পদক্ষেপগুলি সহ আপনার অ্যাপ্লিকেশন বা লাইব্রেরিতে স্থাপন করা যেতে পারে: 1. একটি প্রতিনিধি কাজের চাপ সনাক্ত করুন। 2. প্রোফাইল সংগ্রহ করুন। 3. একটি রিলিজ বিল্ডে প্রোফাইলগুলি ব্যবহার করুন৷
ধাপ 1: একটি প্রতিনিধি কাজের চাপ সনাক্ত করুন
প্রথমে, আপনার আবেদনের জন্য একটি প্রতিনিধি বেঞ্চমার্ক বা কাজের চাপ শনাক্ত করুন। এটি একটি গুরুত্বপূর্ণ পদক্ষেপ কারণ কাজের চাপ থেকে সংগৃহীত প্রোফাইলগুলি কোডের গরম এবং ঠান্ডা অঞ্চলগুলিকে চিহ্নিত করে৷ প্রোফাইলগুলি ব্যবহার করার সময়, কম্পাইলার আক্রমনাত্মক অপ্টিমাইজেশন এবং গরম অঞ্চলে ইনলাইনিং সঞ্চালন করবে। কম্পাইলার পারফরম্যান্স বন্ধ করার সময় ঠান্ডা অঞ্চলের কোড আকার কমাতেও বেছে নিতে পারে।
সাধারণভাবে কর্মক্ষমতা ট্র্যাক রাখতে একটি ভাল কাজের চাপ সনাক্ত করাও উপকারী।
ধাপ 2: প্রোফাইল সংগ্রহ করুন
প্রোফাইল সংগ্রহের তিনটি ধাপ রয়েছে: - ইন্সট্রুমেন্টেশন সহ নেটিভ কোড তৈরি করা, - ডিভাইসে ইন্সট্রুমেন্টেড অ্যাপ চালানো এবং প্রোফাইল তৈরি করা, এবং - হোস্টে প্রোফাইলগুলি মার্জ/পোস্ট-প্রসেস করা।
ইন্সট্রুমেন্টেড বিল্ড তৈরি করুন
অ্যাপ্লিকেশনটির একটি ইন্সট্রুমেন্টেড বিল্ডে ধাপ 1 থেকে কাজের চাপ চালিয়ে প্রোফাইলগুলি সংগ্রহ করা হয়। একটি ইন্সট্রুমেন্টেড বিল্ড তৈরি করতে, কম্পাইলার এবং লিঙ্কার ফ্ল্যাগে -fprofile-generate
যোগ করুন। এই পতাকাটি একটি পৃথক বিল্ড ভেরিয়েবল দ্বারা নিয়ন্ত্রিত হওয়া উচিত কারণ একটি ডিফল্ট বিল্ডের সময় পতাকার প্রয়োজন হয় না।
প্রোফাইল তৈরি করুন
এরপরে, ডিভাইসে ইন্সট্রুমেন্টেড অ্যাপ চালান এবং প্রোফাইল তৈরি করুন। প্রোফাইলগুলি মেমরিতে সংগ্রহ করা হয় যখন ইনস্ট্রুমেন্টেড বাইনারি চালানো হয় এবং প্রস্থান করার সময় একটি ফাইলে লেখা হয়। যাইহোক, atexit
সাথে নিবন্ধিত ফাংশনগুলিকে একটি অ্যান্ড্রয়েড অ্যাপে কল করা হয় না - অ্যাপটি কেবল মারা যায়।
প্রোফাইল ফাইলের জন্য একটি পাথ সেট করার জন্য অ্যাপ্লিকেশন/ওয়ার্কলোডকে অতিরিক্ত কাজ করতে হবে এবং তারপরে স্পষ্টভাবে একটি প্রোফাইল লেখা ট্রিগার করতে হবে।
- প্রোফাইল ফাইল পাথ সেট করতে,
__llvm_profile_set_filename(PROFILE_DIR "/default-%m.profraw
এ কল করুন। একাধিক ভাগ করা লাইব্রেরি থাকলে%m
উপযোগী হয়।%m
সেই লাইব্রেরির জন্য একটি অনন্য মডিউল স্বাক্ষরে প্রসারিত হয়, যার ফলে প্রতি লাইব্রেরিতে একটি পৃথক প্রোফাইল তৈরি হয়। অন্যান্য দরকারী প্যাটার্ন স্পেসিফায়ারের জন্য এখানে দেখুনPROFILE_DIR
হল একটি ডিরেক্টরী যা রানটাইমে এই ডিরেক্টরিটি সনাক্ত করার জন্য। - স্পষ্টভাবে একটি প্রোফাইল লিখতে ট্রিগার করতে,
__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;
}
দ্রষ্টব্য: প্রোফাইল ফাইল তৈরি করা সহজ যদি কাজের চাপটি একটি স্বতন্ত্র বাইনারি হয় — বাইনারি চালানোর আগে শুধু LLVM_PROFILE_FILE
এনভায়রনমেন্ট ভেরিয়েবলটিকে %t/default-%m.profraw
এ সেট করুন।
পোস্ট-প্রসেস প্রোফাইল
প্রোফাইল ফাইল .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
রেসিপিটি ব্যবহার করুন।
প্রোফাইল-গাইডেড অপ্টিমাইজেশান (PGO) একটি সুপরিচিত কম্পাইলার অপ্টিমাইজেশান কৌশল। PGO-তে, একটি প্রোগ্রামের এক্সিকিউশন থেকে রানটাইম প্রোফাইলগুলি ইনলাইনিং এবং কোড লেআউট সম্পর্কে সর্বোত্তম পছন্দ করতে কম্পাইলার দ্বারা ব্যবহার করা হয়। এটি উন্নত কর্মক্ষমতা এবং হ্রাস কোড আকার বাড়ে.
PGO নিম্নলিখিত পদক্ষেপগুলি সহ আপনার অ্যাপ্লিকেশন বা লাইব্রেরিতে স্থাপন করা যেতে পারে: 1. একটি প্রতিনিধি কাজের চাপ সনাক্ত করুন। 2. প্রোফাইল সংগ্রহ করুন। 3. একটি রিলিজ বিল্ডে প্রোফাইলগুলি ব্যবহার করুন৷
ধাপ 1: একটি প্রতিনিধি কাজের চাপ সনাক্ত করুন
প্রথমে, আপনার আবেদনের জন্য একটি প্রতিনিধি বেঞ্চমার্ক বা কাজের চাপ শনাক্ত করুন। এটি একটি গুরুত্বপূর্ণ পদক্ষেপ কারণ কাজের চাপ থেকে সংগৃহীত প্রোফাইলগুলি কোডের গরম এবং ঠান্ডা অঞ্চলগুলিকে চিহ্নিত করে৷ প্রোফাইলগুলি ব্যবহার করার সময়, কম্পাইলার আক্রমনাত্মক অপ্টিমাইজেশন এবং গরম অঞ্চলে ইনলাইনিং সঞ্চালন করবে। কম্পাইলার পারফরম্যান্স বন্ধ করার সময় ঠান্ডা অঞ্চলের কোড আকার কমাতেও বেছে নিতে পারে।
সাধারণভাবে কর্মক্ষমতার ট্র্যাক রাখার জন্য একটি ভাল কাজের চাপ সনাক্ত করাও উপকারী।
ধাপ 2: প্রোফাইল সংগ্রহ করুন
প্রোফাইল সংগ্রহের তিনটি ধাপ রয়েছে: - ইন্সট্রুমেন্টেশন সহ নেটিভ কোড তৈরি করা, - ডিভাইসে ইন্সট্রুমেন্টেড অ্যাপ চালানো এবং প্রোফাইল তৈরি করা, এবং - হোস্টে প্রোফাইলগুলি মার্জ/পোস্ট-প্রসেস করা।
ইন্সট্রুমেন্টেড বিল্ড তৈরি করুন
অ্যাপ্লিকেশনটির একটি ইন্সট্রুমেন্টেড বিল্ডে ধাপ 1 থেকে কাজের চাপ চালিয়ে প্রোফাইলগুলি সংগ্রহ করা হয়। একটি ইন্সট্রুমেন্টেড বিল্ড তৈরি করতে, কম্পাইলার এবং লিঙ্কার ফ্ল্যাগে -fprofile-generate
যোগ করুন। এই পতাকাটি একটি পৃথক বিল্ড ভেরিয়েবল দ্বারা নিয়ন্ত্রিত হওয়া উচিত কারণ একটি ডিফল্ট বিল্ডের সময় পতাকার প্রয়োজন হয় না।
প্রোফাইল তৈরি করুন
এরপরে, ডিভাইসে ইন্সট্রুমেন্টেড অ্যাপ চালান এবং প্রোফাইল তৈরি করুন। প্রোফাইলগুলি মেমরিতে সংগ্রহ করা হয় যখন ইনস্ট্রুমেন্টেড বাইনারি চালানো হয় এবং প্রস্থান করার সময় একটি ফাইলে লেখা হয়। যাইহোক, atexit
সাথে নিবন্ধিত ফাংশনগুলিকে একটি অ্যান্ড্রয়েড অ্যাপে কল করা হয় না - অ্যাপটি কেবল মারা যায়।
প্রোফাইল ফাইলের জন্য একটি পাথ সেট করার জন্য অ্যাপ্লিকেশন/ওয়ার্কলোডকে অতিরিক্ত কাজ করতে হবে এবং তারপরে স্পষ্টভাবে একটি প্রোফাইল লেখা ট্রিগার করতে হবে।
- প্রোফাইল ফাইল পাথ সেট করতে,
__llvm_profile_set_filename(PROFILE_DIR "/default-%m.profraw
এ কল করুন। একাধিক ভাগ করা লাইব্রেরি থাকলে%m
উপযোগী হয়।%m
সেই লাইব্রেরির জন্য একটি অনন্য মডিউল স্বাক্ষরে প্রসারিত হয়, যার ফলে প্রতি লাইব্রেরিতে একটি পৃথক প্রোফাইল তৈরি হয়। অন্যান্য দরকারী প্যাটার্ন স্পেসিফায়ারের জন্য এখানে দেখুনPROFILE_DIR
হল একটি ডিরেক্টরী যা রানটাইমে এই ডিরেক্টরিটি সনাক্ত করার জন্য। - স্পষ্টভাবে একটি প্রোফাইল লিখতে ট্রিগার করতে,
__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;
}
দ্রষ্টব্য: প্রোফাইল ফাইল তৈরি করা সহজ যদি কাজের চাপটি একটি স্বতন্ত্র বাইনারি হয় — বাইনারি চালানোর আগে শুধু LLVM_PROFILE_FILE
এনভায়রনমেন্ট ভেরিয়েবলটিকে %t/default-%m.profraw
এ সেট করুন।
পোস্ট-প্রসেস প্রোফাইল
প্রোফাইল ফাইল .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
রেসিপিটি ব্যবহার করুন।