Tampaknya ada beberapa kontroversi mengenai apakah jumlah pekerjaan di GNU make seharusnya sama dengan jumlah inti, atau jika Anda dapat mengoptimalkan waktu pembuatan dengan menambahkan satu pekerjaan tambahan yang dapat diantrekan sementara yang lain "bekerja" .
Apakah lebih baik menggunakan -j4
atau -j5
pada sistem quad core?
Pernahkah Anda melihat (atau melakukan) pembandingan yang mendukung satu atau lainnya?
make `nproc`
untuk membuat skrip independen CPU :)Jawaban:
Saya akan mengatakan hal terbaik untuk dilakukan adalah mengukurnya sendiri pada lingkungan dan beban kerja tertentu Anda. Sepertinya ada terlalu banyak variabel (ukuran / jumlah file sumber, memori yang tersedia, cache disk, apakah direktori sumber & header sistem Anda terletak di disk yang berbeda, dll.) Untuk jawaban satu ukuran untuk semua.
Pengalaman pribadi saya (pada MacBook Pro 2-core) adalah -j2 secara signifikan lebih cepat daripada -j1, tetapi lebih dari itu (-j3, -j4 dll.) Tidak ada peningkatan kecepatan yang dapat diukur. Jadi untuk lingkungan saya "pekerjaan == jumlah inti" sepertinya merupakan jawaban yang bagus. (YMMV)
sumber
Saya telah menjalankan proyek rumah saya pada 4-core saya dengan laptop hyperthreading dan mencatat hasilnya. Ini adalah proyek yang cukup berat untuk kompiler tetapi mencakup pengujian unit 17,7 detik di akhir. Kompilasi tidak terlalu intensif IO; ada sangat banyak memori yang tersedia dan jika tidak, sisanya ada pada SSD yang cepat.
Hasil dasar:
Tebakan saya sekarang: Jika Anda melakukan sesuatu yang lain di komputer Anda, gunakan jumlah inti. Jika tidak, gunakan thread count. Melebihi itu tidak menunjukkan manfaat. Pada titik tertentu mereka akan menjadi memori terbatas dan runtuh karena itu, membuat kompilasi jauh lebih lambat. Baris "inf" ditambahkan di kemudian hari, memberi saya kecurigaan bahwa ada pembatasan termal untuk 8+ pekerjaan. Hal ini menunjukkan bahwa untuk ukuran proyek ini tidak ada batasan memori atau throughput yang berlaku. Ini adalah proyek kecil, diberi memori 8GB untuk dikompilasi.
sumber
Saya, secara pribadi, menggunakan
make -j n
mana n adalah "jumlah inti" + 1.Namun, saya tidak dapat memberikan penjelasan ilmiah: Saya telah melihat banyak orang menggunakan pengaturan yang sama dan mereka memberi saya hasil yang cukup bagus sejauh ini.
Bagaimanapun, Anda harus berhati-hati karena beberapa rantai merek tidak kompatibel dengan
--jobs
opsi tersebut, dan dapat menyebabkan hasil yang tidak terduga. Jika Anda mengalami kesalahan ketergantungan yang aneh, coba sajamake
tanpa--jobs
.sumber
Pada akhirnya, Anda harus melakukan beberapa tolok ukur untuk menentukan angka terbaik yang akan digunakan untuk build Anda, tetapi ingat bahwa CPU bukanlah satu-satunya resource yang penting!
Jika Anda memiliki build yang sangat bergantung pada disk, misalnya, melakukan banyak pekerjaan di sistem multicore mungkin sebenarnya lebih lambat , karena disk harus melakukan pekerjaan ekstra untuk menggerakkan kepala disk maju mundur untuk melayani semua pekerjaan yang berbeda (tergantung pada banyak faktor, seperti seberapa baik OS menangani disk-cache, dukungan antrian perintah asli oleh disk, dll.).
Dan kemudian Anda memiliki inti "nyata" versus hyper-threading. Anda mungkin mendapat atau tidak mendapatkan keuntungan dari pekerjaan pemijahan untuk setiap hyper-thread. Sekali lagi, Anda harus melakukan benchmark untuk mengetahuinya.
Saya tidak bisa mengatakan saya secara khusus mencoba #cores + 1 , tetapi pada sistem kami (Intel i7 940, 4 core hyperthreaded, banyak RAM, dan drive VelociRaptor) dan build kami (build C ++ skala besar yang bergantian CPU dan saya / O terikat) ada sedikit perbedaan antara -j4 dan -j8. (Mungkin 15% lebih baik ... tapi tidak ada yang dua kali lebih baik.)
Jika saya pergi untuk makan siang, saya akan menggunakan -j8, tetapi jika saya ingin menggunakan sistem saya untuk hal lain saat sedang membangun, saya akan menggunakan angka yang lebih rendah. :)
sumber
-j 8
Saya baru saja mendapatkan prosesor Athlon II X2 Regor dengan Foxconn M / B dan memori G-Skill 4 GB.
Saya meletakkan 'cat / proc / cpuinfo' dan 'free' saya di akhir ini sehingga orang lain dapat melihat spesifikasi saya. Ini adalah inti ganda Athlon II x2 dengan RAM 4GB.
Saya mengunduh sumber kernel langkah berikutnya (linux-3.2.46) ke / archive4;
mengekstraknya (
tar -xjvf linux-3.2.46.tar.bz2
);cd ke direktori (
cd linux-3.2.46
);dan menyalin konfigurasi kernel default di atas (
cp /usr/src/linux/.config .
);bekas
make oldconfig
untuk menyiapkan konfigurasi kernel 3.2.46;lalu lari make dengan berbagai mantra -jX.
Saya menguji pengaturan waktu setiap proses dengan mengeluarkan make setelah perintah waktu, misalnya, 'time make -j2'. Di antara setiap proses, saya 'rm -rf' pohon linux-3.2.46 dan mengekstraknya kembali, menyalin /usr/src/linux/.config default ke direktori, menjalankan make oldconfig dan kemudian melakukan tes 'make -jX' lagi .
biasa "membuat":
seperti di atas tetapi dengan make -j2
seperti di atas tetapi dengan make -j3
seperti di atas tetapi dengan make -j4
seperti di atas tetapi dengan make -j8
'cat / proc / cpuinfo' menghasilkan:
hasil 'gratis':
sumber
make -j
dilakukan pada sistem itu? Make seharusnya memeriksa beban dan menskalakan jumlah proses berdasarkan beban.make -j
tidak membatasi jumlah pekerjaan sama sekali. Hal ini biasanya menjadi bencana pada proyek berukuran sedang atau besar karena lebih banyak pekerjaan yang di-fork daripada yang dapat didukung oleh RAM. Opsi yang perlu Anda batasi menurut beban adalah-l [load]
, sehubungan dengan-j
Keduanya tidak salah. Untuk berdamai dengan diri Anda sendiri dan dengan pembuat perangkat lunak yang Anda kompilasi (batasan multi-utas / utas tunggal yang berbeda berlaku pada tingkat perangkat lunak itu sendiri), saya sarankan Anda menggunakan:
Catatan:
nproc
adalah perintah linux yang akan mengembalikan jumlah inti / utas (CPU modern) yang tersedia di sistem. Menempatkannya di bawah tanda centang `seperti di atas akan meneruskan nomor tersebut ke perintah make.Info tambahan: Seperti yang disebutkan seseorang, menggunakan semua inti / utas untuk mengompilasi perangkat lunak dapat benar-benar mencekik kotak Anda sampai hampir mati (tidak responsif) dan bahkan mungkin membutuhkan waktu lebih lama daripada menggunakan lebih sedikit inti. Seperti yang saya lihat salah satu pengguna Slackware di sini memposting dia memiliki CPU inti ganda tetapi masih memberikan pengujian hingga j 8, yang berhenti berbeda pada j 2 (hanya 2 inti perangkat keras yang dapat digunakan CPU). Jadi, untuk menghindari kotak yang tidak responsif saya sarankan Anda menjalankannya seperti ini:
Ini akan meneruskan output
nproc
kemake
dan mengurangi 2 core dari hasilnya.sumber
Seperti seorang ref:
Dari
Spawning Multiple Build Jobs
bagian di LKD :sumber
Dari pengalaman saya, pasti ada beberapa keuntungan kinerja saat menambah pekerjaan ekstra. Ini hanya karena disk I / O adalah salah satu leher botol selain CPU. Namun tidak mudah untuk menentukan jumlah pekerjaan tambahan karena sangat terkait dengan jumlah inti dan jenis disk yang digunakan.
sumber
Bertahun-tahun kemudian, sebagian besar jawaban ini masih benar. Namun, ada sedikit perubahan: Menggunakan lebih banyak pekerjaan daripada yang Anda miliki inti fisik sekarang memberikan percepatan yang benar-benar signifikan. Sebagai tambahan untuk tabel Dascandy, inilah waktu saya untuk menyusun proyek pada AMD Ryzen 5 3600X di linux. (Mainan Serbuk, lakukan c6f653ac3cef03acfbc44e8f29f11e1b301f1ca2)
Saya sarankan untuk memeriksa diri Anda sendiri, tetapi saya telah menemukan dengan masukan dari orang lain bahwa menggunakan jumlah inti logis Anda untuk jumlah pekerjaan berfungsi dengan baik di Zen. Bersamaan dengan itu, sistem tampaknya tidak kehilangan daya tanggap. Saya membayangkan ini berlaku untuk CPU Intel terbaru juga. Perhatikan bahwa saya juga memiliki SSD, jadi mungkin ada baiknya untuk menguji CPU Anda sendiri.
Pengujian dilakukan pada Ubuntu 19.10 w / a Ryzen 5 3600X, Samsung 860 Evo SSD (SATA), dan RAM 32GB
Catatan terakhir: Orang lain dengan 3600X mungkin mendapatkan waktu yang lebih baik daripada saya. Saat melakukan tes ini, saya mengaktifkan mode Eco, mengurangi kecepatan CPU sedikit.
sumber
IYA! Pada 3950x saya, saya menjalankan -j32 dan menghemat waktu kompilasi berjam-jam! Saya masih bisa menonton youtube, menjelajahi web, dll selama kompilasi tanpa ada perbedaan. Prosesornya tidak selalu dipatok bahkan dengan nvme 1TB 970 PRO atau 1TB Auros Gen4 nvme dan 64GB 3200C14. Meskipun demikian, saya tidak memperhatikan UI yang bijaksana. Saya berencana untuk menguji dengan -j48 dalam waktu dekat pada beberapa proyek besar yang akan datang. Saya berharap, seperti yang mungkin Anda lakukan, melihat beberapa peningkatan yang mengesankan. Mereka yang masih dengan quad-core mungkin tidak mendapatkan keuntungan yang sama ....
Linus sendiri baru saja meningkatkan ke 3970x dan Anda bisa bertaruh dolar terbawah Anda, setidaknya dia menjalankan -j64.
sumber