Profil Kılavuzlu Optimizasyonu (PGO) Kullanma (<=13)

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 kullanma

PGO'yu kullanmak aşağıdaki adımları içerir:

  1. Derleyiciye ve bağlayıcıya -fprofile-generate ileterek kitaplığı/yürütülebilir dosyayı enstrümantasyonla oluşturun.
  2. Araçlandırılmış ikili dosyada temsili bir iş yükünü çalıştırarak profilleri toplayın.
  3. llvm-profdata yardımcı programını kullanarak profilleri sonradan işleyin (ayrıntılar için bkz. LLVM profil dosyalarının işlenmesi ).
  4. -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 toplama

Clang, kitaplığın araçlı 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:

  1. Bir kıyaslama noktası ve bu kıyaslama tarafından toplu olarak uygulanan kütüphaneler kümesini tanımlayın.
  2. Karşılaştırma ve kitaplıklara pgo özelliklerini ekleyin (ayrıntılar aşağıdadır).
  3. 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 özgü değildir ve bu belgenin kapsamı dışındadır.

  1. Enstrümanlı yapıyı bir cihazda flaşlayın veya senkronize edin.
  2. Profilleri toplamak için karşılaştırmayı çalıştırın.
  3. 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 dist hedefini 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ştirme

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ı yönetme

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 kütüphane 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
  1. Aşağıdaki pgo özelliğini dex2oat , libart-compiler.so dosyasına ekleyin:
        pgo: {
            instrumentation: true,
            benchmarks: ["dex2oat",],
            profile_file: "dex2oat.profdata",
        }
  2. libart.so aşağıdaki pgo özelliğini ekleyin:
        pgo: {
            instrumentation: true,
            benchmarks: ["art_runtime", "dex2oat",],
            profile_file: "libart.profdata",
        }
  3. Aşağıdakileri kullanarak dex2oat ve art_runtime kıyaslamaları için aletli yapılar oluşturun:
        make ANDROID_PGO_INSTRUMENT=dex2oat
        make ANDROID_PGO_INSTRUMENT=art_runtime
  4. 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 tüm PGO-etkin modülleri oluşturur.

  5. Aşağıdakileri elde etmek için dex2oat ve art_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 ve dexeoat_libart.profdata ).
    • Tek bir art_runtime_libart.profdata .
  6. Aşağıdakileri kullanarak dex2oat yürütülebilir dosyası ve libart-compiler.so için ortak bir profdata dosyası oluşturun:
    llvm-profdata merge -output=dex2oat.profdata \
        dex2oat_exe.profdata dex2oat_libart-compiler.profdata
  7. İ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.

  8. Derleme sırasında kullanılmak üzere dex2oat.profdata ve libart.profdata profil dosyalarını toolchain/pgo-profiles kontrol edin.