it-swarm.dev

Bagaimana inti, proses, dan utas SMP bekerja sama persis?

Pada CPU single core, setiap proses berjalan di OS, dan CPU melompat dari satu proses ke proses lainnya untuk memanfaatkannya sendiri. Suatu proses dapat memiliki banyak utas, dalam hal ini CPU berjalan melalui utas-utas ini saat dijalankan pada proses yang terkait.

Sekarang, pada CPU multi-inti:

  • Apakah inti berjalan dalam setiap proses bersama, atau dapatkah inti berjalan secara terpisah dalam proses yang berbeda pada satu titik waktu tertentu? Misalnya, Anda memiliki program A menjalankan dua utas. Bisakah CPU dual core menjalankan kedua utas program ini? Saya pikir jawabannya harus ya jika kita menggunakan sesuatu seperti OpenMP . Tetapi ketika core sedang berjalan dalam proses yang disematkan OpenMP ini, dapatkah salah satu core beralih ke proses lain?

  • Untuk program yang dibuat untuk single core, saat berjalan pada 100%, mengapa utilisasi CPU dari masing-masing core didistribusikan? (mis. CPU dual core 80% dan 20%. Persentase pemanfaatan semua inti selalu bertambah hingga 100% untuk kasus ini.) Apakah core mencoba saling membantu dengan menjalankan setiap utas, dari setiap proses, dalam beberapa cara ?

50
Karl

Cores (atau CPU) adalah elemen fisik dari komputer Anda yang mengeksekusi kode. Biasanya, setiap inti memiliki semua elemen yang diperlukan untuk melakukan perhitungan, mendaftarkan file, mengganggu jalur dll.

Sebagian besar sistem operasi mewakili aplikasi sebagai proses . Ini berarti bahwa aplikasi memiliki ruang alamatnya sendiri (== tampilan memori), di mana OS memastikan bahwa tampilan ini dan kontennya diisolasi dari aplikasi lain.

Suatu proses terdiri dari satu atau lebih threads , yang melakukan pekerjaan nyata aplikasi dengan mengeksekusi kode mesin pada CPU. Sistem operasi menentukan, thread mana yang dijalankan pada CPU mana (dengan menggunakan heuristik pintar untuk meningkatkan keseimbangan beban, konsumsi energi, dll.). Jika aplikasi Anda hanya terdiri dari satu utas, maka seluruh sistem multi-CPU Anda tidak akan banyak membantu karena masih hanya menggunakan satu CPU untuk aplikasi Anda. (Namun, kinerja keseluruhan mungkin masih membaik karena OS akan menjalankan aplikasi lain pada CPU lain sehingga mereka tidak berbaur dengan yang pertama).

Sekarang untuk pertanyaan spesifik Anda:

1) OS biasanya memungkinkan Anda untuk setidaknya memberikan petunjuk tentang inti mana yang ingin Anda jalankan utasnya. Apa yang dilakukan OpenMP adalah menghasilkan kode yang menghasilkan sejumlah utas untuk mendistribusikan pekerjaan komputasi bersama dari loop program Anda dalam banyak utas. Ia dapat menggunakan mekanisme petunjuk OS (lihat: afinitas utas) untuk melakukannya. Namun, aplikasi OpenMP masih akan berjalan secara bersamaan dengan yang lain dan dengan demikian OS bebas untuk mengganggu salah satu utas dan menjadwalkan lainnya (berpotensi tidak terkait) ) bekerja pada CPU. Pada kenyataannya, ada banyak skema penjadwalan yang mungkin ingin Anda terapkan tergantung pada situasi Anda, tetapi ini sangat spesifik dan sebagian besar waktu Anda harus dapat mempercayai OS Anda melakukan hal tersebut. hal yang tepat untukmu.

2) Bahkan jika Anda menjalankan aplikasi single-threaded pada CPU multi-core, Anda melihat CPU lain juga bekerja. Ini datang a) dari OS yang melakukan tugasnya sementara itu dan b) dari kenyataan bahwa aplikasi Anda tidak pernah berjalan sendiri - setiap sistem yang berjalan terdiri dari sejumlah besar tugas yang bersamaan. Periksa pengelola tugas Windows (atau ps/top di Linux) untuk memeriksa apa yang sedang berjalan.

47
BjoernD

Perhatikan juga bahwa OS tidak terlalu peduli dari mana asal utasnya. Biasanya akan menjadwalkan utas ke prosesor/inti terlepas dari proses dari mana utas berasal. Ini dapat menyebabkan empat utas dari satu proses yang berjalan pada saat yang sama, semudah satu utas dari empat proses yang berjalan pada saat yang sama.

10
John Saunders

@ Nelson, Anda menyebutkan itu ..

.. Jika aplikasi Anda hanya terdiri dari satu utas, maka seluruh sistem multi-CPU Anda tidak akan banyak membantu karena masih hanya menggunakan Satu CPU untuk aplikasi Anda ...

Saya pikir bahkan jika ini adalah aplikasi berulir tunggal, aplikasi tersebut dapat dieksekusi pada core yang berbeda selama masa pakainya. Pada setiap preemption dan penugasan selanjutnya ke CPU, core yang berbeda mungkin ditugaskan untuk utas itu.

9
NitinS

Ya, utas dan proses dapat berjalan secara bersamaan pada multi-core CPU, jadi ini berfungsi seperti yang Anda jelaskan (terlepas dari bagaimana Anda membuat utas dan proses tersebut, OpenMP atau yang lainnya). Satu proses atau utas hanya berjalan pada satu inti pada satu waktu. Jika ada lebih banyak utas yang meminta waktu CPU dari inti yang tersedia (umumnya kasing), penjadwal sistem operasi akan memindahkan dan mematikan utas sesuai kebutuhan.

Alasan mengapa proses single-threaded berjalan pada lebih dari satu CPU atau inti terkait dengan sistem operasi Anda, dan tidak secara khusus fitur perangkat keras. Beberapa sistem operasi tidak memiliki arti "afinitas thread" - mereka tidak peduli prosesor apa yang menjalankan thread - jadi ketika tiba saatnya untuk mengevaluasi kembali sumber daya apa yang sedang digunakan (beberapa kali satu detik, setidaknya), mereka akan memindahkan utas/proses dari satu inti/CPU ke yang lain. Selain menyebabkan cache gagal, ini umumnya tidak memengaruhi kinerja proses Anda.

5
Nick Bastin

Jika ada satu aplikasi utas yang mengatakan 10 utas, pada awalnya ia akan mulai pada CPU/inti yang sama. Selama periode waktu beberapa utas akan didistribusikan ke inti/CPU lain karena penyeimbang beban di Linux. Jika ada beberapa aplikasi utas seperti itu di sana, saya pikir semua utas aplikasi sebagian besar berjalan pada core/cpu yang sama dengan penduduk lokal/global dari utas tersebut sudah tersedia dalam l1/l2 cache inti di mana mereka berjalan. mereka keluar dari inti lebih memakan waktu daripada waktu eksekusi mereka. Jika utas perlu dijalankan dalam inti yang berbeda. Saya pikir kita harus menyediakan info afinitas ke utas.

0
Vasudeva Reddy