Android 13 ve önceki sürümler için Android derleme sistemi, Clang'ın profil rehberli (PGO) mavi derlemesi olan yerel Android modüllerinde kurallar. Bu sayfada, Clang PGO'nun sürekli olarak nasıl oluşturulacağı ve güncelleneceği ve PGO'nun derleme sistemiyle nasıl entegre edileceği (PGO) örneğin bir kez kullanılabilir).
Not: Bu belgede, Android platformunda PGO kullanımı açıklanmaktadır. Google’ın Android uygulamasından PGO deneyimi için adresini ziyaret edin bu sayfada bulabilirsiniz.
Clang PGO hakkında
Clang, iki tür profil yönlendirmeli optimizasyon gerçekleştirebilir: profil:
- Araç tabanlı profiller, araçlı hedef programı. Bu profiller ayrıntılıdır ve hem yüksek hem de çalışma zamanı ek yükü.
- Örnekleme tabanlı profiller genellikle donanım sayaçlarını örneklemeyi kapsar. Düşük bir çalışma zamanı ek yükü uygular ve veya değişiklik yapılmadan toplanan verileri gösterir. Onlar araçlara dayalı profillerden daha az ayrıntılıdır.
Tüm profiller, aynı iş yüküne sahip temsili bir iş yükünden oluşturulmalıdır.
uygulamanın tipik davranışını kullanır. Clang, her ikisini de
AST tabanlı (-fprofile-instr-generate
) ve LLVM IR tabanlı
(-fprofile-generate)
. Android cihazlar için yalnızca LLVM IR tabanlı
enstrümantasyon temelli PGO'dur.
Profil koleksiyonu oluşturmak için aşağıdaki işaretler gerekir:
- IR tabanlı araçlar için
-fprofile-generate
. Bununla seçeneğini belirlerseniz arka uç, bu iki boyutun daha ayrıntılı şekilde araç noktası sayısını azaltıp yerleşimlerini düşük ağırlıklı kenarlar (bu seçeneği bağlantı adımı için de kullanın). Dil sürücüsü, profil oluşturma çalışma zamanını otomatik olarak geçer (libclang_rt.profile-arch-android.a
) bağlayıcıya. Bu kitaplık, program sonrasında profilleri diske yazmak için rutinler içerir çıkar. - Örneklemeye dayalı profil toplama için
-gline-tables-only
minimum hata ayıklama bilgisi oluşturun.
Profil, PGO için kullanılabilir:
-fprofile-use=pathname
veya
Enstrümantasyon tabanlı için -fprofile-sample-use=pathname
ve örnekleme tabanlı profiller arasından seçim yapabilirsiniz.
Not: Kodda değişiklik yapıldıkça, Clang dilinin
oluşturduğu profil verilerini daha uzun süre
-Wprofile-instr-out-of-date
uyarı.
PGO kullan
PGO'yu kullanmak için aşağıdaki adımları izlemeniz gerekir:
- Kitaplık/yürütülebilir dosya ve yürütülebilir dosyayı
Derleyici ve bağlayıcı için
-fprofile-generate
. - araçlı ikili program.
- Profilleri
llvm-profdata
yardımcı programını kullanarak sonradan işleme (ayrıntılar için bkz. LLVM'yi kullanma profil dosyalarınız). - PGO'yu uygulamak için profilleri kullanın.
Derleyici için
-fprofile-use=<>.profdata
ve bağlayıcı.
Android'de PGO için profiller çevrimdışı olarak toplanmalı ve giriş yapılmalıdır derlemek için bu kodla birlikte çalışmalıdır. Profiller şu amaçlarla kullanılabilir: Ancak kod gelişiyor ancak belirli aralıklarla (veya Clang uyardığında) yeniden oluşturulmalıdır profillerin eski olduğundan emin olun.
Profilleri topla
Clang, bir kitaplığın enstrümanlı derlemesini kullanır ya da hesaplama yapılır. Şu anda Android, örnekleme temelli veri kullanımını desteklememektedir. profil koleksiyonu, bu nedenle, profilleri yapı:
- Bir karşılaştırma belirlemeyi ve değerlendirebiliriz.
- Karşılaştırmaya ve kitaplıklara
pgo
mülkleri ekleyin (ayrıntılar bölümüne bakın). - Bu kitaplıkların araçlı bir kopyasıyla bir Android derlemesi oluştur
şunu kullanarak:
make ANDROID_PGO_INSTRUMENT=benchmark
benchmark
,
derleme sırasında kullanılan kitaplık koleksiyonu. Asıl temsilci
girişlere (ve muhtemelen bir kütüphaneye bağlanan başka bir yürütülebilir dosya)
karşılaştırıldığında) yalnızca PGO'ya özgü değildir ve bu
uygulayacaksınız.
- Enstrümanlı derlemeyi bir cihazda Flash veya senkronize edin.
- Profilleri toplamak için karşılaştırma yapın.
llvm-profdata
aracını (aşağıda açıklanmıştır) kullanarak profilleri işleme alın ve kaynağa aktarılmaya hazır hale getirin. ağacı.
Derleme sırasında profilleri kullanın
Profilleri Android'de toolchain/pgo-profiles
ile kontrol edin
ağacı. Ad,
Şu site için pgo
mülkünün profile_file
alt mülkü:
emin olmanız gerekir. Derleme sistemi, profil dosyasını otomatik olarak Clang'a iletir
yardımcı oluyorum. ANDROID_PGO_DISABLE_PROFILE_USE
ortam değişkeni true
olarak ayarlandığında
PGO'yu geçici olarak devre dışı bırakma ve performans avantajını ölçme.
Ürüne özel ek profil dizinleri belirtmek için bunları şuraya ekleyin:
PGO_ADDITIONAL_PROFILE_DIRECTORIES
yap değişkeni
BoardConfig.mk
. Ek yollar belirtilirse
bu yollar, toolchain/pgo-profiles
içindeki yolları geçersiz kılar.
Aşağıdakini yapmak için dist
hedefini kullanarak bir sürüm resmi oluştururken:
make
, derleme sistemi eksik profil dosyalarının adlarını yazar
alıcı: $DIST_DIR/pgo_profile_file_missing.txt
. Web sitemiz g.co/newsinitiative/labs
üzerinden
yanlışlıkla bırakıldığını görebilirsiniz (bu işlem sessiz bir şekilde
PGO'yu devre dışı bırakır).
Android.bp dosyalarında PGO'yu etkinleştirme
Yerel modüller için Android.bp
dosyalarında PGO'yu etkinleştirmek isterseniz
pgo
özelliğini belirtin. Bu mülkte aşağıdakilere sahip:
alt mülkler:
Özellik | Açıklama |
---|---|
instrumentation
|
Enstrümantasyon kullanarak PGO için true olarak ayarlayın. Varsayılan değer:
false |
sampling
|
Örnekleme kullanarak PGO için true olarak ayarlayın. Varsayılan değer:
false |
benchmarks
|
Dize listesi. Bu modül, eşi görülmemiş bir durum olduğu sürece
değeri, ANDROID_PGO_INSTRUMENT derlemesinde belirtiliyor
seçeneğini belirleyin. |
profile_file
|
Kullanılacak profil dosyası (toolchain/pgo-profile ile ilişkili)
bu kadar. Derleme, bu
dosyayı $DIST_DIR/pgo_profile_file_missing.txt klasörüne
aynı enable_profile_use özelliği
false VEYA
ANDROID_PGO_NO_PROFILE_USE derleme değişkeni
true |
enable_profile_use
|
Profillerin şu süre boyunca kullanılmaması gerekiyorsa false olarak ayarlayın:
seçeceğiz. Önyükleme sırasında profil toplamayı etkinleştirmek veya
PGO'yu geçici olarak devre dışı bırakabilir. true varsayılandır. |
cflags
|
Araçlı bir derleme sırasında kullanılacak ek işaretlerin listesi. |
PGO içeren 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ırmaları
libstatic1
kitaplıkları için temsili davranış egzersizi
libstatic2
veya libshared1
, pgo
özellikleri de karşılaştırmaları içerebilir. İlgili içeriği oluşturmak için kullanılan
Android.bp
içindeki defaults
modülünde ortak bir
yinelenmesini önlemek üzere bir kitaplık grubu için pgo
spesifikasyonu
aynı derleme kurallarını uygulayın.
Farklı bir profil dosyası seçmek veya PGO'yu seçerek devre dışı bırakmak için
mimariyi belirtmek için, profile_file
belirtin,
enable_profile_use
ve cflags
tesis/
bahsedeceğim. Örnek (
kalın):
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 çıkarma, derleme işaretini geçme
Bağlayıcı için -fprofile-generate
. Kullanılan statik kitaplıklar
tüm paylaşılan kitaplıklar ve
doğrudan bağlı olan ikili program içeren
statik kitaplık PGO için de sağlanmalıdır. Ancak bu tür paylaşılan
kitaplıkların veya yürütülebilir dosyaların PGO profilleri kullanmasına gerek yoktur ve
enable_profile_use
özelliği false
olarak ayarlanabilir.
Bu kısıtlama dışında, PGO'yu paylaşılan herhangi bir statik kitaplığa uygulayabilirsiniz.
veya yürütülebilir.
LLVM profil dosyalarını işleme
Araçlı bir kitaplık veya yürütülebilir dosya yürütüldüğünde bir profil dosyası oluşturulur
default_unique_id_0.profraw
adlı yerde
/data/local/tmp
(burada unique_id
,
bu kitaplığa özgü sayısal karma). Bu dosya zaten varsa
profil oluşturma çalışma zamanı, yazmaya devam ederken yeni profili eski profille birleştirir.
izin verir. Uygulamanın /data/local/tmp
uygulamasına erişemediğini unutmayın
geliştiriciler; gibi bir ifadede
Bunun yerine /storage/emulated/0/Android/data/packagename/files
.
Profil dosyasının konumunu değiştirmek için LLVM_PROFILE_FILE
özelliğini ayarlayın.
ortam değişkeninin çalıştırılmasına izin verir.
llvm-profdata
yardımcı programı .profraw
dosyasını dönüştürmek için kullanılır (ve muhtemelen
birden çok .profraw
dosyasını bir .profdata
olarak birleştirin)
dosya:
llvm-profdata merge -output=profile.profdata <.profraw and/or .profdata files>
profile.profdata
daha sonra kaynağa eklenebilir
saksılar
oluşturmaktır.
Karşılaştırma sırasında birden fazla araçlı ikili program/kitaplık yüklenirse
her kitaplık için ayrı bir .profraw
dosyası oluşturulur.
benzersiz kimlik. Genellikle, bu dosyaların tümü tek bir dosyada birleştirilebilir
.profdata
dosyasıyla PGO derlemesi için kullanılır. Bir kütüphanenin
başka bir karşılaştırma tarafından kullanılıyorsa o kitaplığın
profilleri oluşturabilirsiniz. Bu durumda, show
llvm-profdata
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 tek tek kitaplıklarla eşlemek için şunu arayın:
Şu özelliklere sahip bir işlev adının her Unique_id için show
çıkışı
kitaplığa özgüdür.
Örnek olay: ART için PGO
Vaka analizinde, ART'nin alakalı bir örnek olduğu görülmektedir. ancak ART için profili oluşturulan gerçek kitaplık grubunun doğru bir açıklaması ne anlama geldiğini ele alacağız.
ART'taki dex2oat
önceden derleyici şuna bağlıdır:
Bu da şunlara bağlıdır: libart-compiler.so
libart.so
. ART çalışma zamanı temel olarak
libart.so
Derleyici ve çalışma zamanı karşılaştırmaları,
farklı:
Benchmark | Profilli kitaplıklar |
---|---|
dex2oat
|
dex2oat (yürütülebilir), libart-compiler.so ,
libart.so |
art_runtime
|
libart.so
|
- Şu
pgo
özelliğinidex2oat
öğesine ekleyin,libart-compiler.so
:pgo: { instrumentation: true, benchmarks: ["dex2oat",], profile_file: "dex2oat.profdata", }
- Şu
pgo
özelliğinilibart.so
ürününe ekleyin:pgo: { instrumentation: true, benchmarks: ["art_runtime", "dex2oat",], profile_file: "libart.profdata", }
dex2oat
ve için araçlarlı derlemeler oluşturun Şunlar kullanılarakart_runtime
karşılaştırma:make ANDROID_PGO_INSTRUMENT=dex2oat make ANDROID_PGO_INSTRUMENT=art_runtime
- Karşılaştırmaları
dex2oat
uygulayın ve Almak içinart_runtime
:dex2oat
kaynağından üç.profraw
dosyası (dex2oat_exe.profdata
,dex2oat_libart-compiler.profdata
vedexeoat_libart.profdata
), yöntemi kullanılarak tespit edilir LLVM profilini kullanma konusunda açıklanmıştır dosyalarına dokunun.- Tek bir
art_runtime_libart.profdata
.
dex2oat
yürütülebilir dosya velibart-compiler.so
şunu kullanarak:llvm-profdata merge -output=dex2oat.profdata \ dex2oat_exe.profdata dex2oat_libart-compiler.profdata
- Profilleri birleştirerek
libart.so
adlı kullanıcının profilini edinin :llvm-profdata merge -output=libart.profdata \ dex2oat_libart.profdata art_runtime_libart.profdata
İki profilden
libart.so
için işlenmemiş sayılar şu şekilde olabilir: değerler test durumu sayısı ve test durumu sayısı açısından farklılık gösterdiğinden, süresini belirler. Bu durumda, ağırlıklı birleştirme kullanabilirsiniz:llvm-profdata merge -output=libart.profdata \ -weighted-input=2,dex2oat_libart.profdata \ -weighted-input=1,art_runtime_libart.profdata
Yukarıdaki komut,
dex2oat
Gerçek ağırlık, alana göre belirlenmelidir gerçek bilgi veya deneydir. dex2oat.profdata
profil dosyalarını kontrol edin ve Şu süre içintoolchain/pgo-profiles
:libart.profdata
bahsedeceğim.
Alternatif olarak tüm kitaplıklarla tek bir araçlı derleme oluşturabilirsiniz enstrümantasyon yöntemi şöyledir:
make ANDROID_PGO_INSTRUMENT=dex2oat,art_runtime (or) make ANDROID_PGO_INSTRUMENT=ALL
İkinci komut, Virtual Verde için PGO özellikli tüm modülleri profil çıkarma.