GNU Yapısı

Make ile Paralel Kod Derleme

Make ile Paralel Kod Derleme

Yazılımın nasıl düzgün bir şekilde oluşturulacağını sorduğunuzda, cevaplardan biri olarak Make ile karşınıza çıkacaktır. GNU/Linux sistemlerinde, GNU Make [1], 40 yıldan uzun bir süre önce - 1976'da piyasaya sürülen orijinal Make'ın Açık Kaynak versiyonudur. Makefile ile çalışın - yazılım oluşturma sürecinin yapım kılavuzu olarak en iyi şekilde tanımlanabilecek bu ada sahip yapılandırılmış bir düz metin dosyası. Makefile, bir dizi etiket (hedef olarak adlandırılır) ve her bir hedefi oluşturmak için yürütülmesi gereken özel talimatları içerir.

Basitçe söylemek gerekirse, Make bir inşa aracıdır. Makefile'daki görevlerin tarifini takip eder. Adımları bir terminale yazmak yerine otomatik bir şekilde tekrarlamanıza izin verir (ve muhtemelen yazarken hata yaparsınız).

Liste 1, “e1” ve “e2” iki hedefinin yanı sıra “tümü” ve “temiz” olmak üzere iki özel hedefi olan bir Makefile örneğini göstermektedir."make e1" çalıştırıldığında, "e1" hedefi için yönergeler yürütülür ve boş bir dosya oluşturulur. "make e2"yi çalıştırmak, "e2" hedefi için aynı şeyi yapar ve iki boş dosya oluşturur. "hepsini yap" çağrısı, önce hedef e1 ve sonra e2 için talimatları yürütür. Önceden oluşturulmuş bir ve iki dosyaları kaldırmak için, "make clean" çağrısını yürütmeniz yeterlidir.”

Liste 1

hepsi: e1 e2
e1:
birine dokun
e2:
iki dokun
temiz:
bir iki rm

Koşu Markası

Genel durum, Makefile'nizi yazmanız ve ardından yazılımı ve bileşenlerini oluşturmak için "make" veya "make all" komutunu çalıştırmanızdır. Tüm hedefler seri sırayla ve herhangi bir paralelleştirme olmadan inşa edilmiştir. Toplam inşa süresi, her bir hedefi oluşturmak için gereken zamanın toplamıdır.

Bu yaklaşım küçük projeler için iyi sonuç verir ancak orta ve daha büyük projeler için oldukça uzun sürer. Mevcut işlemcilerin çoğu birden fazla çekirdekle donatıldığından ve aynı anda birden fazla işlemin yürütülmesine izin verdiğinden bu yaklaşım artık güncel değildir. Bu fikirleri göz önünde bulundurarak, inşa sürecinin paralel hale getirilip getirilemeyeceğine ve nasıl paralel hale getirilebileceğine bakıyoruz. Amaç sadece inşa süresini azaltmaktır.

İyileştirmeler Yapın

Sahip olduğumuz birkaç seçenek var - 1) kodu basitleştirin, 2) tek görevleri farklı hesaplama düğümlerine dağıtın, kodu orada oluşturun ve oradan sonucu toplayın, 3) kodu tek bir makinede paralel olarak oluşturun ve 4) 2. ve 3. seçenekleri birleştirin.

Seçenek 1) her zaman kolay değildir. Uygulanan algoritmanın çalışma zamanını analiz etme iradesini ve derleyici hakkında bilgi sahibi olmayı gerektirir.e., derleyici programlama dilindeki talimatları işlemci talimatlarına nasıl çevirir?.

Seçenek 2), özel bilgi işlem düğümleri, kullanılmayan veya daha az kullanılan makineler, AWS gibi bulut hizmetlerinden sanal makineler veya LoadTeam [5] gibi hizmetlerden kiralanan bilgi işlem gücü gibi diğer bilgi işlem düğümlerine erişim gerektirir. Gerçekte, bu yaklaşım yazılım paketleri oluşturmak için kullanılır. Debian GNU/Linux sözde Autobuilder ağını [17] kullanır ve RedHat/Fedors Koji'yi kullanır [18]. Google, sistemine BuildRabbit adını veriyor ve Aysylu Greenberg tarafından yapılan konuşmada mükemmel bir şekilde açıklanıyor [16]. distcc [2], farklı düğümlerde paralel olarak kod derlemenize ve kendi derleme sisteminizi kurmanıza izin veren, dağıtılmış bir C derleyicisidir.

Seçenek 3, yerel düzeyde paralelleştirmeyi kullanır. Seçenek 2'deki gibi ek donanım gerektirmediği için sizin için en iyi maliyet-fayda oranına sahip seçenek bu olabilir. Make paralel olarak çalıştırma gereksinimi, çağrıya -j seçeneğini eklemektir (-jobs'ın kısaltması). Bu, aynı anda çalıştırılan işlerin sayısını belirtir. Aşağıdaki liste, 4 işi paralel olarak çalıştırmak için Make'dan ister:

Liste 2

$ make --işler=4

Amdahl yasasına göre [23], bu, inşa süresini yaklaşık %50 oranında azaltacaktır. Tek hedefler birbirine bağlı değilse, bu yaklaşımın iyi çalıştığını unutmayın; örneğin, hedef 3'ü oluşturmak için hedef 5'in çıktısı gerekli değildir.

Ancak, bir yan etkisi vardır: Her Make hedefi için durum mesajlarının çıktısı keyfi görünür ve bunlar artık bir hedefe açıkça atanamaz. Çıktı sırası, iş yürütmenin gerçek sırasına bağlıdır.

Yürütme Sırasını Tanımla

Hangi hedeflerin birbirine bağlı olduğunu anlamasına yardımcı olacak ifadeler var mı?? Evet! Liste 3'teki Makefile örneği şunu söylüyor:

* "tümü" hedefini oluşturmak için e1, e2 ve e3 talimatlarını çalıştırın

* hedef e2, hedef e3'ün daha önce oluşturulmasını gerektirir

Bu, önce e1 ve e3 hedeflerinin paralel olarak oluşturulabileceği anlamına gelir, önce e3'ün inşası tamamlanır tamamlanmaz e2 takip eder, son olarak.

Liste 3

hepsi: e1 e2 e3
e1:
birine dokun
e2: e3
iki dokun
e3:
üçe dokun
temiz:
rm bir iki üç

Bağımlılıkları Görselleştirin

makefile2graph [19] projesinden akıllı araç make2graph, Make bağımlılıklarını yönlendirilmiş bir döngüsel olmayan grafik olarak görselleştirir. Bu, farklı hedeflerin birbirine nasıl bağlı olduğunu anlamaya yardımcı olur. Make2graph, Graphviz projesindeki nokta komutunu kullanarak PNG görüntüsüne dönüştürebileceğiniz nokta biçiminde grafik açıklamaları çıkarır [22]. Çağrı şu şekilde:

Liste 4

$ hepsini yap -Bnd | make2graph | nokta -Tpng -o grafiği.png

İlk olarak Make, "all" hedefiyle çağrılır, ardından tüm hedefleri koşulsuz olarak oluşturmak için "-B" seçenekleri, hedef başına talimatları çalıştırıyormuş gibi yapmak için "-n" ("-dry-run" kısaltması) ve " -d” (“-debug”) hata ayıklama bilgilerini görüntülemek için. Çıktı, çıktısını görüntü dosyası grafiğini oluşturan noktaya yönlendiren make2graph'a aktarılır.PNG formatında png.


Liste 3 için yapı bağımlılığı grafiği

Daha Fazla Derleyici ve Derleme Sistemleri

Yukarıda açıklandığı gibi, Make, kırk yıldan fazla bir süre önce geliştirildi. Yıllar geçtikçe, işleri paralel olarak yürütmek giderek daha önemli hale geldi ve o zamandan beri daha yüksek düzeyde bir paralelleştirme elde etmek için özel olarak tasarlanmış derleyicilerin ve yapı sistemlerinin sayısı arttı. Araç listesi şunları içerir:

Çoğu, paralelleştirme düşünülerek tasarlanmıştır ve yapım süresiyle ilgili olarak Make'dan daha iyi bir sonuç sunar.

Sonuç

Gördüğünüz gibi, inşa süresini belirli bir seviyeye kadar önemli ölçüde azalttığı için paralel yapılar hakkında düşünmeye değer. Yine de başarılması kolay değildir ve bazı tuzaklarla birlikte gelir [3]. Paralel yapılara geçmeden önce hem kodunuzu hem de yapı yolunu analiz etmeniz önerilir.

Bağlantılar ve Referanslar

Linux'ta FPS Nasıl Arttırılır?
FPS'nin kısaltması Saniyedeki Kare Sayısı. FPS'nin görevi, video oynatma veya oyun performanslarındaki kare hızını ölçmektir. Basit bir deyişle, her s...
En İyi Oculus Uygulama Laboratuvarı Oyunları
Oculus başlık sahibiyseniz, yandan yükleme hakkında bilgi sahibi olmalısınız. Sideloading, kulaklığınıza mağaza dışı içerik yükleme işlemidir. SideQue...
Ubuntu'da Oynanacak En İyi 10 Oyun
Windows platformu, günümüzde doğal olarak Windows'u desteklemek için geliştirilen oyunların büyük bir yüzdesi nedeniyle oyun oynamak için hakim platfo...