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
चेतावनी.
पीजीओ का इस्तेमाल करें
पीजीओ का इस्तेमाल करने के लिए, ये काम किए जा सकते हैं:
- पास करके इंस्ट्रुमेंटेशन की मदद से लाइब्रेरी बनाएं या उसे एक्ज़ीक्यूट करें
कंपाइलर और लिंकर के लिए
-fprofile-generate
. - इस पेज पर, प्रतिनिधि का वर्कलोड चलाकर प्रोफ़ाइलें इकट्ठा करें इंस्ट्रुमेंटेड बाइनरी.
llvm-profdata
सुविधा का इस्तेमाल करके, प्रोफ़ाइलों की डेटा प्रोसेस करने के बाद (ज़्यादा जानकारी के लिए, यहां देखें एलएलवीएम हैंडल करना प्रोफ़ाइल फ़ाइलें).- पास
-fprofile-use=<>.profdata
को कंपाइलर और लिंकर.
Android में PGO के लिए, प्रोफ़ाइलों को ऑफ़लाइन इकट्ठा करना और चेक इन करना चाहिए साथ ही, कोड के साथ में भी बनाया जा सकता है. प्रोफ़ाइलों का इस्तेमाल इस तरह किया जा सकता है कोड समय-समय पर बदलता रहता है, लेकिन इसे समय-समय पर फिर से जनरेट करना चाहिए (या जब भी Clang ने चेतावनी दी हो कि प्रोफ़ाइल पुरानी हैं).
प्रोफ़ाइलें इकट्ठा करें
Clang, मानदंड का इस्तेमाल करके इकट्ठा की गई प्रोफ़ाइलों का इस्तेमाल लाइब्रेरी का इंस्ट्रुमेंट्ड बिल्ड या हार्डवेयर काउंटर के सैंपल लेकर, जब मानदंड चलाया जाता है. फ़िलहाल, Android पर सैंपल लेने की सुविधा के आधार पर, ऐप्लिकेशन का इस्तेमाल नहीं किया जा सकता. प्रोफ़ाइल संग्रह की ज़रूरत होती है, ताकि आपको इंस्ट्रुमेंट वाले बिल्ड:
- मानदंड और लाइब्रेरी के सेट की पहचान करना, जिन्हें सामूहिक रूप से किया जाता है उस मानदंड को पहचानें.
- मानदंड और लाइब्रेरी में
pgo
प्रॉपर्टी जोड़ें (जानकारी नीचे दिया गया है). - इन लाइब्रेरी की इंस्ट्रुमेंट की गई कॉपी से Android बिल्ड बनाना
इसका इस्तेमाल करके:
make ANDROID_PGO_INSTRUMENT=benchmark
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है
benchmark
एक प्लेसहोल्डर है, जो
के संग्रह के लिए तैयार किया गया है. असली प्रतिनिधि
(और हो सकता है कि एक और एक्ज़ीक्यूटेबल फ़ाइल हो जो किसी लाइब्रेरी से
के मानदंड) खास तौर पर PGO के लिए नहीं हैं और इसके दायरे से बाहर हैं
दस्तावेज़.
- किसी डिवाइस पर इंस्ट्रुमेंट्ड बिल्ड को फ़्लैश या सिंक करें.
- प्रोफ़ाइलें इकट्ठा करने के लिए मानदंड चलाएं.
- इन कामों के लिए
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
|
- यहां दी गई
pgo
प्रॉपर्टी कोdex2oat
में जोड़ें.libart-compiler.so
:pgo: { instrumentation: true, benchmarks: ["dex2oat",], profile_file: "dex2oat.profdata", }
libart.so
में यहpgo
प्रॉपर्टी जोड़ें:pgo: { instrumentation: true, benchmarks: ["art_runtime", "dex2oat",], profile_file: "libart.profdata", }
dex2oat
के लिए इंस्ट्रुमेंट वाले बिल्ड बनाएं औरart_runtime
बेंचमार्क इनका इस्तेमाल कर रहे हैं:make ANDROID_PGO_INSTRUMENT=dex2oat make ANDROID_PGO_INSTRUMENT=art_runtime
dex2oat
वाली कसरतों के लिए मानदंड चलाएँ और पाने के लिएart_runtime
:dex2oat
से तीन.profraw
फ़ाइलें (dex2oat_exe.profdata
,dex2oat_libart-compiler.profdata
, औरdexeoat_libart.profdata
) की पहचान करने के लिए, तरीके का इस्तेमाल किया गया एलएलवीएम प्रोफ़ाइल को मैनेज करने से जुड़ी जानकारी में बताया गया है फ़ाइलें शामिल कर सकते हैं.- एक
art_runtime_libart.profdata
.
dex2oat
के एक्ज़ीक्यूटेबल के लिए एक सामान्य प्रोफ़ेटा फ़ाइल बनाएं औरlibart-compiler.so
इसका इस्तेमाल कर रहा है:llvm-profdata merge -output=dex2oat.profdata \ dex2oat_exe.profdata dex2oat_libart-compiler.profdata
- प्रोफ़ाइलों को मर्ज करके,
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
. असल वज़न, डोमेन के आधार पर तय होना चाहिए जानकारी या प्रयोग करने के लिए किया जाता है. - प्रोफ़ाइल फ़ाइलों की जांच करें
dex2oat.profdata
औरlibart.profdata
कोtoolchain/pgo-profiles
में इसके लिए बिल्ड के दौरान इस्तेमाल करते हैं.
इसके अलावा, सभी लाइब्रेरी के साथ एक इंस्ट्रुमेंट वाला बिल्ड बनाएं इंस्ट्रुमेंटेड इसका इस्तेमाल करके बनाया गया है:
make ANDROID_PGO_INSTRUMENT=dex2oat,art_runtime (or) make ANDROID_PGO_INSTRUMENT=ALL
दूसरा कमांड, पीजीओ की सुविधा वाले सभी मॉड्यूल बनाता है प्रोफ़ाइल बनाना.