প্রোফাইল-নির্দেশিত অপ্টিমাইজেশান ব্যবহার করুন

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

NB: এই নথিটি Android প্ল্যাটফর্মে PGO-এর ব্যবহার বর্ণনা করে। একটি অ্যান্ড্রয়েড অ্যাপ থেকে পিজিও ব্যবহার সম্পর্কে জানতে, এই পৃষ্ঠাটি দেখুন।

ঝনঝন PGO সম্পর্কে

ক্ল্যাং দুই ধরনের প্রোফাইল ব্যবহার করে প্রোফাইল-নির্দেশিত অপ্টিমাইজেশান করতে পারে:

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

সমস্ত প্রোফাইল একটি প্রতিনিধি কাজের চাপ থেকে তৈরি করা উচিত যা অ্যাপের সাধারণ আচরণ অনুশীলন করে। যদিও Clang AST-ভিত্তিক ( -fprofile-instr-generate ) এবং LLVM IR-ভিত্তিক ( -fprofile-generate) উভয়কেই সমর্থন করে, Android শুধুমাত্র LLVM IR-ভিত্তিক ইন্সট্রুমেন্টেশন-ভিত্তিক PGO-কে সমর্থন করে।

প্রোফাইল সংগ্রহের জন্য তৈরি করতে নিম্নলিখিত পতাকাগুলির প্রয়োজন:

  • -fprofile-generate । এই বিকল্পের সাহায্যে, ব্যাকএন্ড একটি ওজনযুক্ত ন্যূনতম স্প্যানিং ট্রি পদ্ধতি ব্যবহার করে ইন্সট্রুমেন্টেশন পয়েন্টের সংখ্যা কমাতে এবং তাদের বসানোকে কম ওজনের প্রান্তে অপ্টিমাইজ করে (লিঙ্ক ধাপের জন্যও এই বিকল্পটি ব্যবহার করুন)। ক্ল্যাং ড্রাইভার স্বয়ংক্রিয়ভাবে প্রোফাইলিং রানটাইম ( libclang_rt.profile- arch -android.a ) লিঙ্কারকে পাস করে। এই লাইব্রেরিতে প্রোগ্রাম থেকে প্রস্থান করার পরে ডিস্কে প্রোফাইল লেখার রুটিন রয়েছে।
  • -gline-tables-only নমুনা-ভিত্তিক প্রোফাইল সংগ্রহের জন্য ন্যূনতম ডিবাগ তথ্য তৈরি করতে।

PGO-এর জন্য যথাক্রমে -fprofile-use= pathname বা -fprofile-sample-use= pathname ব্যবহার করে ইনস্ট্রুমেন্টেশন-ভিত্তিক এবং নমুনা-ভিত্তিক প্রোফাইলের জন্য একটি প্রোফাইল ব্যবহার করা যেতে পারে।

দ্রষ্টব্য: কোডে পরিবর্তন করা হলে, যদি Clang আর প্রোফাইল ডেটা ব্যবহার করতে না পারে তবে এটি একটি -Wprofile-instr-out-of-date সতর্কতা তৈরি করে।

PGO ব্যবহার করুন

PGO ব্যবহারে নিম্নলিখিত পদক্ষেপগুলি জড়িত:

  1. কম্পাইলার এবং লিঙ্কারে -fprofile-generate পাস করে ইনস্ট্রুমেন্টেশন সহ লাইব্রেরি/এক্সিকিউটেবল তৈরি করুন।
  2. ইনস্ট্রুমেন্টেড বাইনারিতে একটি প্রতিনিধি কাজের চাপ চালিয়ে প্রোফাইল সংগ্রহ করুন।
  3. llvm-profdata ইউটিলিটি ব্যবহার করে প্রোফাইলগুলি পোস্ট-প্রসেস করুন (বিশদ বিবরণের জন্য, LLVM প্রোফাইল ফাইলগুলি পরিচালনা করা দেখুন)।
  4. কম্পাইলার এবং লিঙ্কারে -fprofile-use=<>.profdata পাস করে PGO প্রয়োগ করতে প্রোফাইলগুলি ব্যবহার করুন।

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

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

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

  1. একটি বেঞ্চমার্ক এবং সেই বেঞ্চমার্ক দ্বারা সম্মিলিতভাবে ব্যবহৃত লাইব্রেরিগুলির সেট সনাক্ত করুন।
  2. বেঞ্চমার্ক এবং লাইব্রেরিতে pgo বৈশিষ্ট্য যোগ করুন (নীচে বিশদ বিবরণ)।
  3. ব্যবহার করে এই লাইব্রেরিগুলির একটি যন্ত্রযুক্ত অনুলিপি সহ একটি Android বিল্ড তৈরি করুন:
    make ANDROID_PGO_INSTRUMENT=benchmark

benchmark হল একটি স্থানধারক যা বিল্ড করার সময় লাইব্রেরির সংগ্রহকে চিহ্নিত করে। প্রকৃত প্রতিনিধি ইনপুটগুলি (এবং সম্ভবত অন্য একটি এক্সিকিউটেবল যা একটি লাইব্রেরির সাথে লিঙ্ক বেঞ্চমার্ক করা হয়েছে) PGO এর জন্য নির্দিষ্ট নয় এবং এই নথির সুযোগের বাইরে।

  1. একটি ডিভাইসে ইনস্ট্রুমেন্টেড বিল্ড ফ্ল্যাশ বা সিঙ্ক করুন।
  2. প্রোফাইল সংগ্রহ করতে বেঞ্চমার্ক চালান।
  3. প্রোফাইলগুলি পোস্ট-প্রসেস করতে llvm-profdata টুল ব্যবহার করুন (নীচে আলোচনা করা হয়েছে) এবং উত্স ট্রিতে চেক করার জন্য প্রস্তুত করুন।

নির্মাণের সময় প্রোফাইল ব্যবহার করুন

একটি অ্যান্ড্রয়েড ট্রিতে toolchain/pgo-profiles প্রোফাইলগুলি পরীক্ষা করুন। নামটি লাইব্রেরির জন্য pgo প্রপার্টির profile_file সাব-প্রপার্টিতে যা নির্দিষ্ট করা আছে তার সাথে মিলতে হবে। লাইব্রেরি তৈরি করার সময় বিল্ড সিস্টেম স্বয়ংক্রিয়ভাবে প্রোফাইল ফাইলটিকে ক্ল্যাং-এ পাস করে। ANDROID_PGO_DISABLE_PROFILE_USE এনভায়রনমেন্ট ভেরিয়েবল সাময়িকভাবে PGO অক্ষম করতে এবং এর কার্যকারিতা সুবিধা পরিমাপ করতে true সেট করা যেতে পারে।

অতিরিক্ত পণ্য-নির্দিষ্ট প্রোফাইল ডিরেক্টরি নির্দিষ্ট করতে, এগুলিকে একটি BoardConfig.mkPGO_ADDITIONAL_PROFILE_DIRECTORIES মেক ভেরিয়েবলে যুক্ত করুন। অতিরিক্ত পাথ নির্দিষ্ট করা থাকলে, এই পাথের প্রোফাইলগুলি toolchain/pgo-profiles ওভাররাইড করে।

dist টার্গেট ব্যবহার করে একটি রিলিজ ইমেজ তৈরি make সময়, বিল্ড সিস্টেম অনুপস্থিত প্রোফাইল ফাইলগুলির নাম $DIST_DIR/pgo_profile_file_missing.txt এ লিখে। কোন প্রোফাইল ফাইলগুলি ভুলবশত বাদ দেওয়া হয়েছে (যা নীরবে PGO অক্ষম করে) তা দেখতে আপনি এই ফাইলটি পরীক্ষা করতে পারেন৷

Android.bp ফাইলগুলিতে PGO সক্ষম করুন৷

নেটিভ মডিউলগুলির জন্য Android.bp ফাইলগুলিতে PGO সক্ষম করতে, কেবল pgo বৈশিষ্ট্য নির্দিষ্ট করুন৷ এই সম্পত্তির নিম্নলিখিত উপ-বৈশিষ্ট্য রয়েছে:

সম্পত্তি বর্ণনা
instrumentation ইন্সট্রুমেন্টেশন ব্যবহার করে PGO-এর জন্য true সেট করুন। ডিফল্ট false .
sampling নমুনা ব্যবহার করে PGO-এর জন্য true সেট করুন। ডিফল্ট false .
benchmarks স্ট্রিং তালিকা. ANDROID_PGO_INSTRUMENT বিল্ড বিকল্পে তালিকার কোনো বেঞ্চমার্ক নির্দিষ্ট করা থাকলে এই মডিউলটি প্রোফাইলিংয়ের জন্য তৈরি করা হয়েছে।
profile_file PGO-এর সাথে ব্যবহার করার জন্য প্রোফাইল ফাইল ( toolchain/pgo-profile সাথে সম্পর্কিত)। বিল্ড সতর্ক করে যে এই ফাইলটি $DIST_DIR/pgo_profile_file_missing.txt এ যোগ করার মাধ্যমে এই ফাইলটির অস্তিত্ব নেই যদি না enable_profile_use প্রপার্টি false সেট করা হয় বা ANDROID_PGO_NO_PROFILE_USE বিল্ড ভেরিয়েবল true সেট করা হয়।
enable_profile_use বিল্ড করার সময় প্রোফাইল ব্যবহার করা উচিত না হলে false সেট করুন। প্রোফাইল সংগ্রহ সক্ষম করতে বা সাময়িকভাবে PGO নিষ্ক্রিয় করতে বুটস্ট্র্যাপের সময় ব্যবহার করা যেতে পারে। ডিফল্ট true
cflags একটি ইন্সট্রুমেন্টেড বিল্ডের সময় ব্যবহার করার জন্য অতিরিক্ত পতাকার তালিকা।

PGO সহ একটি মডিউলের উদাহরণ:

cc_library {
    name: "libexample",
    srcs: [
        "src1.cpp",
        "src2.cpp",
    ],
    static: [
        "libstatic1",
        "libstatic2",
    ],
    shared: [
        "libshared1",
    ]
    pgo: {
        instrumentation: true,
        benchmarks: [
            "benchmark1",
            "benchmark2",
        ],
        profile_file: "example.profdata",
    }
}

লাইব্রেরি libstatic1 , libstatic2 , বা libshared1 এর জন্য বেঞ্চমার্ক benchmark1 এবং benchmark2 অনুশীলন প্রতিনিধি আচরণ করলে, এই লাইব্রেরিগুলির pgo বৈশিষ্ট্যও মানদণ্ড অন্তর্ভুক্ত করতে পারে। Android.bp এর defaults মডিউলে একাধিক মডিউলের জন্য একই বিল্ড নিয়মের পুনরাবৃত্তি এড়াতে লাইব্রেরির সেটের জন্য একটি সাধারণ pgo স্পেসিফিকেশন অন্তর্ভুক্ত থাকতে পারে।

বিভিন্ন প্রোফাইল ফাইল নির্বাচন করতে বা একটি আর্কিটেকচারের জন্য বেছে বেছে PGO নিষ্ক্রিয় করতে, প্রতি আর্কিটেকচারে profile_file , enable_profile_use , এবং cflags বৈশিষ্ট্য উল্লেখ করুন। উদাহরণ (আর্কিটেকচার টার্গেট বোল্ডে সহ):

cc_library {
    name: "libexample",
    srcs: [
          "src1.cpp",
          "src2.cpp",
    ],
    static: [
          "libstatic1",
          "libstatic2",
    ],
    shared: [
          "libshared1",
    ],
    pgo: {
         instrumentation: true,
         benchmarks: [
              "benchmark1",
              "benchmark2",
         ],
    }

    target: {
         android_arm: {
              pgo: {
                   profile_file: "example_arm.profdata",
              }
         },
         android_arm64: {
              pgo: {
                   profile_file: "example_arm64.profdata",
              }
         }
    }
}

ইন্সট্রুমেন্টেশন-ভিত্তিক প্রোফাইলিংয়ের সময় প্রোফাইলিং রানটাইম লাইব্রেরির রেফারেন্সগুলি সমাধান করতে, লিঙ্কারে বিল্ড পতাকা -fprofile-generate পাস করুন। PGO-এর সাথে যন্ত্রযুক্ত স্ট্যাটিক লাইব্রেরি, সমস্ত শেয়ার্ড লাইব্রেরি, এবং যে কোনো বাইনারি যা স্ট্যাটিক লাইব্রেরির উপর সরাসরি নির্ভর করে তাও PGO-এর জন্য যন্ত্রযুক্ত হতে হবে। যাইহোক, এই ধরনের শেয়ার্ড লাইব্রেরি বা এক্সিকিউটেবলের জন্য PGO প্রোফাইল ব্যবহার করার প্রয়োজন নেই এবং তাদের enable_profile_use প্রপার্টি false সেট করা যেতে পারে। এই নিষেধাজ্ঞার বাইরে, আপনি যেকোনো স্ট্যাটিক লাইব্রেরি, শেয়ার্ড লাইব্রেরি বা এক্সিকিউটেবলে PGO প্রয়োগ করতে পারেন।

LLVM প্রোফাইল ফাইলগুলি পরিচালনা করুন

একটি ইনস্ট্রুমেন্টেড লাইব্রেরি বা এক্সিকিউটেবল এক্সিকিউট করলে /data/local/tmpdefault_ unique_id _0.profraw নামে একটি প্রোফাইল ফাইল তৈরি হয় (যেখানে unique_id একটি সংখ্যাসূচক হ্যাশ যা এই লাইব্রেরির জন্য অনন্য)। যদি এই ফাইলটি ইতিমধ্যেই বিদ্যমান থাকে, প্রোফাইল লেখার সময় প্রোফাইলিং রানটাইম নতুন প্রোফাইলটিকে পুরানোটির সাথে একত্রিত করে। মনে রাখবেন যে /data/local/tmp অ্যাপ ডেভেলপারদের কাছে অ্যাক্সেসযোগ্য নয়; তাদের পরিবর্তে /storage/emulated/0/Android/data/ packagename /files মত কোথাও ব্যবহার করা উচিত। প্রোফাইল ফাইলের অবস্থান পরিবর্তন করতে, রানটাইমে LLVM_PROFILE_FILE পরিবেশ পরিবর্তনশীল সেট করুন।

llvm-profdata ইউটিলিটি তারপর .profraw ফাইলকে রূপান্তর করতে (এবং সম্ভবত একাধিক .profraw ফাইল মার্জ করতে) একটি .profdata ফাইলে ব্যবহার করা হয়:

  llvm-profdata merge -output=profile.profdata <.profraw and/or .profdata files>

profile.profdata তারপর বিল্ড করার সময় ব্যবহারের জন্য উত্স ট্রিতে চেক করা যেতে পারে।

যদি একটি বেঞ্চমার্ক চলাকালীন একাধিক ইন্সট্রুমেন্টেড বাইনারি/লাইব্রেরি লোড করা হয়, প্রতিটি লাইব্রেরি একটি পৃথক অনন্য ID সহ একটি পৃথক .profraw ফাইল তৈরি করে। সাধারণত, এই সমস্ত ফাইল একটি একক .profdata ফাইলে মার্জ করা যায় এবং PGO বিল্ডের জন্য ব্যবহার করা যেতে পারে। যে ক্ষেত্রে একটি লাইব্রেরি অন্য বেঞ্চমার্ক দ্বারা প্রয়োগ করা হয়, সেই লাইব্রেরিটি অবশ্যই উভয় মানদণ্ডের প্রোফাইল ব্যবহার করে অপ্টিমাইজ করা উচিত। এই পরিস্থিতিতে, llvm-profdata এর show বিকল্পটি দরকারী:

  llvm-profdata merge -output=default_unique_id.profdata default_unique_id_0.profraw
llvm-profdata show -all-functions default_unique_id.profdata

পৃথক লাইব্রেরিতে unique_id s ম্যাপ করতে, লাইব্রেরির জন্য অনন্য একটি ফাংশনের নামের জন্য প্রতিটি unique_id এর show আউটপুট অনুসন্ধান করুন।

কেস স্টাডি: ART এর জন্য PGO

কেস স্টাডি এআরটিকে একটি সম্পর্কিত উদাহরণ হিসাবে উপস্থাপন করে; যাইহোক, এটি ART বা তাদের আন্তঃনির্ভরতার জন্য প্রোফাইলকৃত লাইব্রেরির প্রকৃত সেটের সঠিক বর্ণনা নয়।

ART-তে dex2oat আগাম-সময়ের কম্পাইলার libart-compiler.so এর উপর নির্ভর করে, যা libart.so এর উপর নির্ভর করে। ART রানটাইম মূলত libart.so এ প্রয়োগ করা হয়। কম্পাইলার এবং রানটাইমের জন্য বেঞ্চমার্ক ভিন্ন হবে:

বেঞ্চমার্ক প্রোফাইলযুক্ত লাইব্রেরি
dex2oat dex2oat (এক্সিকিউটেবল), libart-compiler.so , libart.so
art_runtime libart.so
  1. dex2oat , libart-compiler.so তে নিম্নলিখিত pgo প্রপার্টি যোগ করুন:
        pgo: {
            instrumentation: true,
            benchmarks: ["dex2oat",],
            profile_file: "dex2oat.profdata",
        }
  2. libart.so এ নিম্নলিখিত pgo সম্পত্তি যোগ করুন:
        pgo: {
            instrumentation: true,
            benchmarks: ["art_runtime", "dex2oat",],
            profile_file: "libart.profdata",
        }
  3. ব্যবহার করে dex2oat এবং art_runtime বেঞ্চমার্কের জন্য ইন্সট্রুমেন্টেড বিল্ড তৈরি করুন:
        make ANDROID_PGO_INSTRUMENT=dex2oat
        make ANDROID_PGO_INSTRUMENT=art_runtime
  4. বিকল্পভাবে, ব্যবহার করে সমস্ত লাইব্রেরি সহ একটি একক যন্ত্রযুক্ত বিল্ড তৈরি করুন:

        make ANDROID_PGO_INSTRUMENT=dex2oat,art_runtime
        (or)
        make ANDROID_PGO_INSTRUMENT=ALL

    দ্বিতীয় কমান্ডটি প্রোফাইলিংয়ের জন্য সমস্ত PGO- সক্ষম মডিউল তৈরি করে।

  5. প্রাপ্ত করার জন্য dex2oat এবং art_runtime অনুশীলনকারী বেঞ্চমার্কগুলি চালান:
    • dex2oat থেকে তিনটি .profraw ফাইল ( dex2oat_exe.profdata , dex2oat_libart-compiler.profdata , এবং dexeoat_libart.profdata ), LLVM প্রোফাইল ফাইল পরিচালনায় বর্ণিত পদ্ধতি ব্যবহার করে চিহ্নিত করা হয়েছে।
    • একটি একক art_runtime_libart.profdata
  6. dex2oat এক্সিকিউটেবল এবং libart-compiler.so ব্যবহার করে একটি সাধারণ প্রোফডেটা ফাইল তৈরি করুন:
    llvm-profdata merge -output=dex2oat.profdata \
        dex2oat_exe.profdata dex2oat_libart-compiler.profdata
  7. দুটি মানদণ্ড থেকে প্রোফাইলগুলিকে মার্জ করে libart.so এর জন্য প্রোফাইলটি পান:
    llvm-profdata merge -output=libart.profdata \
        dex2oat_libart.profdata art_runtime_libart.profdata

    দুটি প্রোফাইল থেকে libart.so এর জন্য কাঁচা গণনা আলাদা হতে পারে কারণ বেঞ্চমার্কগুলি পরীক্ষার ক্ষেত্রে এবং যে সময়কালের জন্য চালানো হয় তার মধ্যে পার্থক্য রয়েছে। এই ক্ষেত্রে, আপনি একটি ওজনযুক্ত মার্জ ব্যবহার করতে পারেন:

    llvm-profdata merge -output=libart.profdata \
        -weighted-input=2,dex2oat_libart.profdata \
        -weighted-input=1,art_runtime_libart.profdata

    উপরের কমান্ডটি dex2oat থেকে প্রোফাইলে দ্বিগুণ ওজন নির্ধারণ করে। প্রকৃত ওজন ডোমেন জ্ঞান বা পরীক্ষা-নিরীক্ষার উপর ভিত্তি করে নির্ধারণ করা উচিত।

  8. বিল্ড করার সময় ব্যবহারের জন্য toolchain/pgo-profiles প্রোফাইল ফাইল dex2oat.profdata এবং libart.profdata চেক করুন।