berapa core yang harus saya gunakan untuk perhitungan? #cores atau #cores -1?

12

Saya memiliki perhitungan besar untuk dilakukan. Meskipun saya dapat menggunakan semua core, saya pikir apakah ada alasan untuk meninggalkan 1 core dan tidak menggunakannya? (perhitungan cpu saja tidak ada IO). Atau apakah saya meremehkan OS yang tidak akan diketahui untuk ditangani dan melakukan pengalihan konteks yang tepat bahkan jika saya menggunakan semua core?

Jas
sumber
8
Memanfaatkan semua core adalah awal yang baik, dan beberapa takhayul tentang OS berperilaku lebih baik dengan "-1 core" mungkin hanya - takhayul, tetapi Anda harus benar-benar profil itu, bagaimana berperilaku untuk perhitungan Anda, perangkat keras Anda, sistem operasi Anda.
Doc Brown
Dalam banyak kasus, menggunakan # core + 1 sangat masuk akal. Jika Anda hanya menggunakan #cores, maka setiap pemblokiran yang tidak terduga (seperti kesalahan halaman) tidak perlu memaksa sebuah inti untuk diam.
David Schwartz

Jawaban:

28

Sistem operasi utama cukup matang untuk mengetahui bagaimana menangani proses yang menggunakan setiap inti yang tersedia. Proses lain mungkin (dan sering akan) terpengaruh, tetapi perhitungannya tidak akan menjadi lebih lambat karena Anda menggunakan setiap inti yang tersedia.

Pilihan jumlah inti lebih tergantung pada niat Anda melakukan sesuatu yang lain saat perhitungan sedang dilakukan.

Jika, pada mesin desktop, Anda ingin dapat menggunakan browser web Anda atau menonton video saat perhitungan sedang dilakukan, Anda akan lebih baik membiarkan satu inti gratis untuk itu. Dengan cara yang sama, jika server melakukan dua hal (seperti melakukan perhitungan dan, pada saat yang sama, memproses dan melaporkan metriknya), menjaga inti bebas untuk tugas sampingan bisa menjadi ide yang bagus.

Di sisi lain, jika prioritas Anda adalah membuat perhitungan secepat mungkin, Anda harus menggunakan semua core.

Arseni Mourzenko
sumber
7
Penjadwal OS modern sebenarnya cukup bagus untuk menjaga program-program interaktif tetap interaktif ketika ada penggunaan CPU yang tinggi, selama program-program interaktif itu juga tidak menggunakan banyak CPU (yang, tentu saja, bisa menjadi masalah dengan aplikasi web gembung modern)
James_pic
Catatan: bahkan di server, jika Anda ingin dapat ssh dan mendapatkan jawaban cepat, meninggalkan inti 0 saja mungkin berguna.
Matthieu M.
11

Tergantung.

Jika mesin ini didedikasikan untuk perhitungan ini, Anda harus menggunakan semua core - sumber daya komputasi yang tidak digunakan tidak mempercepat .

Jika Anda menggunakan penjadwal waktu nyata, penjadwal non-preemptive, atau afinitas prosesor maka Anda harus sedikit lebih berhati-hati karena mudah untuk secara tidak sengaja kelaparan proses lain dari semua sumber daya komputasi. Namun Anda harus mengubah pengaturan ini secara manual agar ada masalah, jadi secara default tidak ada masalah di sebagian besar OS.

Jika mesin tidak didedikasikan untuk perhitungan, memberikan 100% untuk perhitungan mungkin tidak ideal. Misalnya, jika Anda menggunakan browser web saat perhitungan sedang berjalan. Karena beban mesin Anda kadang-kadang akan memuncak di atas 100%, itu akan terasa lamban. Tugas berorientasi throughput seperti perhitungan tidak akan benar-benar diperlambat, tetapi tugas yang sensitif terhadap latensi seperti GUI tidak akan bereaksi dengan cepat. Maka masuk akal untuk hanya memulai NPROC-1 utas / proses untuk perhitungan. Atau, secara eksplisit menggunakan prioritas yang lebih rendah untuk perhitungan daripada tugas normal dapat menyelesaikan masalah ini, dalam hal ini perhitungan harus menggunakan proses NPROC untuk tidak menyia-nyiakan sumber daya apa pun.

amon
sumber
3
"Jika Anda menggunakan peramban web saat perhitungan sedang berjalan [...] itu akan terasa lamban. Tugas yang berorientasi pada proses seperti perhitungan tidak akan benar-benar diperlambat, tetapi tugas yang sensitif terhadap latensi seperti GUI tidak akan bereaksi dengan cepat. [ ...] secara eksplisit menggunakan prioritas yang lebih rendah untuk perhitungan daripada tugas normal dapat menyelesaikan masalah ini "- Dan itulah mengapa nilai prioritas proses pada Unix disebut" kebaikan "dan dikonfigurasi menggunakan utilitas bernama nice.
Jörg W Mittag
2
"sumber daya komputasi yang tidak digunakan tidak mempercepat" secara teknis, mereka bisa. Menggunakan lebih sedikit core memungkinkan laju clock yang lebih tinggi, dan mengurangi sinkronisasi, yang mungkin atau mungkin tidak mempercepat.
Davidmh
2
Selain catatan @vidah biasanya pada sisi CPU L1 $ dan L2 $ dibagi sampai batas tertentu antara utas dan L3 $ dibagi di semua soket sehingga menggunakan lebih banyak utas dapat menyebabkan peningkatan $ kehilangan proses perlambatan. Apalagi jika prosesnya adalah memori yang terikat bukannya prosesor.
Maciej Piechotka
JIKA Anda mengatur utas / tingkat prioritas proses dengan tepat, Anda dapat mengurangi dampak pekerjaan latar belakang pada proses interaktif. Saya telah menjalankan aplikasi komputasi terdistribusi di mesin pribadi saya selama lebih dari satu dekade; dan dengan tugas komputasi CPU yang berjalan pada prioritas rendah, kemampuan saya untuk menggunakan browser dan aplikasi desktop normal lainnya tidak terganggu. Berbagi sumber daya pada GPU tidak semaju ini, dan saya sering mengalami masalah dengan GPU yang mempercepat video HTML5 (apalagi permainan) saat menjalankan GPU menghitung di latar belakang. Game multi-utas bisa bermasalah bahkan dengan GFX ringan; win starves threads 2+
Dan is Fiddling oleh Firelight
1

Saya agak berhati-hati tentang setuju dengan @motoDrizzt, di bawah ini, karena suara negatifnya :), tapi itu memang pengalaman saya yang sebenarnya - lebih banyak lebih baik, bahkan di luar jumlah sebenarnya dari inti (tetapi tidak ribuan). Sebagai contoh, lihat http://www.forkosh.com/images/avoronoi.gif di mana setiap bidang 2D dari 3D-voronoi_diagram dapat dihasilkan secara independen. Dan program ini mengambil atribut nfork = n query_string untuk memotong perhitungan untuk n pesawat "secara bersamaan".

Dengan prosesor empat-inti, waktu (pengguna) untuk menyelesaikan diagram berkurang cukup banyak dengan nfork, hingga sekitar nfork = 8 (empat core ber-hiphread). Namun melampaui 8, waktu masih menurun, meski lebih lambat. Dan di luar sekitar 16, atau lebih, tidak ada peningkatan yang terlihat. Saya belum menganalisis perilaku ini sama sekali, tetapi secara naif menghubungkannya dengan os (linux slackware 14.2x64 dalam kasus ini) proses juggling untuk lebih mengurangi waktu idle secara keseluruhan.

John Forkosh
sumber
0

Pilihan terbaik adalah ketergantungan sistem. Jadi yang ingin Anda lakukan adalah menjalankan kedua versi pada sistem nyata, dan kemudian memeriksa bagaimana sistem merespons. Masih bisakah Anda menggunakan browser, editor teks, hal-hal lain di sistem Anda? Dan apakah kinerja lebih baik saat menggunakan n utas dan bukan n-1? Apa yang terjadi jika Anda menjalankan aplikasi bersama dengan aplikasi lain yang mencoba menggunakan semua CPU?

Dan kemudian Anda perlu mempertimbangkan hyperthreading. Dengan empat core plus hyperthreading, Anda bisa menggunakan 8 core, atau 7 core. Sekali lagi, cobalah responsif sistem dan waktu untuk menyelesaikannya.

Dan akhirnya, pertimbangkan untuk membagi pekerjaan Anda menjadi lebih banyak blok daripada utas. Alasannya adalah bahwa utas yang berbeda akan menyelesaikan pekerjaan pada waktu yang berbeda, dan kemudian Anda ingin pekerjaan yang tersisa diserahkan ke utas yang lebih cepat. Kalau tidak, Anda harus menunggu sampai utas terakhir selesai.

PS. "Hyperthreading tidak dapat membantu dengan kode intensif FPU karena hanya ada satu FPU". Sangat salah. Sangat sulit, bahkan dengan kode intensif FPU, untuk memanfaatkan FPU sepenuhnya karena latensi. Hyperthreading membantu karena ada dua kali lebih banyak operasi independen yang tersedia untuk penjadwalan.

gnasher729
sumber
-4

Saya tidak tahu bagaimana menulis ini dengan cara yang tidak terdengar "buruk", jadi anggap saja itu sebagai ucapan bersahabat, ok?

Mengingat bahwa rata-rata PC biasanya memiliki ribuan atau lebih utas, apa yang membuat Anda berpikir bahwa menggunakan 8 vs 7 akan membuat perbedaan? :-)

Gunakan sebanyak mungkin utas. Dan jika Anda tidak perlu peduli dengan respons OS, dan utas Anda berjalan cukup lama (lebih dari satu detik), Anda bahkan dapat bereksperimen dalam menggunakan dua kali jumlah inti.

motoDrizzt
sumber
3
Tetapi sebagian besar dari ribuan utas ini tidak menggunakan CPU 100%, bukan?
Andreas Rejbrand
1
Menggunakan dua kali jumlah core umumnya tidak meningkatkan waktu komputasi. Bahkan, menggunakan lebih dari jumlah core fisik umumnya tidak menguntungkan, bahkan jika Anda memiliki core yang lebih logis (melalui HyperThreading dll; walaupun ini mungkin tergantung pada tugas yang tepat yang Anda lakukan). Sumber: pengalaman dari masa lalu, menggunakan MATLAB Parallel Processing.
Sanchises
1
@Sanchises Ini karena hyperthreading memanfaatkan kuasi-paralel instruksi interleaving - ini efektif untuk kode cabang dan memori yang berat. Perhitungan matriks sangat intens untuk FPU dan hanya ada satu FPU untuk setiap inti fisik sehingga hipertensi tidak dapat membantu Anda.
J ...