System Image Building
Building the Julia system image
Julia, Base modülünün içeriğini içeren bir önceden işlenmiş sistem görüntüsü ile birlikte gelir ve bu görüntü sys.ji olarak adlandırılır. Bu dosya, mümkün olan birçok platformda, çok daha iyi başlangıç süreleri sağlamak amacıyla sys.{so,dll,dylib} adlı bir paylaşılan kütüphaneye de önceden derlenmiştir. Önceden derlenmiş bir sistem görüntüsü dosyası ile birlikte gelmeyen sistemlerde, Julia'nın DATAROOTDIR/julia/base klasöründe bulunan kaynak dosyalarından bir tane oluşturulabilir.
Julia varsayılan olarak mevcut sistem iş parçacıklarının yarısı kadar sistem görüntüsü oluşturacaktır. Bu, JULIA_IMAGE_THREADS ortam değişkeni ile kontrol edilebilir.
Bu işlem birden fazla nedenle faydalıdır. Bir kullanıcı:
- Bir önceden derlenmiş paylaşımlı kütüphane sistem görüntüsü oluşturun ve bu görüntü, bir kütüphane ile birlikte gelmeyen bir platformda çalıştırılarak başlangıç sürelerini iyileştirin.
Base'i değiştirin, sistem görüntüsünü yeniden oluşturun ve Julia bir sonraki başlatıldığında yeniBase'i kullanın.userimg.jldosyasını dahil edin, bu dosya paketleri sistem görüntüsüne ekleyerek, başlangıç ortamına gömülü paketlere sahip bir sistem görüntüsü oluşturur.
PackageCompiler.jl package bu süreci otomatikleştirmek için kullanışlı sarmalayıcı fonksiyonlar içerir.
System image optimized for multiple microarchitectures
Sistem görüntüsü, aynı talimat seti mimarisi (ISA) altında birden fazla CPU mikro mimarisi için aynı anda derlenebilir. Farklı ISA uzantılarından veya diğer mikro mimari özelliklerinden yararlanmak amacıyla, paylaşılan işlevlere minimum dağıtım noktası eklenerek aynı işlevin birden fazla versiyonu oluşturulabilir. En iyi performansı sunan versiyon, mevcut CPU özelliklerine dayalı olarak çalışma zamanında otomatik olarak seçilecektir.
Specifying multiple system image targets
Bir çok mikro mimari sistem görüntüsü, sistem görüntüsü derlemesi sırasında birden fazla hedef geçilerek etkinleştirilebilir. Bu, ya JULIA_CPU_TARGET make seçeneği ile ya da derleme komutunu manuel olarak çalıştırırken -C komut satırı seçeneği ile yapılabilir. Birden fazla hedef, seçenek dizesinde ; ile ayrılır. Her hedefin sözdizimi, bir CPU adı ve ardından , ile ayrılmış birden fazla özellikten oluşur. LLVM tarafından desteklenen tüm özellikler desteklenir ve bir özellik - ön eki ile devre dışı bırakılabilir. (+ ön eki de kullanılabilir ve LLVM sözdizimi ile tutarlı olması için göz ardı edilir). Ayrıca, işlev klonlama davranışını kontrol etmek için birkaç özel özellik de desteklenmektedir.
Her hedef için clone_all veya base(<n>) belirtmek iyi bir uygulamadır, ilk hedef hariç. Bu, hangi hedeflerin tüm işlevlerin kopyalandığını ve hangi hedeflerin diğer hedeflere dayandığını açıkça belirtir. Bu yapılmazsa, varsayılan davranış her işlevi kopyalamamak ve kopyalanmayan bir işlev için yedek olarak ilk hedefin işlev tanımını kullanmaktır.
clone_allVarsayılan olarak, yalnızca mikro mimari özelliklerinden en çok fayda sağlayacak olan işlevler kopyalanacaktır. Ancak, bir hedef için
clone_allbelirtildiğinde, sistem görüntüsündeki tüm işlevler hedef için kopyalanacaktır. Tüm işlevlerin kopyalanmasını önlemek için-clone_allnegatif biçimi kullanılabilir.taban(<n>)Burada
<n>, negatif olmayan bir sayı için bir yer tutucudur (örneğin,base(0),base(1)). Varsayılan olarak, kısmen klonlanmış (yaniclone_alldeğil) bir hedef, bir işlev klonlanmadığında varsayılan hedeften (belirtilen ilk) işlevleri kullanacaktır. Bu davranış,base(<n>)seçeneği ile farklı bir temel belirterek değiştirilebilir.n'inci hedef (0'dan başlayarak) varsayılan (0'ıncı) hedef yerine temel hedef olarak kullanılacaktır. Temel hedef ya0olmalı ya da başka birclone_allhedefi olmalıdır. Temel hedef olarak birclone_allolmayan hedef belirtmek bir hataya neden olacaktır.opt_sizeBu, hedefin işlevinin, önemli bir çalışma zamanı performans etkisi olmadığında boyut için optimize edilmesine neden olur. Bu,
-OsGCC ve Clang seçeneğine karşılık gelir.min_sizeBu, hedefin boyut için optimize edilmesine neden olur ve bu da önemli bir çalışma zamanı performans etkisi yaratabilir. Bu,
-OzClang seçeneğine karşılık gelir.
Örnek olarak, bu yazının yazıldığı sırada, julialang.org adresinden indirilebilen resmi x86_64 Julia ikili dosyalarının oluşturulmasında aşağıdaki dize kullanılmaktadır:
generic;sandybridge,-xsaveopt,clone_all;haswell,-rdrnd,base(1)Bu, üç ayrı hedefle bir sistem görüntüsü oluşturur; biri genel bir x86_64 işlemcisi için, biri xsaveopt'u açıkça hariç tutan bir sandybridge ISA'sı ile tüm işlevleri açıkça klonlayan ve diğeri sandybridge sysimg sürümüne dayanan ve ayrıca rdrnd'yi hariç tutan haswell ISA'sını hedef alır. Bir Julia uygulaması oluşturulan sysimg'i yüklediğinde, ana işlemciyi eşleşen CPU yetenek bayrakları için kontrol eder ve mümkün olan en yüksek ISA seviyesini etkinleştirir. Temel seviye (generic) cx16 talimatını gerektirir, bu bazı sanallaştırma yazılımlarında devre dışı bırakılmıştır ve generic hedefinin yüklenebilmesi için etkinleştirilmesi gerekir. Alternatif olarak, daha fazla uyumluluk için generic,-cx16 hedefi ile bir sysimg oluşturulabilir, ancak bunun bazı kodlarda performans ve kararlılık sorunlarına neden olabileceğini unutmayın.
Implementation overview
Bu, uygulamanın uygulanmasında yer alan farklı parçaların kısa bir özetidir. Daha fazla uygulama ayrıntısı için her bileşen için kod yorumlarına bakın.
Sistem görüntü derlemesi
src/processor*içindeki ayrıştırma ve klonlama kararı verilmektedir. Şu anda döngülerin, simd talimatlarının veya diğer matematiksel işlemlerin (örneğin fastmath, fma, muladd) varlığına dayalı olarak fonksiyon klonlamayı destekliyoruz. Bu bilgi, gerçek klonlamayı yapansrc/llvm-multiversioning.cppdosyasına iletilir. Klonlama yapmanın yanı sıra, dağıtım slotlarını ekler (bunun nasıl yapıldığı içinMultiVersioning::runOnModuleiçindeki yorumlara bakın), geçiş ayrıca sistem görüntüsünün doğru bir şekilde yüklenip başlatılabilmesi için meta veriler de üretir. Meta verilerin ayrıntılı bir açıklamasısrc/processor.hdosyasında mevcuttur.Sistem görüntüsü yükleniyor
Sistem görüntüsünün yüklenmesi ve başlatılması, sistem görüntüsü oluşturma sırasında kaydedilen meta verilerin ayrıştırılmasıyla
src/processor*içinde yapılır. Ana bilgisayar özelliklerinin tespiti ve seçim kararı, ISA'ya bağlı olaraksrc/processor_*.cppiçinde yapılır. Hedef seçimi, tam CPU adı eşleşmesini, daha büyük vektör kayıt boyutunu ve daha fazla özellik sayısını tercih eder. Bu sürecin genel bir görünümüsrc/processor.cppiçindedir.