Berapa banyak thread yang digunakan?


11

Ketika saya (kembali) membangun sistem besar pada komputer desktop / laptop, saya meminta makeuntuk menggunakan lebih dari satu utas untuk mempercepat kecepatan kompilasi, seperti ini:

$ make -j$[ $K * $C ]

Dimana $Cseharusnya menunjukkan jumlah core (yang dapat kita asumsikan menjadi nomor dengan satu digit) mesin memiliki, sementara $Kadalah sesuatu yang saya bervariasi dari 2ke 4, tergantung pada suasana hati saya.

Jadi, misalnya, saya dapat mengatakan make -j12jika saya memiliki 4 core, yang menunjukkan makeuntuk menggunakan hingga 12 utas.


Alasan saya adalah, bahwa jika saya hanya menggunakan $Cutas, inti akan menganggur saat proses sibuk mengambil data dari drive. Tetapi jika saya tidak membatasi jumlah utas (yaitu make -j) saya berisiko membuang-buang waktu untuk mengubah konteks, kehabisan memori, atau lebih buruk . Mari kita asumsikan mesin memiliki $Mgigs of memory (di mana $Mberada di urutan 10).

Jadi saya bertanya-tanya apakah ada strategi yang ditetapkan untuk memilih jumlah utas yang paling efisien untuk dijalankan.


Dalam banyak kasus, jawaban yang benar untuk jumlah utas adalah jumlah inti. Tetapi satu-satunya cara untuk mengetahui dengan pasti adalah melakukan beberapa tes, memvariasikan jumlah utas hingga Anda menemukan sweet spot.
Robert Harvey

@ RobertTarvey: Ya, saya mungkin akan pergi dan memiliki kompilasi skrip shell dengan segala macam pengaturan semalam, tapi saya pikir saya akan bertanya apakah ada pengetahuan tentang ini di luar sana.
bitmask

4
banyak orang juga menyarankan $ core +1, jadi 1 proses kompiler membaca dari disk sementara 4 mengkompilasi. Saran umum sulit, juga tergantung pada basis kode (penggunaan C ++ berlebihan dibandingkan unit kompilasi kecil dengan beberapa fungsi C), rantai kompiler (header yang dikompilasi dll?) Dan struktur bangunan (apakah hanya menghubungkan satu hal besar dalam akhiri atau beberapa hal kecil di antaranya)
johannes

1
Jika Anda serius mencari kinerja, saya sarankan mencari pengaturan RAM disk atau metode lain untuk meringankan I / O Anda. Saya tidak berpikir pemanfaatan CPU adalah hot spot Anda.
TMN

@ TMN: Bagaimana bantuan disk RAM? Linux cukup bagus di caching hal-hal (Anda lakukan berarti file header, kan?), Belum lagi cache drive. Saya harus memuat semuanya ke shm terlebih dahulu, baik secara manual atau dengan mengubah skrip build (yang akan sangat berlebihan).
bitmask

Jawaban:


15

Saya menjalankan serangkaian tes, membangun llvm (dalam mode Debug + Asserts) pada mesin dengan dua core dan 8 GB RAM:

mengkompilasi waktu llvm tergantung pada jumlah pekerjaan

Anehnya, tampaknya naik hingga 10 dan kemudian tiba-tiba turun di bawah waktu yang dibutuhkan untuk membangun dengan dua pekerjaan (satu pekerjaan membutuhkan waktu ganda, tidak termasuk dalam grafik).

Minimal tampaknya 7*$coresdalam hal ini.


1
+1 untuk pengujian aktual dan tidak berspekulasi.
Martin Wickman

3

Saya menjalankan Gentoo Linux (distribusi berbasis sumber) dan dari pengalaman saya, saya dapat mengatakan bahwa (dengan lebih banyak atau lebih sedikit perangkat keras terbaru) n*2 + xadalah nilai terbaik. Biarkan saya jelaskan ini:

  • n*2: Bahkan CPU yang lebih lambat memiliki daya yang cukup untuk menjalankan 2 tugas sekaligus. sebagian besar tugas kompilasi diselesaikan dengan sangat cepat.
  • +xangka ini tergantung pada sistem Anda (terutama memori dan disk). Jika Anda memiliki cukup RAM dan disk cepat, atur x=n. Namun, ini tergantung pada kode sumber (Open Office, saya melihat Anda!) Dan bahasa yang digunakan (kompilasi C / C ++ sangat intensif memori).

Namun, Anda harus menjalankan beberapa tes dengan beberapa -jnilai untuk mendapatkan angka terbaik. Selain itu, cobalah untuk memparalelkan langkah-langkah lain dari proses build: membongkar, menjalankan, configuredan sebagainya.


Saya sebagian besar khawatir dengan C ++ saat ini, dan disk saya bukan yang tercepat, saya kira.
bitmask

Kemudian mulailah dengan n * 1.5 dan tingkatkan sampai waktu kompilasi berhenti menurun (pastikan Anda membersihkan cache disk / kompilasi cache setiap waktu). Juga, pikirkan menggunakan ccache ( ccache.samba.org ) untuk mempercepat kompilasi.
ercpe
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.