प्रोफ़ाइल पर आधारित ऑप्टिमाइज़ेशन का इस्तेमाल करें

अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है

Android 13 और उससे पहले के वर्शन के लिए Android बिल्ड सिस्टम, Clang की प्रोफ़ाइल निर्देशों के साथ काम करता है ब्लूप्रिंट बिल्ड वाले नेटिव Android मॉड्यूल के लिए ऑप्टिमाइज़ेशन (पीजीओ) नियम. इस पेज पर, Clang PGO के बारे में बताया गया है. साथ ही, उसे लगातार जनरेट और अपडेट करने के तरीके के बारे में बताया गया है PGO के लिए उपयोग की जाने वाली प्रोफ़ाइल और बिल्ड सिस्टम के साथ PGO को इंटिग्रेट करने का तरीका (जैसे इस्तेमाल का उदाहरण).

ध्यान दें: इस दस्तावेज़ में Android प्लैटफ़ॉर्म में पीजीओ के इस्तेमाल के बारे में बताया गया है. यह जानने के लिए कि किसी Android ऐप्लिकेशन से PGO के लिए, पर जाएं यह पेज देखें.

Clang PGO के बारे में जानकारी

Clang, दो तरह के नतीजों का इस्तेमाल करके प्रोफ़ाइल के हिसाब से ऑप्टिमाइज़ेशन कर सकता है प्रोफ़ाइलें:

  • इंस्ट्रुमेंटेशन पर आधारित प्रोफ़ाइलें, इंस्ट्रुमेंट्ड टारगेट प्रोग्राम. ये प्रोफ़ाइलें पूरी तरह से पूरी होती हैं. साथ ही, रनटाइम ओवरहेड.
  • सैंपलिंग पर आधारित प्रोफ़ाइल को आम तौर पर, हार्डवेयर काउंटर के सैंपल इकट्ठा करना. इनकी वजह से, रनटाइम के दौरान ओवरहेड कम होता है. इसकी वजह से बिना किसी इंस्ट्रुमेंटेशन के या बाइनरी में बदलाव किए बिना इकट्ठा किया जाता है. वे इंस्ट्रुमेंटेशन आधारित प्रोफ़ाइल की तुलना में कम जानकारी वाली होती हैं.

सभी प्रोफ़ाइलें ऐसे वर्कलोड से जनरेट होनी चाहिए जो ऐप के सामान्य व्यवहार का अभ्यास करता है. हालांकि, Clang, दोनों में काम करता है एएसटी पर आधारित (-fprofile-instr-generate) और एलएलवीएम आईआर पर आधारित (-fprofile-generate), Android पर यह सुविधा सिर्फ़ LLVM आईआर पर आधारित है, इसके लिए इंस्ट्रुमेंटेशन आधारित पीजीओ.

प्रोफ़ाइल इकट्ठा करने के लिए, इन फ़्लैग की ज़रूरत होती है:

  • आईआर पर आधारित इंस्ट्रुमेंटेशन के लिए -fprofile-generate. इसके साथ विकल्प है, तो बैकएंड इंस्ट्रुमेंटेशन पॉइंट की संख्या कम कर सकता है और उनके प्लेसमेंट को कम वेट वाले किनारे (इस विकल्प का इस्तेमाल लिंक चरण के लिए भी करें). द क्लैंग ड्राइवर अपने-आप प्रोफ़ाइलिंग रनटाइम पास कर लेता है (libclang_rt.profile-arch-android.a) लिंकर से. इस लाइब्रेरी में प्रोग्राम होने पर डिस्क पर प्रोफ़ाइल लिखने के लिए रूटीन हैं बंद करें.
  • सैंपलिंग के आधार पर प्रोफ़ाइल कलेक्शन के लिए -gline-tables-only कम से कम डीबग जानकारी जनरेट करने के लिए.

प्रोफ़ाइल को पीजीओ के लिए, इनका इस्तेमाल करके इस्तेमाल किया जा सकता है -fprofile-use=pathname या इंस्ट्रुमेंटेशन-आधारित के लिए -fprofile-sample-use=pathname और सैंपल लेने पर आधारित प्रोफ़ाइल.

ध्यान दें: अगर कोड में बदलाव किए जाते हैं, तो Clang लंबे समय तक इस्तेमाल किए जाने वाले प्रोफ़ाइल डेटा का इस्तेमाल करेगा, -Wprofile-instr-out-of-date चेतावनी.

पीजीओ का इस्तेमाल करें

पीजीओ का इस्तेमाल करने के लिए, ये काम किए जा सकते हैं:

  1. पास करके इंस्ट्रुमेंटेशन की मदद से लाइब्रेरी बनाएं या उसे एक्ज़ीक्यूट करें कंपाइलर और लिंकर के लिए -fprofile-generate.
  2. इस पेज पर, प्रतिनिधि का वर्कलोड चलाकर प्रोफ़ाइलें इकट्ठा करें इंस्ट्रुमेंटेड बाइनरी.
  3. llvm-profdata सुविधा का इस्तेमाल करके, प्रोफ़ाइलों की डेटा प्रोसेस करने के बाद (ज़्यादा जानकारी के लिए, यहां देखें एलएलवीएम हैंडल करना प्रोफ़ाइल फ़ाइलें).
  4. पास -fprofile-use=<>.profdata को कंपाइलर और लिंकर.

Android में PGO के लिए, प्रोफ़ाइलों को ऑफ़लाइन इकट्ठा करना और चेक इन करना चाहिए साथ ही, कोड के साथ में भी बनाया जा सकता है. प्रोफ़ाइलों का इस्तेमाल इस तरह किया जा सकता है कोड समय-समय पर बदलता रहता है, लेकिन इसे समय-समय पर फिर से जनरेट करना चाहिए (या जब भी Clang ने चेतावनी दी हो कि प्रोफ़ाइल पुरानी हैं).

प्रोफ़ाइलें इकट्ठा करें

Clang, मानदंड का इस्तेमाल करके इकट्ठा की गई प्रोफ़ाइलों का इस्तेमाल लाइब्रेरी का इंस्ट्रुमेंट्ड बिल्ड या हार्डवेयर काउंटर के सैंपल लेकर, जब मानदंड चलाया जाता है. फ़िलहाल, Android पर सैंपल लेने की सुविधा के आधार पर, ऐप्लिकेशन का इस्तेमाल नहीं किया जा सकता. प्रोफ़ाइल संग्रह की ज़रूरत होती है, ताकि आपको इंस्ट्रुमेंट वाले बिल्ड:

  1. मानदंड और लाइब्रेरी के सेट की पहचान करना, जिन्हें सामूहिक रूप से किया जाता है उस मानदंड को पहचानें.
  2. मानदंड और लाइब्रेरी में pgo प्रॉपर्टी जोड़ें (जानकारी नीचे दिया गया है).
  3. इन लाइब्रेरी की इंस्ट्रुमेंट की गई कॉपी से Android बिल्ड बनाना इसका इस्तेमाल करके:
    make ANDROID_PGO_INSTRUMENT=benchmark

benchmark एक प्लेसहोल्डर है, जो के संग्रह के लिए तैयार किया गया है. असली प्रतिनिधि (और हो सकता है कि एक और एक्ज़ीक्यूटेबल फ़ाइल हो जो किसी लाइब्रेरी से के मानदंड) खास तौर पर PGO के लिए नहीं हैं और इसके दायरे से बाहर हैं दस्तावेज़.

  1. किसी डिवाइस पर इंस्ट्रुमेंट्ड बिल्ड को फ़्लैश या सिंक करें.
  2. प्रोफ़ाइलें इकट्ठा करने के लिए मानदंड चलाएं.
  3. इन कामों के लिए llvm-profdata टूल का इस्तेमाल करें. इनके बारे में नीचे बताया गया है पोस्ट-प्रोसेस सेट अप कर सकें और उन्हें सोर्स में चेक इन करने के लिए तैयार कर सकें पेड़

बिल्ड के दौरान प्रोफ़ाइल इस्तेमाल करना

किसी Android डिवाइस में, toolchain/pgo-profiles में प्रोफ़ाइलों की जांच करें पेड़ नाम वही होना चाहिए जो इसके लिए pgo प्रॉपर्टी की profile_file सब-प्रॉपर्टी लाइब्रेरी. बिल्ड सिस्टम, प्रोफ़ाइल फ़ाइल को अपने-आप Clang में पास कर देता है कमाया जा सकता है. ANDROID_PGO_DISABLE_PROFILE_USE एनवायरमेंट वैरिएबल को true पर सेट करके, कुछ समय के लिए PGO को बंद करना होगा और इसके परफ़ॉर्मेंस से होने वाले फ़ायदे का आकलन करना होगा.

प्रॉडक्ट से जुड़ी कुछ और प्रोफ़ाइल डायरेक्ट्री जोड़ने के लिए, उन्हें PGO_ADDITIONAL_PROFILE_DIRECTORIES एक वैरिएबल के रूप में BoardConfig.mk. यदि अतिरिक्त पथों का उल्लेख किया गया है, तो प्रोफ़ाइल ये पाथ, toolchain/pgo-profiles में मौजूद पाथ को बदल देते हैं.

जब dist टारगेट का इस्तेमाल करके, रिलीज़ की इमेज जनरेट की जा रही हो make, बिल्ड सिस्टम उन प्रोफ़ाइल फ़ाइलों के नाम लिखता है जो मौजूद नहीं हैं $DIST_DIR/pgo_profile_file_missing.txt के लिए. आप इसे देख सकते हैं ताकि यह देखा जा सके कि कौन-कौनसी प्रोफ़ाइल फ़ाइलें गलती से हट गई हैं (जो आवाज़ के बिना इससे PGO बंद हो जाता है).

Android.bp फ़ाइलों में PGO चालू करें

नेटिव मॉड्यूल के लिए, Android.bp फ़ाइलों में पीजीओ की सुविधा चालू करने के लिए, बस pgo प्रॉपर्टी के बारे में बताएं. इस प्रॉपर्टी में ये शामिल हैं सब-प्रॉपर्टी:

प्रॉपर्टी ब्यौरा
instrumentation इंस्ट्रुमेंटेशन का इस्तेमाल करके, पीजीओ के लिए true पर सेट करें. डिफ़ॉल्ट है false.
sampling सैंपलिंग का इस्तेमाल करने वाले पीजीओ के लिए, वैल्यू को true पर सेट किया गया है. डिफ़ॉल्ट है false.
benchmarks स्ट्रिंग की सूची. अगर कोई मानदंड है, तो यह मॉड्यूल आपकी प्रोफ़ाइल बनाने के लिए बनाया गया है यह सूची, ANDROID_PGO_INSTRUMENT बिल्ड में मौजूद है का विकल्प शामिल है.
profile_file इस्तेमाल करने के लिए प्रोफ़ाइल फ़ाइल (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 इंस्ट्रुमेंटेड बिल्ड के दौरान इस्तेमाल किए जाने वाले अतिरिक्त फ़्लैग की सूची.

पीजीओ वाले मॉड्यूल का उदाहरण:

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

अगर मानदंड benchmark1 और benchmark2 लाइब्रेरी libstatic1 के लिए व्यायाम प्रतिनिधि व्यवहार, libstatic2 या libshared1, pgo प्रॉपर्टी में मौजूद बेंचमार्क भी शामिल हो सकते हैं. कॉन्टेंट बनाने Android.bp के defaults मॉड्यूल में कोई ऐसा मॉड्यूल हो सकता है लाइब्रेरी के सेट के लिए 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 प्रोफ़ाइल का उपयोग करने की आवश्यकता नहीं होती है, और enable_profile_use प्रॉपर्टी को false पर सेट किया जा सकता है. इस पाबंदी के अलावा, शेयर की गई किसी भी स्टैटिक लाइब्रेरी पर पीजीओ लागू किया जा सकता है लाइब्रेरी या एक्ज़ीक्यूटेबल.

LLVM प्रोफ़ाइल फ़ाइलें मैनेज करना

इंस्ट्रुमेंट वाली किसी लाइब्रेरी या एक्ज़ीक्यूटेबल लाइब्रेरी को एक्ज़ीक्यूट करने पर, एक प्रोफ़ाइल फ़ाइल बनती है नाम default_unique_id_0.profraw में /data/local/tmp (जहां 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 को सोर्स में चेक इन किया जा सकता है ट्री का उपयोग करें.

अगर किसी बेंचमार्क के दौरान, एक से ज़्यादा इंस्ट्रुमेंट बाइनरी/लाइब्रेरी लोड की जाती हैं, हर लाइब्रेरी, एक अलग .profraw फ़ाइल को जनरेट करती है. यूनीक आईडी सबमिट करें. आम तौर पर, इन सभी फ़ाइलों को एक साथ मर्ज किया जा सकता है .profdata फ़ाइल और PGO बिल्ड के लिए इस्तेमाल किया जाता है. ऐसे मामलों में जहां लाइब्रेरी एक अन्य मानदंड से इस्तेमाल किया जाता है, तो लाइब्रेरी को दोनों मानदंडों से प्रोफ़ाइल बनाई जा सकती हैं. इस स्थिति में, show विकल्प llvm-profdata काम का है:

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

Unique_id को अलग-अलग लाइब्रेरी से मैप करने के लिए, उस फ़ंक्शन नाम के लिए हर unique_id के लिए show आउटपुट लाइब्रेरी के लिए खास है.

केस स्टडी: PGO for ART

इस केस स्टडी में एआरटी को एक ऐसे उदाहरण के तौर पर पेश किया गया है जिससे लोग जुड़ाव महसूस कर सकते हैं; हालांकि, ऐसा नहीं होता है एआरटी के लिए बनाई गई लाइब्रेरी के वास्तविक सेट का सटीक ब्यौरा या एक-दूसरे पर निर्भर करता है.

ART में dex2oat का आगे का कंपाइलर libart-compiler.so, जो इन पर निर्भर करता है libart.so. ART रनटाइम मुख्य रूप से libart.so. कंपाइलर और रनटाइम के लिए मानदंड भिन्न:

Benchmark प्रोफ़ाइल लाइब्रेरी
dex2oat dex2oat (लागू किया जा सकता है), libart-compiler.so, libart.so
art_runtime libart.so
  1. यहां दी गई pgo प्रॉपर्टी को dex2oat में जोड़ें. libart-compiler.so:
        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

    दूसरा कमांड, पीजीओ की सुविधा वाले सभी मॉड्यूल बनाता है प्रोफ़ाइल बनाना.

  5. dex2oat वाली कसरतों के लिए मानदंड चलाएँ और पाने के लिए art_runtime:
  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. प्रोफ़ाइल फ़ाइलों की जांच करें dex2oat.profdata और libart.profdata को toolchain/pgo-profiles में इसके लिए बिल्ड के दौरान इस्तेमाल करते हैं.