Profil Kılavuzlu Optimizasyon (PGO) nasıl çalışır?

Profil yönlendirmeli optimizasyon (PGO veya "pogo" olarak da bilinir), oyununuzun gerçek dünyada oynandığında nasıl davrandığıyla ilgili bilgileri kullanarak oyununuzun optimize edilmiş derlemelerini daha da optimize etmenin bir yoludur. Bu sayede, hata veya uç durumlar gibi seyrek çalıştırılan kodlar kodunuzun kritik yürütme yollarındaki vurgusunu azaltarak işlemi hızlandırır.

PGO'nun işleyiş şeklinin görsel olarak
genel bakışını gösteren bir diyagram

Şekil 1. PGO'nun işleyiş şekline dair genel bir bakış.

PGO kullanmak için önce derlemenizi kullanarak derleyicinin çalışabileceği profil verilerini oluşturursunuz. Daha sonra, bu derlemeyi çalıştırıp bir veya daha fazla profil veri dosyası oluşturarak kodunuzu kullanırsınız. Son olarak, bu dosyaları cihazdan geri kopyalar ve yakaladığınız profil bilgilerini kullanarak yürütülebilir dosyanızı optimize etmek için derleyiciyle birlikte kullanırsınız.

PGO olmadan optimize edilmiş derlemelerin işleyiş şekli

Profil verileri kullanılmadan optimize edilen bir derleme, optimize edilmiş kodun nasıl oluşturulacağına karar verirken bir dizi bulgusal yöntemden yararlanır.

Bunlardan bazıları, geliştirici tarafından açıkça belirtilir (örneğin, C++ 20 veya sonraki sürümlerde [[likely]] ve [[unlikely]] gibi kol yönü ipuçları kullanılarak). Diğer bir örnek de inline anahtar kelimesini, hatta __forceinline anahtar kelimesini kullanmaktır (bununla birlikte, genel olarak, ilk anahtar kelimeyi kullanmak daha iyi ve esnektir). Varsayılan olarak bazı derleyiciler, bir dalın ilk ayağının (yani else bölümü değil, if ifadesi) en olası ay olduğunu varsayar. Optimize Edici, kodun nasıl çalışacağıyla ilgili statik analizinden de varsayımlarda bulunabilir. Ancak bu, genellikle kapsamla sınırlıdır.

Bu buluşsal yöntemlerin sorunu, çok kapsamlı manuel işaretlemeyle bile her durumda derleyiciye doğru şekilde yardımcı olamamalarıdır. Bu nedenle, oluşturulan kod genellikle iyi optimize edilmiş olsa da, derleyicinin çalışma zamanında davranışı hakkında daha fazla bilgi sahibi olsaydı iyi olmazdı.

Profil oluşturuluyor

Yürütülebilir dosyanız araçlı modda PGO ile oluşturulduğunda, yürütülebilir dosyanız her kod bloğunun başında (örneğin, bir işlevin başlangıcı veya bir dalın her kolunun başlangıcı) kodla artar. Bu kod, derleyicinin daha sonra optimize edilmiş kod oluşturmak için kullanabileceği kod çalıştırılarak blokun her giriliş sayısını izlemek için kullanılır.

Başka bir izleme de gerçekleştirilir. Örneğin, bir bloktaki tipik kopyalama işlemlerinin boyutu. Bu sayede, işlemin hızlı, satır içi sürümleri daha sonra oluşturulabilir.

Oyun tarafından bir tür temsili işlem gerçekleştirildikten sonra, yürütülebilir oyunun profil verilerini cihazdaki özelleştirilebilir bir konuma yazmak için bir işlevi (__llvm_profile_write_file()) çağırması gerekir. Derleme yapılandırmanızda PGO araçları etkinleştirildiğinde bu işlev otomatik olarak oyununuza bağlanır.

Daha sonra, yazılı profil verisi dosyası ana bilgisayara tekrar kopyalanmalı ve birlikte kullanılabilmesi için tercihen aynı derlemedeki diğer profillerle birlikte bir konumda tutulmalıdır.

Örneğin, oyun kodunuzu mevcut oyun sahnesi sona erdiğinde __llvm_profile_write_file() çağrısı yapacak şekilde değiştirebilirsiniz. Ardından, profil almak için araçları açık şekilde oyununuzu oluşturur ve Android cihazınıza dağıtırsınız. Profil verileri otomatik olarak yakalanır. KG mühendisiniz farklı senaryolar üzerinden oyunda ilerler (ya da test başarılı bir şekilde geçer).

Oyununuzun farklı bölümlerindeki egzersizleri tamamladığınızda ana menüye geri dönebilirsiniz. Bu işlem mevcut oyun sahnesini sona erdirir ve profil verilerini yazar.

Daha sonra bir komut dosyası, profil verilerini test cihazından kopyalamak ve daha sonra kullanılmak üzere kaydedilebilecek merkezi bir depoya yüklemek için kullanılabilir.

Profil verileri birleştiriliyor

Bir profil, cihazdan alındıktan sonra, göstergeli derleme tarafından oluşturulan profil verileri dosyasından derleyicinin kullanabileceği bir biçime dönüştürülmesi gerekir. AGDE, projenize eklediğiniz tüm profil verisi dosyaları için bunu sizin yerinize otomatik olarak yapar.

PGO, birden fazla araçlı profil çalıştırmasının sonuçlarını bir arada birleştirecek şekilde tasarlanmıştır. Tek bir projede birden fazla dosyanız varsa AGDE bunu sizin için otomatik olarak da yapar.

Profil veri kümelerini birleştirmenin nasıl yararlı olabileceğine örnek olarak, her biri oyununuzun farklı seviyelerini oynayan KG mühendislerinden oluşan bir laboratuvarınız olduğunu varsayalım. Her bir oyuncunun oyunu kaydedilir ve daha sonra oyununuzun PGO destekli bir derlemesinden profil verileri oluşturmak için kullanılır. Profilleri birleştirme, daha iyi sonuçlar elde etmek için kodunuzun son derece farklı bölümlerini yürütebilen tüm bu farklı test çalıştırmalarından gelen sonuçları birleştirmenize olanak tanır.

Daha da iyisi, profil verilerinin kopyalarını dahili sürümden dahili sürüme kadar tuttuğunuz boylamsal testler gerçekleştirirken yeniden oluşturma işlemi, eski profil verilerini zorunlu olarak geçersiz kılmaz. Çoğunlukla, kod, sürümden kullanıma sürüm arasında görece kararlıdır. Bu nedenle, eski derlemelerdeki profil verileri yine de kullanışlı olabilir ve hemen eskimez.

Profil Kılavuzlu Optimize Edilmiş Derlemeler Oluşturma

Profil verilerini projenize ekledikten sonra derleme yapılandırmanızda Optimizasyon modunda PGO'yu etkinleştirerek yürütülebilir verilerinizi oluşturmak için bu verileri kullanabilirsiniz.

Bu, derleyicinin optimize edicisini, optimizasyon kararları verirken daha önce topladığınız profil verilerini kullanmaya yönlendirir.

Profil Rehberli Optimizasyon ne zaman kullanılır?

PGO'nun amacı, geliştirmenin başında veya kod üzerinde günlük yineleme sırasında sağlanan bir şey değildir. Geliştirme sırasında çok daha büyük avantajlar sağlayacak algoritmik ve veri düzenine dayalı optimizasyonlara odaklanmalısınız.

PGO, geliştirme sürecinde daha sonra, onu yayın için hazırlarken devreye girer. Profil Kılavuzlu Optimizasyonu, kodunuzu kendiniz optimize etmek için biraz zaman harcadıktan sonra kodunuzun son performansını sıkmanızı sağlayan bir kiraz gibi düşünebilirsiniz.

PGO ile beklenen performans artışı

Bu durum, profillerinizin ne kadar kapsamlı ve eski olduğu ve geleneksel olarak optimize edilmiş bir derlemeyle kodunuzun optimum duruma ne kadar yakın olacağı gibi çok sayıda faktöre bağlıdır.

Genel olarak, CPU maliyetlerinin önemli iş parçacıklarında yaklaşık% 5 azalması çok muhafazakar bir tahmindir. Farklı sonuçlar görebilirsiniz.

Enstrümantasyon ek yükü

PGO'nun araçları kapsamlıdır ve otomatik olarak oluşturulsa da ücretsiz değildir. PGO enstrümantasyonunun ek yükü, kod tabanınıza bağlı olarak değişiklik gösterebilir.

Profil Yönlendirmeli Araçların performans maliyeti

Enstrümanlı yapılarla kare hızında düşüş görebilirsiniz. Bazı durumlarda, normal çalışma sırasında CPU'nuzun% 100'üne ne kadar yakın olduğuna bağlı olarak, bu düşüş normal oyun oynamayı zorlaştıracak kadar büyük olabilir.

Çoğu geliştiricinin, oyunları için yarı belirleyici bir tekrar oyun modu geliştirmesini öneririz. Bu tür bir işlev, KG ekibinizin oyunu oyununuzdaki bilinen, tekrarlanabilir bir başlangıç konumunda başlatma (oyunu kaydetme veya belirli bir test seviyesi gibi) ve ardından girdilerini kaydetme olanağı sağlar. Test derlemesinden kaydedilen bu giriş, PGO Enstrümanlı bir derlemeye beslenebilir, oynatılabilir ve oyun oynanamayacak kadar yavaş çalışıyor olsa bile tek bir karenin işlenmesi ne kadar sürdüğünden bağımsız olarak gerçek dünya profil verileri oluşturabilir.

Bu tür bir işlevin test kullanıcısı çalışmalarını artırma gibi başka önemli faydaları da vardır: Bir test kullanıcısı, girdisini bir cihaza kaydedebilir ve daha sonra bu bilgiler, duman testi amacıyla birden fazla farklı cihaz türünde oynatılabilir.

Ekosistemde çok sayıda cihaz varyantı olan ve bununla sınırlı olmayan Android'de böyle bir tekrar oynatma sistemi çok büyük avantajlar sağlayabilir: Kesintisiz entegrasyon derleme sisteminizin temel bir parçası da oluşturabilir ve gece boyunca düzenli olarak performans regresyonu ve duman testleri yapabilirsiniz.

Kayıt, oyununuzun giriş mekanizması içinde en uygun noktada kullanıcı girişini kaydetmelidir (büyük olasılıkla doğrudan dokunmatik ekran etkinlikleri değil, bunun yerine komut olarak sonuçlarını kaydeder). Bu girişler, oyun sırasında monoton bir şekilde artan kare sayısını da içermelidir. Böylece, tekrar oynatma mekanizması bir etkinliği tetiklemesi gereken uygun kareyi bekleyebilir.

Oynatma modunda, oyununuz çevrimiçi oturum açmaktan kaçınmalı, reklam göstermemeli ve sabit bir zaman adımında (hedef kare hızınızda) çalışmalıdır. vsync'i devre dışı bırakmayı düşünmeniz gerekir.

Oyununuzdaki her şeyin (örneğin, parçacık sistemleri) tamamen determinist bir şekilde tekrarlanabilir olması önemli değildir, ancak aynı işlemler oyun içi aynı sonuçları ve sonuçları sunmalıdır. Yani, oynanabilirlik aynı olmalıdır.

Profil Destekli Araçların bellek maliyeti

PGO enstrümantasyonunun bellek ek yükü, derlenen belirli kitaplığa bağlı olarak büyük ölçüde değişiklik gösterir. Testlerimizde, yürütülebilir testin boyutunda genel olarak yaklaşık 2,2 kat artış gördük. Bu boyut artışı, hem kod bloklarını izlemek için gereken ekstra kodu hem de sayaçları depolamak için gereken alanı içeriyordu. Bu testler tam kapsamlı değildir ve deneyiminiz farklılık gösterebilir.

Profil verilerinizi ne zaman güncelleme veya silmelisiniz?

Kodunuzda (veya oyun içeriğinizde) büyük bir değişiklik yaptığınızda profillerinizi güncellemeniz gerekir.

Bunun ne anlama geldiği, derleme ortamınıza ve geliştirme aşamasında olduğunuz yere bağlıdır.

Daha önce de belirtildiği gibi, önemli yapı ortamı değişikliklerinde profil verilerini taşımamalısınız. Bu durum, derlemenizi oluşturmanızı veya bozmanızı engellemez ancak yeni derleme ortamı için çok az profil verisi geçerli olacağından, PGO kullanmanın performans faydaları azalır. Ancak bu, profil verilerinizin eskiyebileceği tek durum değildir.

İlk olarak, bir yayına hazırlanırken geliştirme sürecinin sonuna yaklaşıncaya kadar PGO'yu kullanmayacağınızı varsayalım. Bunu, performans odaklı mühendislerin yayın tarihine yakın herhangi bir beklenmedik kesinti yaşanmayacağını doğrulayabilmesi için haftalık çekimler yapmaktan daha fazlasını yapabilirsiniz.

Bu durum, yayın aralığınıza yaklaştıkça, yani KG ekibiniz her gün test edip oyunu kapsamlı bir şekilde yürütürken değişir. Bu aşamada, söz konusu verilerden her gün profiller oluşturabilir ve bunları gelecekteki derlemeler için performans testi ve kendi performans bütçelerinizi ayarlamak amacıyla kullanabilirsiniz.

Bir sürüme hazırlanırken, yayınlamayı planladığınız derleme sürümünü kilitlemeniz ve ardından yeni profil verilerinizi oluşturmak için KG'yi çalıştırmanız gerekir. Daha sonra, yürütülebilir dosyanızın son sürümünü oluşturmak için bu verileri kullanarak derleme yaparsınız.

Ardından KG, bu optimize edilmiş gönderim yapısının kullanıma hazır olduğundan emin olmak için son bir deneme hazırlayabilir.