Profil yönlendirmeli optimizasyonu kullanma

.

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:

  1. Kitaplık/yürütülebilir dosya ve yürütülebilir dosyayı Derleyici ve bağlayıcı için -fprofile-generate.
  2. araçlı ikili program.
  3. Profilleri llvm-profdata yardımcı programını kullanarak sonradan işleme (ayrıntılar için bkz. LLVM'yi kullanma profil dosyalarınız).
  4. 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ı:

  1. Bir karşılaştırma belirlemeyi ve değerlendirebiliriz.
  2. Karşılaştırmaya ve kitaplıklara pgo mülkleri ekleyin (ayrıntılar bölümüne bakın).
  3. 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.

  1. Enstrümanlı derlemeyi bir cihazda Flash veya senkronize edin.
  2. Profilleri toplamak için karşılaştırma yapın.
  3. 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
  1. Şu pgo özelliğini dex2oat öğesine ekleyin, libart-compiler.so:
        pgo: {
            instrumentation: true,
            benchmarks: ["dex2oat",],
            profile_file: "dex2oat.profdata",
        }
  2. Şu pgo özelliğini libart.so ürününe ekleyin:
        pgo: {
            instrumentation: true,
            benchmarks: ["art_runtime", "dex2oat",],
            profile_file: "libart.profdata",
        }
  3. dex2oat ve için araçlarlı derlemeler oluşturun Şunlar kullanılarak art_runtime karşılaştırma:
        make ANDROID_PGO_INSTRUMENT=dex2oat
        make ANDROID_PGO_INSTRUMENT=art_runtime
  4. 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.

  5. Karşılaştırmaları dex2oat uygulayın ve Almak için art_runtime:
  6. dex2oat yürütülebilir dosya ve libart-compiler.so şunu kullanarak:
    llvm-profdata merge -output=dex2oat.profdata \
        dex2oat_exe.profdata dex2oat_libart-compiler.profdata
  7. 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.

  8. dex2oat.profdata profil dosyalarını kontrol edin ve Şu süre için toolchain/pgo-profiles: libart.profdata bahsedeceğim.