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.jl
dosyası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_all
Varsayılan olarak, yalnızca mikro mimari özelliklerinden en çok fayda sağlayacak olan işlevler kopyalanacaktır. Ancak, bir hedef için
clone_all
belirtildiğ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_all
negatif 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_all
değ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 ya0
olmalı ya da başka birclone_all
hedefi olmalıdır. Temel hedef olarak birclone_all
olmayan hedef belirtmek bir hataya neden olacaktır.opt_size
Bu, hedefin işlevinin, önemli bir çalışma zamanı performans etkisi olmadığında boyut için optimize edilmesine neden olur. Bu,
-Os
GCC ve Clang seçeneğine karşılık gelir.min_size
Bu, hedefin boyut için optimize edilmesine neden olur ve bu da önemli bir çalışma zamanı performans etkisi yaratabilir. Bu,
-Oz
Clang 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.cpp
dosyasına iletilir. Klonlama yapmanın yanı sıra, dağıtım slotlarını ekler (bunun nasıl yapıldığı içinMultiVersioning::runOnModule
iç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.h
dosyası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_*.cpp
iç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.cpp
içindedir.