CPython Core Dev Sprint'te gerçek dünyada JIT Trace
(antocuni.eu)CPython'ın yeni izleme JIT (Just-In-Time) derleyicisinin karşı karşıya olduğu teknik zorluklara dair derinlemesine bir özet.
İzleme engelleyicileri (Trace Blockers)
İzleme JIT, program çalışırken sık çalıştırılan kod yollarını ("hot path") belirler ve bu yolların mikro işlemlerini (micro-operations) kaydederek optimize edilmiş makine kodu üretir. Ancak JIT, içine bakamadığı kodla, yani "izleme engelleyicileri" ile karşılaştığında bu süreç durur. CPython'da bunun tipik örneği, C ile yazılmış genişletme fonksiyonlarının çağrılmasıdır.
- Teknik açıklama: Blog yazısı, π hesaplayan saf bir Python fonksiyonunu örnek veriyor. PyPy'nin JIT'i bu sayısal hesaplama döngüsünü son derece verimli biçimde optimize ederek CPython'dan 42 kat daha hızlı performans gösteriyor. Ancak döngü içine JIT'in izleyemediği tek bir C fonksiyon çağrısı (
hic_sunt_leones()) eklendiğinde, PyPy'nin performansı aniden CPython'dan yalnızca 1,8 kat hızlı bir seviyeye düşüyor. Bu tek izleme engelleyicisi, JIT'in optimizasyon kabiliyetinin büyük bölümünü etkisiz hale getiriyor. Bunun nedeni, JIT'in C fonksiyonunun iç davranışını bilememesi; dolayısıyla tüm döngüyü tek bir birim olarak optimize edememesi ve kodu C fonksiyon çağrısından önce ve sonra ayırarak işlemesidir.
Veri odaklı kontrol akışı (Data-Driven Control Flow)
Bu sorun, programın kontrol akışı giriş verisine göre büyük ölçüde değiştiğinde ortaya çıkar. İzleme JIT, tutarlı bir "hot path" olduğu varsayımı altında en etkili şekilde çalışır; ancak veriye göre yürütme yolu sürekli değişirse bu varsayım bozulur.
- Teknik açıklama: Blog yazısı, 9 argüman alan bir fonksiyonu örnek veriyor. Her argüman
Noneya da bir sayı olabilir ve fonksiyon içindeif <var> is None: ...biçiminde koşullu ifadeler art arda yer alır. Bu durumda, argümanlardakiNonedeğerlerinin kombinasyonuna göre çalıştırılan kod yolu her seferinde farklılaşır. Sonuç olarak JIT, "üstel sayıda trace (exponential number of traces)" sorunuyla karşı karşıya kalır. Yani JIT,Noneargümanlarının tüm olası kombinasyonları için ayrı optimize edilmiş kod üretmeye çalışır; bu da muazzam bir ek yük yaratır ve sonunda JIT kullanmayan CPython'dan bile çok daha yavaş bir sonuca yol açar.
Sonuç olarak bu blog yazısı, CPython'ın yeni izleme JIT'inin başarıyla yerleşebilmesi için bu "izleme engelleyicileri" ve "veri odaklı kontrol akışı" sorunlarını çözmesi gerektiğini vurguluyor. Bu, yalnızca uygulamaya dair bir mesele değil; izleme JIT teknolojisinin kendisine özgü temel bir sınır da olabilir.
Henüz yorum yok.