Saya bertanya-tanya apakah ada cara sederhana untuk "menyalakan" semua 100% CPU sehingga saya dapat menjalankan proses lebih cepat (seperti perhitungan python).
1) Apakah ini mungkin?
2) Apakah ada cara mudah untuk kembali normal?
3) Apakah ada cara untuk menggunakan lebih sedikit CPU jika diinginkan?
Saya sedang memikirkan interaksi baris perintah seperti:
pi@raspberry:~ $ sudo turnOnFourCores python run.py
Jawaban:
Secara default, komputer mana pun akan mencoba menggunakan semua core-nya kapan saja. Namun, itu hanya dapat mencapai ini ketika aplikasi multi-threaded. Jika tidak (yaitu skrip Python yang tidak menggunakan
threading
modul), maka itu hanya dapat digunakan secara maksimal, satu inti. Ini setara dengan 25% CPU pada CPU empat inti. Jika Anda ingin memodifikasi skrip Anda untuk menggunakan banyak core, Anda dapat membagi perhitungan Anda menjadi beberapa bagian, dan membuat multi-utas seperti yang ditunjukkan dalam dokumentasi Python .Memperbarui:
Saat Anon menjawab , ini tidak akan berhasil tanpa bekerja dengan GIL Python (Global Interpreter Lock). Ini memungkinkan tugas untuk beroperasi (tampaknya) pada saat yang sama, tetapi tidak memungkinkan kode untuk dijalankan di beberapa core. Jika Anda menggunakan modul yang ditulis dalam C (mis. Numpy), mereka dapat memungkinkan Anda untuk menggunakan beberapa core berkeliling batasan itu. Selain itu, jika itu bukan opsi, Python menawarkan multiprocessing , yang memungkinkan Anda untuk menjalankan tugas apa pun pada banyak core.
sumber
Tidak dalam arti bahwa saya pikir Anda menyiratkan. Ini bukan masalah khusus untuk pi, juga, itu adalah kendala logis.
Semua komputer sendiri saat ini tidak memiliki banyak kapasitas untuk menentukan bahwa suatu proses yang berjalan sebagai satu utas dapat dijalankan secara paralel. Perhatikan bahwa pada titik ketika mereka mungkin memiliki kapasitas ini, tidak akan ada kebutuhan untuk programmer komputer, karena sistem komputer yang dapat melakukan ini mungkin juga menulis kode sendiri 1 ..
Pertimbangkan ungkapan matematika sederhana berikut:
Ada beberapa potensi untuk dihitung secara paralel, tetapi secara logis terbatas. Saya akan mengatakan tidak ada gunanya lebih dari dua utas, dan bahkan sebagian besar hanya satu:
Utas # 2 berkontribusi dengan menghitung 3 + 6 = 9, digunakan pada langkah C dengan utas # 1, menyimpannya satu langkah. Tapi itu sejauh paralelisme akan berguna sampai di sini. Sementara utas # 2 dapat menghitung 17/9 sementara # 1 melakukan 6 * 17, melakukan itu tidak ada gunanya, karena Anda sekarang memiliki dua jalur berbeda untuk tujuan yang sama yang tidak dapat digabungkan kembali. Yaitu, # 2 bisa tetap bekerja:
Dan berakhir dengan hasil yang sama dengan utas # 1 (11.333), tetapi mereka tidak saling membantu melampaui langkah A, oleh karena itu memiliki dua dari mereka mengejar tujuan ini adalah buang-buang waktu.
(Perhatikan bahwa contoh ini bukan yang literal; ini bermaksud untuk menunjukkan prinsip logis. Skala di mana tugas di-threaded dalam kode pengguna jauh lebih besar, tetapi Anda tidak perlu pelajaran nyata dalam pemrograman multi-threaded untuk pegang idenya di sini.)
Mengeksploitasi banyak prosesor memerlukan kode yang ditulis untuk melakukannya. Anda tidak bisa begitu saja mengambil apa pun dan berkata, "oh gunakan semua 4 core dan lakukan lebih cepat!". Bukan itu yang akan terjadi. Secara logis, banyak (..atau sebagian besar) masalah dan tugas melibatkan langkah-langkah yang tidak dapat terjadi secara paralel, mereka harus terjadi secara berurutan.
1. Tetapi lihat komentar Felix Dombek di bawah ini; Saya bukan ahli AI. Mungkin juga patut dicatat bahwa sesuai komentar Peter Corde, set dan prosesor instruksi kontemporer dapat dieksploitasi oleh OS untuk mengoptimalkan hal-hal berbutir halus secara paralel, dan pipa perangkat keras melakukan ini juga, meskipun tidak lintas core (satu core memiliki lebih dari satu hal yang terjadi, beroperasi pada aliran instruksi di berbagai titik sebelum eksekusi akhir mereka). Saya mencoba untuk tetap berpegang pada topik utas pengguna di sini karena saya pikir itu kurang lebih apa yang Anda peroleh.
sumber
add
instruksi di samping satu sama lain sehingga keduanya dapat berjalan dalam satu sama lain siklus jam. Multiply dan bagi sisanya berikut akan diserialisasi oleh dependensi data, seperti yang Anda tunjukkan.Tidak untuk python.
Orang lain menyarankan Anda untuk melihat threading, yang merupakan jawaban yang valid untuk sebagian besar bahasa, tetapi mereka tidak memperhitungkan bahwa Anda menggunakan python.
Python GIL tidak memungkinkan Anda untuk secara efektif menggunakan banyak inti.
sumber
Menggunakan banyak core membutuhkan secara eksplisit mengekspos paralelisme level-thread ke OS, yang biasanya mengharuskan programmer untuk menulis program multi-threaded. (Atau untuk menjalankan program single-threaded beberapa kali pada input yang berbeda, seperti kompilasi dengan
make -j4
)Kompiler untuk beberapa bahasa mendukung paralelisasi otomatis. Sebagai contoh, C atau C ++ dengan OpenMP dapat mengkompilasi
for()
loop biasa ke dalam program yang memulai banyak utas.Tapi tetap saja, ini harus terjadi ketika Anda menulis atau menyusun program. Tidak ada cara untuk perangkat keras dan OS saat ini untuk menggunakan banyak core untuk mempercepat program single-threaded.
Terkait: Bagaimana cara menjalankan satu utas pada beberapa inti? : jawaban: mereka tidak. Tetapi ada jenis paralelisme lain, seperti paralelisme tingkat Instruksi yang ditemukan dan dieksploitasi oleh inti CPU tunggal untuk menjalankan utas tunggal lebih cepat dari satu instruksi pada satu waktu.
Jawaban saya atas pertanyaan itu masuk ke beberapa perincian tentang bagaimana CPU modern menemukan dan mengeksploitasi paralelisme tingkat instruksi yang berbutir halus. (Sebagian besar berfokus pada x86). Itu hanya bagian dari cara kerja CPU normal, dengan memiliki beberapa instruksi dalam satu penerbangan sekaligus, dan bukan sesuatu yang perlu Anda aktifkan secara khusus. (Ada penghitung kinerja yang dapat memungkinkan Anda melihat berapa banyak instruksi per jam yang berhasil dijalankan CPU Anda saat menjalankan program, atau tindakan lainnya.)
Perhatikan bahwa RPi3 menggunakan inti CPU ARM Cortex-A53 yang dipesan . Setiap inti adalah superscalar 2-lebar (2 instruksi per jam sebagaimana diizinkan ILP), tetapi tidak dapat menyusun ulang instruksi untuk menemukan lebih banyak paralelisme tingkat instruksi dan menyembunyikan latensi.
Namun, CPU masih dalam tahap pipeline, sehingga jumlah total instruksi dalam penerbangan (mulai dari mengambil dan mendekode hingga ke tahap penulisan kembali pada akhir pipa) sangat signifikan. Ketika dependensi data tidak membatasi hal-hal, mungkin ada 2 instruksi di setiap tahap pipa yang sedang dikerjakan CPU, dengan throughput 2 instruksi per jam. (Itulah artinya 2-lebar.)
Itu tidak dapat menjalankan instruksi yang rusak, tetapi dengan pemesanan instruksi yang hati-hati (biasanya oleh kompiler) ia masih dapat menyembunyikan latensi dari suatu instruksi yang membutuhkan banyak siklus agar hasilnya siap. (mis. memuat bahkan jika hit di cache atau multiply akan membutuhkan banyak siklus, vs. penambahan yang siap pada siklus berikutnya). Caranya adalah dengan memesan instruksi asm sehingga ada beberapa instruksi independen antara yang menghasilkan hasil dan yang menggunakannya.
Memiliki perangkat lunak (kompiler) menjadwalkan instruksi secara statis lebih rapuh daripada memiliki perangkat keras yang dapat memesan ulang secara internal sambil mempertahankan ilusi berjalan dalam urutan program. Sangat sulit bagi kompiler untuk melakukan pekerjaan sebaik bahkan jendela kecil yang tidak sesuai pesanan untuk menyusun ulang instruksi karena cache-misses tidak dapat diprediksi, dan sulit untuk menganalisis rantai ketergantungan di seluruh panggilan fungsi pada waktu kompilasi. Dan jumlah register terbatas tanpa penggantian nama perangkat keras.
Semua ini adalah kenyamanan kecil ketika kode Anda berjalan lebih lambat dari yang Anda inginkan. Tentu ada banyak hal keren di bawah tenda di Cortex-A53, tapi ada lebih banyak barang keren di bawah tenda di Cortex-A57 (seperti eksekusi out-of-order hingga 3 instruksi per jam), dan lebih banyak lagi di CPU x86 besar seperti Skylake (belum lagi perbedaan kecepatan clock).
Cortex-A53 cukup fantastis dibandingkan dengan https://en.wikipedia.org/wiki/Classic_RISC_pipeline seperti MIPS asli yang akan Anda pelajari di kelas arsitektur komputer, tetapi menurut standar modern itu cukup rendah.
sumber
java
, tidakmyapp.jar
, dan tentu saja tidak ada utas tunggal.Ini bukan bagaimana CPU bekerja ... sama sekali.
Seperti saat ini berdiri, CPU Anda benar-benar mampu berjalan pada penggunaan 100%, dengan asumsi bahwa itu tidak dicekik karena masalah suhu terkait pada 80 derajat Celcius atau lebih. Yang sedang berkata, Anda tidak (umumnya) ingin melihat CPU Anda dipatok pada 100%. Jika Anda secara rutin menggunakan utilisasi CPU 100%, kemungkinan Anda memiliki terlalu banyak untuk ditangani oleh prosesor Anda. Ini akan menyebabkan gagap dan pengalaman pengguna yang umumnya tidak bahagia.
Untuk membandingkan dengan sesuatu yang lebih fisik, utilisasi CPU Anda sangat mirip mobil. Mobil itu kemungkinan mampu melaju 100 mph, tetapi ada kemungkinan besar speedometer Anda membaca sesuatu secara signifikan di bawahnya. Ketika di kota, Anda mungkin tidak akan pernah bisa mencapai sekitar 25 mph. Namun itu tidak mengubah bahwa mobil dapat melaju 100 mph. Anda belum cukup menekan akselerator dengan cukup keras.
Jika Anda hanya membuat RPi melakukan lebih banyak hal (mendorong lebih banyak pada akselerator), Anda akan melihat angka utilisasi CPU naik. Sebagai contoh, perhatikan pemanfaatan CPU ketika Anda menjalankan perintah
yes
di jendela terminal (Ingat bahwactrl+c
mengakhiri perintah terminal). Ini akan meningkatkan CPU Anda sebesar 25% karena memaksimalkan salah satu dari empat core CPU Anda.sumber
Jawaban lain memang memberikan perincian yang baik, tetapi tampaknya tidak menjawab pertanyaan Anda secara khusus.
NB:
Jika Anda ingin meningkatkan kinerja pi secara keseluruhan, Anda mungkin ingin melihat Overclocking. Ini memungkinkan CPU berjalan pada tingkat yang lebih cepat. Kelemahannya adalah peningkatan produksi panas, masa pakai prosesor yang lebih rendah, dan peningkatan konsumsi daya.
sumber
Jika mungkin saya akan parameterisasi skrip dan jalankan dalam proses Python yang terpisah. Sebagai contoh:
Alternatif lain adalah pustaka multiprosesor yang telah disebutkan, yang memungkinkan Anda melakukan proses fork-and-join python. Tetapi itu juga mengharuskan Anda untuk memiliki daftar parameter (seperti nama file) yang ingin Anda jalankan perhitungannya.
sumber
map
tetapi ternyata ia juga memiliki banyak konstruksi memori bersama yang cukup canggih.Saya pikir OP mungkin tidak sepenuhnya memahami konsep multi-core / multi-thread programming dan betapa sulitnya untuk sepenuhnya memanfaatkan 100% multi-core kecuali jika algoritma dapat dengan mudah dibuat menjadi masalah paralel yang memalukan .
Untuk info lebih lanjut, Anda dapat membaca lebih lanjut tentang judul artikel terkenal "The Free Lunch Is Over" http://www.gotw.ca/publications/concurrency-ddj.htm
sumber
Jika Anda ingin menguji RPI Anda. Anda dapat menjalankan
stress
seperti di sini , lalu Anda dapat melihat bagaimana CPU Anda digunakanhtop
. Ini berguna karena Anda dapat melihat apakah sumber daya Anda cukup, jika tidak cukup RPI Anda akan mencoba menggunakan terlalu banyak arus (arus listrik) dan itu akan mati.Di sisi lain, jika Anda ingin menggunakan skrip python, Anda harus melihat
joblib
mana yang bagus ketika Anda ingin memparalelkan proses, dan dengan demikian Anda akan menggunakan jumlah prosesor yang Anda inginkan.sumber
Walaupun semua jawaban ini benar dengan cara yang berbeda, memang benar bahwa sistem operasi akan secara otomatis menggunakan inti yang berbeda untuk menyebarkan beban. Anda dapat melihat ini dengan program python sederhana (temp.py katakanlah)
buka terminal dari desktop RPi Anda dan ketik
$ top
yang akan menampilkan kerja prosesor. Kemudian buka terminal lain danpython3 temp.py
dan Anda akan melihat pekerjaan python3 naik ke waktu prosesor 100%. Kemudian buka terminal lain dan ulangi prosesnya dan lihat bagaimana Anda naik hingga 400%. Jadi pada satu tingkat seperti yang dikomentari @Shadow, sesederhana itu dan itu adalah default. Namun merancang program yang dapat menggunakan pemrosesan paralel adalah non-sepele seperti yang telah dijelaskan orang lain.sumber
Jawabannya adalah YA tegas! Anda sederhana harus menulis program Anda untuk mengenalinya dan menggunakannya. Program yang melakukan ini dapat menggunakan core. Saya menulis milik saya untuk melakukan ini di Jawa dan dengan demikian saya bisa.
Jawaban di atas dari pengembang Python memiliki konsep yang sangat terbatas dari jawaban ini sehingga bisa sangat membingungkan tetapi jawabannya adalah YA dan hanya YA!
sumber
Karena OP tidak menentukan python dalam pertanyaannya, saya ingin menyarankan dua bahasa modern yang berfungsi dengan baik pada Raspberry Pi dan memiliki cara yang sangat mudah untuk menggunakan konkurensi.
Favorit saya saat ini adalah bahasa Rust. Saya telah menulis dan menyusun program di Pi. Karat bagus karena mencegah banyak jenis bug penunjuk dan kondisi ras, yang membuat penulisan kode bersamaan lebih mudah dan aman. Rust dimaksudkan sebagai bahasa pemrograman sistem, tetapi dapat melakukan hampir semua hal yang dapat dilakukan C.
Bahasa lain seperti itu adalah Go (juga disebut Golang untuk memudahkan pencarian). Go dibuat oleh tim Google, dan merupakan bahasa yang cukup matang. Sangat mudah untuk membuat coroutine di Go, yang mereka sebut "Go rutinitas."
Kedua bahasa ini dapat mengkompilasi kode pada Raspberry Pi, bahkan Pi Zero. Namun, keduanya dapat dikompilasi silang dari komputer yang lebih cepat yang bagus untuk program besar.
sumber