Android 13 ve daha düşük sürümler için Android derleme sistemi, plan oluşturma kurallarına sahip yerel Android modüllerinde Clang'ın profil kılavuzlu optimizasyonunun (PGO) kullanılmasını destekler. Bu sayfada Clang PGO, PGO için kullanılan profillerin sürekli olarak nasıl oluşturulacağı ve güncelleneceği ve PGO'nun yapı sistemiyle nasıl entegre edileceği (kullanım senaryosu ile) açıklanmaktadır.
Not: Bu belgede PGO'nun Android platformunda kullanımı açıklanmaktadır. PGO'yu bir Android uygulamasından kullanmayı öğrenmek için bu sayfayı ziyaret edin.
Clang PGO Hakkında
Clang, iki tür profil kullanarak profil kılavuzlu optimizasyon gerçekleştirebilir:
- Enstrümantasyon tabanlı profiller, enstrümantasyonlu bir hedef programdan oluşturulur. Bu profiller ayrıntılıdır ve yüksek çalışma süresi yükü getirir.
- Örneklemeye dayalı profiller genellikle donanım sayaçlarının örneklenmesiyle üretilir. Düşük çalışma süresi yüküne neden olurlar ve ikili dosyada herhangi bir enstrümantasyon veya değişiklik yapılmadan toplanabilirler. Enstrümantasyona dayalı profillerden daha az ayrıntılıdırlar.
Tüm profiller, uygulamanın tipik davranışını uygulayan temsili bir iş yükünden oluşturulmalıdır. Clang, hem AST tabanlı ( -fprofile-instr-generate
) hem de LLVM IR tabanlı ( -fprofile-generate)
desteklerken, Android, enstrümantasyon tabanlı PGO için yalnızca LLVM IR tabanlı LLVM IR tabanlı destekler.
Profil koleksiyonu oluşturmak için aşağıdaki bayraklar gereklidir:
- IR tabanlı enstrümantasyon için
-fprofile-generate
. Bu seçenekle arka uç, enstrümantasyon noktalarının sayısını azaltmak ve bunların düşük ağırlıklı kenarlara yerleşimini optimize etmek için ağırlıklı minimum yayılan ağaç yaklaşımını kullanır (bu seçeneği bağlantı adımı için de kullanın). Clang sürücüsü profil oluşturma çalışma zamanını (libclang_rt.profile- arch -android.a
) otomatik olarak bağlayıcıya aktarır. Bu kitaplık, program çıkışında profillerin diske yazılmasına yönelik rutinleri içerir. -
-gline-tables-only
minimum hata ayıklama bilgisi oluşturmak amacıyla örnekleme tabanlı profil koleksiyonu için.
Bir profil, PGO için sırasıyla enstrümantasyon tabanlı ve örnekleme tabanlı profiller için -fprofile-use= pathname
veya -fprofile-sample-use= pathname
kullanılarak kullanılabilir.
Not: Kodda değişiklikler yapıldıkça, Clang artık profil verilerini kullanamıyorsa -Wprofile-instr-out-of-date
uyarısı oluşturur.
PGO'yu kullan
PGO'yu kullanmak aşağıdaki adımları içerir:
- Derleyiciye ve bağlayıcıya
-fprofile-generate
ileterek kitaplığı/yürütülebilir dosyayı enstrümantasyonla oluşturun. - Araçlandırılmış ikili dosyada temsili bir iş yükünü çalıştırarak profilleri toplayın.
-
llvm-profdata
yardımcı programını kullanarak profilleri sonradan işleyin (ayrıntılar için bkz. LLVM profil dosyalarının işlenmesi ). -
-fprofile-use=<>.profdata
derleyiciye ve bağlayıcıya ileterek PGO'yu uygulamak için profilleri kullanın.
Android'deki PGO için profiller çevrimdışı olarak toplanmalı ve tekrarlanabilir yapılardan emin olmak için kodla birlikte kontrol edilmelidir. Profiller, kod geliştikçe kullanılabilir, ancak periyodik olarak (veya Clang, profillerin eski olduğu konusunda uyardığında) yeniden oluşturulmaları gerekir.
Profilleri topla
Clang, kitaplığın araçlı bir yapısını kullanarak kıyaslamaları çalıştırarak veya kıyaslama çalıştırıldığında donanım sayaçlarını örnekleyerek toplanan profilleri kullanabilir. Şu anda Android, örnekleme tabanlı profil toplamayı desteklemediğinden, profilleri araçlı bir yapı kullanarak toplamanız gerekir:
- Bir kıyaslama noktası ve bu kıyaslama tarafından toplu olarak uygulanan kütüphaneler kümesini tanımlayın.
- Karşılaştırma ve kitaplıklara
pgo
özelliklerini ekleyin (ayrıntılar aşağıdadır). - Aşağıdakileri kullanarak bu kitaplıkların araçlı bir kopyasını içeren bir Android yapısı oluşturun:
make ANDROID_PGO_INSTRUMENT=benchmark
benchmark
, oluşturma sırasında kullanılan kitaplıkların koleksiyonunu tanımlayan bir yer tutucudur. Gerçek temsili girdiler (ve muhtemelen karşılaştırılan bir kütüphaneye bağlanan başka bir yürütülebilir dosya) PGO'ya özel değildir ve bu belgenin kapsamı dışındadır.
- Enstrümanlı yapıyı bir cihazda flaşlayın veya senkronize edin.
- Profilleri toplamak için karşılaştırmayı çalıştırın.
- Profilleri sonradan işlemek ve onları kaynak ağaçta kontrol edilmeye hazır hale getirmek için
llvm-profdata
aracını (aşağıda ele alınmıştır) kullanın.
Derleme sırasında profilleri kullanma
Profilleri bir Android ağacındaki toolchain/pgo-profiles
kontrol edin. Ad, kitaplığın pgo
özelliğinin profile_file
alt özelliğinde belirtilenle eşleşmelidir. Derleme sistemi, kitaplığı oluştururken profil dosyasını otomatik olarak Clang'a aktarır. ANDROID_PGO_DISABLE_PROFILE_USE
ortam değişkeni, PGO'yu geçici olarak devre dışı bırakmak ve performans avantajını ölçmek için true
değerine ayarlanabilir.
Ürüne özel ek profil dizinleri belirtmek için bunları BoardConfig.mk
dosyasındaki PGO_ADDITIONAL_PROFILE_DIRECTORIES
make değişkenine ekleyin. Ek yollar belirtilirse, bu yollardaki profiller toolchain/pgo-profiles
içindekileri geçersiz kılar.
make
için dağıtım dist
kullanarak bir yayın görüntüsü oluştururken, derleme sistemi eksik profil dosyalarının adlarını $DIST_DIR/pgo_profile_file_missing.txt
dosyasına yazar. Hangi profil dosyalarının yanlışlıkla düşürüldüğünü görmek için bu dosyayı kontrol edebilirsiniz (bu, PGO'yu sessizce devre dışı bırakır).
Android.bp dosyalarında PGO'yu etkinleştirin
Yerel modüllere yönelik Android.bp
dosyalarında PGO'yu etkinleştirmek için pgo
özelliğini belirtmeniz yeterlidir. Bu özellik aşağıdaki alt özelliklere sahiptir:
Mülk | Tanım |
---|---|
instrumentation | Enstrümantasyon kullanan PGO için true olarak ayarlayın. Varsayılan false . |
sampling | Örnekleme kullanan PGO için true olarak ayarlayın. Varsayılan false . |
benchmarks | Dizelerin listesi. Bu modül, listedeki herhangi bir kıyaslama ANDROID_PGO_INSTRUMENT yapı seçeneğinde belirtilmişse profil oluşturma için oluşturulmuştur. |
profile_file | PGO ile kullanılacak profil dosyası ( toolchain/pgo-profile ile ilgili). Derleme, enable_profile_use özelliği false olarak ayarlanmadıkça VEYA ANDROID_PGO_NO_PROFILE_USE yapı değişkeni true olarak ayarlanmadıkça, bu dosyayı $DIST_DIR/pgo_profile_file_missing.txt dosyasına ekleyerek bu dosyanın mevcut olmadığı konusunda uyarır. |
enable_profile_use | Derleme sırasında profillerin kullanılmaması gerekiyorsa false olarak ayarlayın. Profil toplamayı etkinleştirmek veya PGO'yu geçici olarak devre dışı bırakmak için önyükleme sırasında kullanılabilir. Varsayılan true . |
cflags | Enstrümanlı derleme sırasında kullanılacak ek işaretlerin listesi. |
PGO'lu bir modül örneği:
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
ve benchmark2
karşılaştırma ölçütleri libstatic1
, libstatic2
veya libshared1
kitaplıkları için temsili davranış sergiliyorsa, bu kitaplıkların pgo
özelliği de ölçütleri içerebilir. Android.bp
defaults
modülü, aynı derleme kurallarının birkaç modül için tekrarlanmasını önlemek amacıyla bir dizi kitaplık için ortak bir pgo
spesifikasyonu içerebilir.
Farklı profil dosyalarını seçmek veya bir mimari için PGO'yu seçerek devre dışı bırakmak için her mimari için profile_file
, enable_profile_use
ve cflags
özelliklerini belirtin. Örnek (mimari hedefi kalın harflerle yazılmıştır):
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", } } } }
Enstrümantasyon tabanlı profil oluşturma sırasında profil oluşturma çalışma zamanı kitaplığına yapılan başvuruları çözümlemek için -fprofile-generate
derleme bayrağını bağlayıcıya iletin. PGO ile desteklenen statik kitaplıklar, tüm paylaşılan kitaplıklar ve doğrudan statik kitaplığa bağlı olan herhangi bir ikili dosya da PGO için araçlandırılmalıdır. Ancak bu tür paylaşılan kitaplıkların veya yürütülebilir dosyaların PGO profillerini kullanmasına gerek yoktur ve bunların enable_profile_use
özelliği false
olarak ayarlanabilir. Bu kısıtlamanın dışında PGO'yu herhangi bir statik kitaplığa, paylaşılan kitaplığa veya yürütülebilir dosyaya uygulayabilirsiniz.
LLVM profil dosyalarını işleme
Araçlandırılmış bir kitaplığın veya yürütülebilir dosyanın yürütülmesi /data/local/tmp
dosyasında default_ unique_id _0.profraw
adlı bir profil dosyası üretir (burada unique_id
bu kitaplığa özgü sayısal bir karmadır). Bu dosya zaten mevcutsa profil oluşturma çalışma zamanı, profilleri yazarken yeni profili eski profille birleştirir. /data/local/tmp
uygulama geliştiricileri tarafından erişilebilir olmadığını unutmayın; bunun yerine /storage/emulated/0/Android/data/ packagename /files
gibi bir yer kullanmaları gerekir. Profil dosyasının konumunu değiştirmek için çalışma zamanında LLVM_PROFILE_FILE
ortam değişkenini ayarlayın.
Daha sonra llvm-profdata
yardımcı programı, .profraw
dosyasını bir .profdata
dosyasına dönüştürmek (ve muhtemelen birden fazla .profraw
dosyasını birleştirmek) için kullanılır:
llvm-profdata merge -output=profile.profdata <.profraw and/or .profdata files>
profile.profdata
daha sonra derleme sırasında kullanılmak üzere kaynak ağacına eklenebilir.
Bir kıyaslama sırasında birden çok enstrümanlı ikili dosya/kitaplık yüklenirse, her kitaplık ayrı bir benzersiz kimliğe sahip ayrı bir .profraw
dosyası oluşturur. Genellikle bu dosyaların tümü tek bir .profdata
dosyasında birleştirilebilir ve PGO derlemesi için kullanılabilir. Bir kütüphanenin başka bir kıyaslama tarafından kullanıldığı durumlarda, bu kütüphanenin her iki kıyaslamadan alınan profiller kullanılarak optimize edilmesi gerekir. Bu durumda llvm-profdata
show
seçeneği kullanışlıdır:
llvm-profdata merge -output=default_unique_id.profdata default_unique_id_0.profraw llvm-profdata show -all-functions default_unique_id.profdata
Unique_id'leri ayrı kitaplıklarla eşlemek için, kitaplığa özgü bir işlev adı için her benzersiz_id'nin show
çıktısında arama yapın.
Vaka çalışması: ART için PGO
Vaka çalışması ART'ı ilişkilendirilebilir bir örnek olarak sunuyor; ancak bu, ART için profillenen gerçek kitaplık kümesinin veya bunların karşılıklı bağımlılıklarının doğru bir açıklaması değildir.
ART'taki dex2oat
ileri derleyicisi libart-compiler.so
bağlıdır, o da libart.so
bağlıdır. ART çalışma zamanı esas olarak libart.so
uygulanır. Derleyici ve çalışma zamanı için karşılaştırmalar farklı olacaktır:
Kalite testi | Profilli kitaplıklar |
---|---|
dex2oat | dex2oat (yürütülebilir), libart-compiler.so , libart.so |
art_runtime | libart.so |
- Aşağıdaki
pgo
özelliğinidex2oat
,libart-compiler.so
dosyasına ekleyin:pgo: { instrumentation: true, benchmarks: ["dex2oat",], profile_file: "dex2oat.profdata", }
-
libart.so
aşağıdakipgo
özelliğini ekleyin:pgo: { instrumentation: true, benchmarks: ["art_runtime", "dex2oat",], profile_file: "libart.profdata", }
- Aşağıdakileri kullanarak
dex2oat
veart_runtime
kıyaslamaları için aletli yapılar oluşturun:make ANDROID_PGO_INSTRUMENT=dex2oat make ANDROID_PGO_INSTRUMENT=art_runtime
- Aşağıdakileri elde etmek için
dex2oat
veart_runtime
kullanarak kıyaslamaları çalıştırın:- LLVM profil dosyalarının işlenmesi bölümünde açıklanan yöntem kullanılarak tanımlanan
dex2oat
üç.profraw
dosyası (dex2oat_exe.profdata
,dex2oat_libart-compiler.profdata
vedexeoat_libart.profdata
). - Tek bir
art_runtime_libart.profdata
.
- LLVM profil dosyalarının işlenmesi bölümünde açıklanan yöntem kullanılarak tanımlanan
- Aşağıdakileri kullanarak
dex2oat
yürütülebilir dosyası velibart-compiler.so
için ortak bir profdata dosyası oluşturun:llvm-profdata merge -output=dex2oat.profdata \ dex2oat_exe.profdata dex2oat_libart-compiler.profdata
- İki kıyaslamadaki profilleri birleştirerek
libart.so
profilini edinin:llvm-profdata merge -output=libart.profdata \ dex2oat_libart.profdata art_runtime_libart.profdata
İki profilden
libart.so
için ham sayımlar farklı olabilir çünkü karşılaştırmalar test senaryolarının sayısı ve çalıştırılma süreleri açısından farklılık gösterir. Bu durumda ağırlıklı birleştirmeyi kullanabilirsiniz:llvm-profdata merge -output=libart.profdata \ -weighted-input=2,dex2oat_libart.profdata \ -weighted-input=1,art_runtime_libart.profdata
Yukarıdaki komut,
dex2oat
gelen profile iki kat ağırlık atar. Gerçek ağırlık, alan bilgisine veya deneylere dayanarak belirlenmelidir. - Derleme sırasında kullanılmak üzere
dex2oat.profdata
velibart.profdata
profil dosyalarınıtoolchain/pgo-profiles
kontrol edin.
Alternatif olarak, aşağıdakileri kullanarak tüm kitaplıkların enstrümanlandırılmış olduğu tek bir enstrümanlı yapı oluşturun:
make ANDROID_PGO_INSTRUMENT=dex2oat,art_runtime (or) make ANDROID_PGO_INSTRUMENT=ALL
İkinci komut, profil oluşturma için PGO'nun etkin olduğu tüm modülleri oluşturur.