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çinadb
öğesini kullanın yemek tarifi burada bulabilirsiniz.