GNU Membuat

Kompilasi Kode Secara Paralel menggunakan Make

Kompilasi Kode Secara Paralel menggunakan Make

Siapa pun yang Anda tanyakan bagaimana membangun perangkat lunak dengan benar akan muncul dengan Make sebagai salah satu jawabannya. Pada sistem GNU/Linux, GNU Make [1] adalah versi Open-Source dari Make asli yang dirilis lebih dari 40 tahun yang lalu - pada tahun 1976. Buat karya dengan Makefile - file teks biasa terstruktur dengan nama itu yang paling tepat digambarkan sebagai manual konstruksi untuk proses pembuatan perangkat lunak. Makefile berisi sejumlah label (disebut target) dan instruksi spesifik yang diperlukan untuk dieksekusi untuk membangun setiap target.

Sederhananya, Make adalah alat pembuatan. Ini mengikuti resep tugas dari Makefile. Ini memungkinkan Anda untuk mengulangi langkah-langkah secara otomatis daripada mengetiknya di terminal (dan mungkin membuat kesalahan saat mengetik).

Daftar 1 menunjukkan contoh Makefile dengan dua target "e1" dan "e2" serta dua target khusus "semua" dan "bersih.” Menjalankan “make e1” menjalankan instruksi untuk target “e1” dan membuat file kosong satu. Menjalankan "make e2" melakukan hal yang sama untuk target "e2" dan membuat file kosong dua. Panggilan "make all" mengeksekusi instruksi untuk target e1 terlebih dahulu dan e2 berikutnya. Untuk menghapus file yang dibuat sebelumnya satu dan dua, cukup jalankan panggilan "make clean".”

Daftar 1

semua: e1 e2
e1:
sentuh satu
e2:
sentuh dua
bersih:
rm satu dua

Menjalankan Make

Kasus umum adalah Anda menulis Makefile Anda dan kemudian jalankan perintah "make" atau "make all" untuk membangun perangkat lunak dan komponennya. Semua target dibangun dalam urutan serial dan tanpa paralelisasi apa pun. Total waktu pembuatan adalah jumlah waktu yang diperlukan untuk membangun setiap target.

Pendekatan ini bekerja dengan baik untuk proyek-proyek kecil tetapi memakan waktu agak lama untuk proyek menengah dan besar. Pendekatan ini tidak lagi mutakhir karena sebagian besar CPU saat ini dilengkapi dengan lebih dari satu inti dan memungkinkan eksekusi lebih dari satu proses pada satu waktu. Dengan pemikiran ini, kami melihat apakah dan bagaimana proses pembangunan dapat diparalelkan. Tujuannya hanya untuk mengurangi waktu pembuatan.

Lakukan Perbaikan

Ada beberapa opsi yang kami miliki - 1) menyederhanakan kode, 2) mendistribusikan tugas tunggal ke node komputasi yang berbeda, membuat kode di sana, dan mengumpulkan hasilnya dari sana, 3) membuat kode secara paralel pada satu mesin, dan 4) gabungkan opsi 2 dan 3.

Opsi 1) tidak selalu mudah. Ini membutuhkan kemauan untuk menganalisis runtime dari algoritma yang diimplementasikan dan pengetahuan tentang kompiler, i.e., bagaimana kompiler menerjemahkan instruksi dalam bahasa pemrograman ke dalam instruksi prosesor?.

Opsi 2) memerlukan akses ke node komputasi lain, misalnya, node komputasi khusus, mesin yang tidak digunakan atau kurang digunakan, mesin virtual dari layanan cloud seperti AWS, atau daya komputasi yang disewa dari layanan seperti LoadTeam [5]. Pada kenyataannya, pendekatan ini digunakan untuk membangun paket perangkat lunak. Debian GNU/Linux menggunakan apa yang disebut jaringan Autobuilder [17], dan RedHat/Fedors menggunakan Koji [18]. Google menyebut sistemnya BuildRabbit dan dijelaskan dengan sempurna dalam pembicaraan oleh Aysylu Greenberg [16]. distcc [2] adalah apa yang disebut kompiler C terdistribusi yang memungkinkan Anda untuk mengkompilasi kode pada node yang berbeda secara paralel dan untuk mengatur sistem build Anda sendiri.

Opsi 3 menggunakan paralelisasi di tingkat lokal. Ini mungkin opsi dengan rasio biaya-manfaat terbaik untuk Anda, karena tidak memerlukan perangkat keras tambahan seperti pada opsi 2. Persyaratan untuk menjalankan Make secara paralel adalah menambahkan opsi -j dalam panggilan (kependekan dari -jobs). Ini menentukan jumlah pekerjaan yang dijalankan pada saat yang sama. Daftar di bawah ini meminta Make untuk menjalankan 4 pekerjaan secara paralel:

Daftar 2

$ buat --pekerjaan=4

Menurut hukum Amdahl [23], ini akan mengurangi waktu pembuatan hampir 50%. Perlu diingat bahwa pendekatan ini bekerja dengan baik jika target tunggal tidak bergantung satu sama lain; misalnya, output dari target 5 tidak diperlukan untuk membangun target 3.

Namun, ada satu efek samping: keluaran dari pesan status untuk masing-masing Membuat target tampak arbitrer, dan ini tidak dapat lagi ditetapkan dengan jelas ke target. Urutan keluaran tergantung pada urutan aktual dari pelaksanaan pekerjaan.

Tentukan Buat Perintah Eksekusi

Apakah ada pernyataan yang membantu Make untuk memahami target mana yang bergantung satu sama lain?? Iya! Contoh Makefile di Listing 3 mengatakan ini:

* untuk membangun target "semua", jalankan instruksi untuk e1, e2, dan e3

* target e2 membutuhkan target e3 yang harus dibangun sebelumnya

Artinya target e1 dan e3 dapat dibangun secara paralel, pertama, kemudian e2 segera setelah pembangunan e3 selesai, akhirnya.

Daftar 3

semua: e1 e2 e3
e1:
sentuh satu
e2: e3
sentuh dua
e3:
sentuh tiga
bersih:
rm satu dua tiga

Visualisasikan Ketergantungan Make

Alat pintar make2graph dari proyek makefile2graph [19] memvisualisasikan dependensi Make sebagai grafik asiklik terarah. Ini membantu untuk memahami bagaimana target yang berbeda bergantung satu sama lain. Make2graph menampilkan deskripsi grafik dalam format titik yang dapat Anda ubah menjadi gambar PNG menggunakan perintah titik dari proyek Graphviz [22]. Panggilannya adalah sebagai berikut:

Daftar 4

$ buat semua -Bnd | make2graph | titik -Tpng -o grafik.png

Pertama, Make dipanggil dengan target “semua” diikuti dengan opsi “-B” untuk membangun semua target tanpa syarat, “-n” (kependekan dari “-dry-run”) untuk berpura-pura menjalankan instruksi per target, dan “ -d” (“-debug”) untuk menampilkan informasi debug. Output disalurkan ke make2graph yang menyalurkan outputnya ke titik yang menghasilkan grafik file gambar.png dalam format PNG.


Grafik dependensi build untuk daftar 3

Lebih Banyak Kompiler dan Bangun Sistem

Seperti yang sudah dijelaskan di atas, Make dikembangkan lebih dari empat dekade yang lalu. Selama bertahun-tahun, menjalankan pekerjaan secara paralel menjadi semakin penting, dan jumlah kompiler yang dirancang khusus dan membangun sistem untuk mencapai tingkat paralelisasi yang lebih tinggi telah berkembang sejak saat itu. Daftar alat termasuk ini:

Sebagian besar dari mereka telah dirancang dengan mempertimbangkan paralelisasi dan menawarkan hasil yang lebih baik terkait waktu pembuatan daripada Make.

Kesimpulan

Seperti yang Anda lihat, ada baiknya memikirkan build paralel karena secara signifikan mengurangi waktu build hingga level tertentu certain. Namun, itu tidak mudah untuk dicapai dan datang dengan jebakan tertentu [3]. Disarankan untuk menganalisis kode Anda dan jalur build-nya sebelum melangkah ke build paralel.

Tautan dan Referensi

Ulasan Mouse Nirkabel Microsoft Sculpt Touch
Saya baru-baru ini membaca tentang Microsoft Sculpt Touch mouse nirkabel dan memutuskan untuk membelinya. Setelah menggunakannya untuk sementara waktu...
Trackpad dan Mouse Pointer di Layar AppyMouse untuk Tablet Windows
Pengguna tablet sering melewatkan penunjuk mouse, terutama ketika mereka terbiasa menggunakan laptop. Layar sentuh Smartphone dan tablet hadir dengan ...
Tombol tengah mouse tidak berfungsi di Windows 10
Itu tombol tengah mouse membantu Anda menelusuri halaman web dan layar yang panjang dengan banyak data. Jika itu berhenti, Anda akhirnya akan mengguna...