Profil Kılavuzlu Optimizasyon

Profil rehberli optimizasyon (PGO) iyi bilinen bir derleyici optimizasyonudur tekniği inceleyelim. PGO'da, bir programın yürütme işlemlerine ait çalışma zamanı profilleri en iyi performans gösteren derleyici özelliklerinden yararlanabilirsiniz. Bu da performansı iyileştirdi ve kod boyutunu küçülttü.

PGO, aşağıdaki adımlar uygulanarak uygulamanıza veya kitaplığınıza dağıtılabilir: 1. Temsili bir iş yükü belirleyin. 2. Profilleri topla. 3. Sürüm derlemesinde profilleri kullanın.

1. Adım: Temsilci İş Yükü Belirleme

Öncelikle, uygulamanız için temsili bir karşılaştırma veya iş yükü belirleyin. İş yükünden toplanan profiller verileri tanımlamak için kritik bir adımdır. sıcak ve soğuk bölgeleri görebilirsiniz. Profilleri kullanırken derleyici, agresif optimizasyonlar gerçekleştirmek ve sıcak bölgelerde satır içi yapmak. Derleyici küçük bölgelerin kod boyutunu küçültmeyi de tercih edebilir. bazı yolları da görmüştük.

İyi bir iş yükü belirlemek, proje yönetimindeki her türlü projede performansı takip etmek genel.

2. Adım: Profilleri toplayın

Profil toplama işlemi üç adımdan oluşur: - araçlar ile yerel kod oluşturma, - enstrümanlı uygulamayı cihazda çalıştırma ve profil oluşturma ve - ana makinedeki profilleri birleştirme/son işleme.

Araçlı Derleme Oluşturma

Profiller, 1. adımdaki iş yükü bir cihazda çalıştırılarak toplanır. enstrümantasyonlu geliştirmeyi kapsıyor. Araçlı bir derleme oluşturmak için Derleyici ve bağlayıcı işaretlerine -fprofile-generate. Bu işaret sırasında bayrak gerekli olmadığından ayrı bir derleme değişkeni tarafından kontrol varsayılan derlemedir.

Profil Oluştur

Sonra, enstrümanlı uygulamayı cihazda çalıştırın ve profil oluşturun. Araçlarla kullanılan ikili program çalıştırıldığında, profiller bellekte toplanır ve bir dosyaya yazılır. Ancak atexit öğesine kaydedilen işlevler uygulama hemen kapatılır.

Uygulamanın/iş yükünün, profil dosyasının yolunu belirlemek için ek çalışma yapması gerekiyor ve ardından açıkça profil yazma işlemi tetikleyebilir.

  • Profil dosyası yolunu ayarlamak için şunu arayın: __llvm_profile_set_filename(PROFILE_DIR "/default-%m.profraw %m faydalı olduğunda da kullanabilirsiniz. %m` benzersiz bir modüle genişler her kitaplık için ayrı bir profil oluşturulur. Görüntüleyin burada başka yararlı kalıp tanımlayıcılara bakın. PROFILE_DIR, yazması gerekir. Demoya göz atın bu dizini algılamak için kullanılır.
  • Profil yazma işlemini açıkça tetiklemek için __llvm_profile_write_file yöntemini çağırın işlevini kullanın.
extern "C" {
extern int __llvm_profile_set_filename(const char*);
extern int __llvm_profile_write_file(void);
}

#define PROFILE_DIR "<location-writable-from-app>"
void workload() {
  // ...
  // run workload
  // ...

  // set path and write profiles after workload execution
  __llvm_profile_set_filename(PROFILE_DIR "/default-%m.profraw");
  __llvm_profile_write_file();
  return;
}

Not: İş yükü bağımsız bir ikili programsa profil dosyası oluşturmak daha kolaydır — LLVM_PROFILE_FILE ortam değişkenini %t/default-%m.profraw olarak ayarlamanız yeterli çalıştırmadan önce başlayın.

İşlem Sonrası Profilleri

Profil dosyaları .profraw biçimindedir. Öncelikle şuradan getirilmelidirler: adb pull kullanarak cihazda. Getirme işleminden sonra llvm-profdata yardımcı programını şurada kullanın: NDK'yı .profraw değerinden .profdata değerine dönüştürür ve bu daha sonra derleyici olarak da adlandırılır.

$NDK/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-profdata \
    merge --output=pgo_profile.profdata \
    <list-of-profraw-files>

Sürümden kaçınmak için aynı NDK sürümüne ait llvm-profdata ve clang öğelerini kullanın profil dosyası biçimleri arasında uyuşmazlık var.

3. Adım: Uygulama Derlemek İçin Profilleri Kullanma

uygulamasını derleyici ve bağlayıcıya -fprofile-use=<>.profdata ileterek uygulayabilirsiniz. İlgili içeriği oluşturmak için kullanılan profiller kod geliştikçe bile kullanılabilir; Clang derleyicisi tolere edebilmektedir Kaynak ve profiller arasında küçük bir uyumsuzluk var.

Not: Genel olarak, çoğu kitaplık için profiller mimarilerde ortaktır. Örneğin, kitaplığın arm64 yapısından oluşturulan profiller tüm mimarileri kapsıyor. Ancak burada dikkat edilmesi gereken nokta, kitaplıktaki kod yolları (arm, x86, 32 bit veya 64 bit), ayrı profiller kullanılmalıdır.

Özet

https://github.com/DanAlbert/ndk-samples/tree/pgo/pgo bir uygulamadan PGO kullanımıyla ilgili baştan sona bir demo gösteriyor. Ek bilgiler sağlar incelenen bazı ayrıntılara dikkat edin.

  • CMake derlemesi kurallar enstrümantasyonla yerel kod oluşturan bir CMake değişkeninin nasıl ayarlanacağını gösterir. Derleme değişkeni ayarlanmadığında yerel kod, daha önce PGO profilleri oluşturuldu.
  • Araçlarla yapılan bir yapıda pgodemo.cpp profillerin iş yükü yürütme olduğunu yazar.
  • Profiller için yazılabilir bir konum, çalışma zamanında MainActivity.kt applicationContext.cacheDir.toString() kullanılıyor.
  • adb root gerektirmeden cihazdan profil almak için adb öğesini kullanın yemek tarifi burada bulabilirsiniz.