Apakah ada sesuatu yang HARUS dilakukan pada CPU multi-core?

45

Ketika mempertimbangkan bagaimana multi-thread-friendly program kami harus, tim saya bingung tentang apakah ada sesuatu yang benar - benar tidak dapat dilakukan pada CPU single-core. Saya berpendapat bahwa pemrosesan grafis memerlukan pemrosesan paralel secara besar-besaran, tetapi mereka berpendapat bahwa hal-hal seperti DOOM dilakukan pada CPU single-core tanpa GPU.

Apakah ada sesuatu yang harus dilakukan pada prosesor multi-core?

Asumsikan ada waktu tak terbatas untuk pengembangan dan berjalan.

Ben Leggiero
sumber
8
Sementara jawaban di bawah ini sebagian besar tampaknya "tidak", ada sistem historis yang benar-benar tidak dapat bekerja tanpa co-prosesor menangani beberapa tugas. Satu contoh kuat yang saya tahu adalah Nintendo DS, yang mencakup CPU ARM9 67MHz dan CPU ARM7 33MHz (juga digunakan untuk back-compat saat bermain game GBA). Untuk game DS, ARM7 menangani pemutaran audio & komunikasi Wi-Fi karena ARM9 tidak dapat memproses & menarik catatan apa pun ke layar sambil tetap menyambungkan audio ke chip suara secara langsung. Jadi ketika @ jmite menyatakan "di bawah kendala apa", kurangnya kecepatan dapat membutuhkan beberapa CPU.
Slipp D. Thompson
10
Di pekerjaan saya, kami menggunakan multicore Xeon dan ekstensi Linux real-time Xenomai untuk melakukan pemrosesan audio latensi rendah. Kami memiliki pipa pemrosesan audio tiga tahap, dan setiap tahap mendapatkan inti berdedikasi sendiri, yang menggunakan ~ 70% dari siklus. Tugas non-real-time dapat menggunakan inti keempat, dan siklus apa pun yang tersisa pada tiga inti pertama. Ini hanya akan mungkin pada CPU single-core jika single core itu 3+ kali lebih cepat daripada sebuah core pada CPU 4-core saat ini; mengingat bahwa CPU saat ini berjalan pada 2GHz, itu mungkin sulit dicapai.
Jeremy Friesner
19
Perangkat lunak pada CPU single-core dapat meniru CPU multi-core. Perbedaannya hampir seluruhnya kecepatan.
user253751
24
Satu hal yang harus dilakukan pada sistem multi-core adalah menguji perangkat lunak multithreaded. Karena beberapa cacat akan (hampir) tidak pernah terjadi pada sistem single-core. Saya tidak yakin yang memenuhi syarat sebagai jawaban, meskipun ...
nikie
13
@nikie Sistem single-core dapat mengemulasi pemesanan memori dan basi cache juga - tapi saya membayangkan ini akan sangat tidak efisien (seperti 10 × perlambatan)
Nayuki

Jawaban:

47

Jika Anda tidak peduli dengan waktu pengoperasian, apa pun yang dapat Anda lakukan pada mesin multi-core, Anda dapat melakukannya pada mesin single-core. Mesin multi-inti hanyalah cara mempercepat beberapa jenis perhitungan.

Jika Anda dapat memecahkan masalah dalam waktu pada mesin multi-core dengan core, maka Anda dapat menyelesaikannya waktu (atau kurang melihat hukum Amdahl ) pada mesin single-core. Mesin single-core dapat meniru mesin multi-core menggunakan time-slicing / time-sharing .n T nTnTn

DW
sumber
3
Saya tidak sepenuhnya yakin itu sepenuhnya benar. Saya tidak berpikir bug konsistensi memori mungkin dihasilkan pada satu inti (Ya, orang dapat meniru sistem multicache pada unicore, tetapi tipuan semacam itu agak curang.). (Mungkin setara dengan menerapkan reg. Swap dengan memindahkan ops dalam VLIW, mengeksploitasi dijamin || isme?) Saya kira bahkan pada inti berulir tunggal masih mungkin untuk mengekstraksi entropi dari variabilitas waktu multithreaded, tetapi jumlah entropi akan lebih kecil per unit waktu (yang sebenarnya hanya masalah kinerja seperti perbedaan lainnya).
Paul A. Clayton
6
@ PaulA.Clayton Bug konsistensi memori biasanya tidak diinginkan dan perangkat lunak yang ditulis dengan baik tidak boleh memamerkannya. Namun, jika Anda benar - benar ingin, Anda bisa meniru mereka pada satu CPU. (Meskipun mungkin lambat)
user253751
4
Kadang-kadang waktu pada satu inti akan lebih dari kali lebih lama daripada pada mesin -core, misalnya untuk mencari dengan restart secara acak atau jika potongan-potongan tersebut sesuai dengan cache pada beberapa inti tetapi tidak pada inti tunggal. nnn
András Salamon
11
"Mesin single-core dapat meniru mesin multi-core menggunakan time-slicing / time-sharing." Dan memang telah melakukannya sejak awal Sistem Operasi "modern".
Lightness Races dengan Monica
1
@ PaulA.Clayton Saya pikir Anda bisa mendapatkan masalah konsistensi memori (seperti kenaikan non-atom) jika Anda memiliki dua proses berbeda yang keduanya memodifikasi memori bersama yang sama. Anda hanya perlu pre-emptive multi-tasking. Tentu saja, ini umumnya mengapa OS modern tidak memiliki proses berbagi memori yang dapat ditulis kecuali jika diminta secara eksplisit.
Patrick M
58

Pertanyaannya adalah: di bawah kendala apa?

Pasti ada masalah di mana, jika kita mengajukan pertanyaan "dapatkah kita memecahkan masalah ini pada perangkat keras X dalam jumlah waktu yang diberikan", jawabannya adalah tidak.

Tapi ini bukan jawaban "masa depan-bukti": hal-hal yang di masa lalu tidak bisa dilakukan cukup cepat dalam satu inti mungkin bisa sekarang, dan kami tidak dapat memprediksi apa perangkat keras masa depan akan mampu.

Dalam hal komputabilitas, kita tahu bahwa Turing Machine single-tape mampu menghitung semua fungsi yang sama dengan komputer tunggal atau multi-core, jadi, selain runtime, tidak ada masalah bahwa komputer multi-core dapat menyelesaikan single-core tidak bisa.

Dalam hal sesuatu seperti grafis, secara harfiah semua yang ada pada GPU dapat dilakukan pada CPU ... jika Anda bersedia menunggu cukup lama.

Ya ampun
sumber
3
@ JanDvorak Saya benar-benar akan mengatakan bahwa ini tidak dilakukan oleh GPU sama sekali;)
TomTom
15
Jika waktu bukan kendala, Anda bisa melakukan semua perhitungan dengan tangan, pena, dan kertas.
mathreadler
2
@ mathreadler Ya, karena otak Turing Lengkap. Sesuatu yang berubah menjadi perdebatan panjang tentang Fisika Stackexchange.
JBentley
4
Sebenarnya, @JanDvorak, menghasilkan VGA cukup sederhana dan dapat dilakukan dalam perangkat lunak pada pengontrol mikro 16 MHz yang rendah, seperti yang diperlihatkan proyek ini: pyroelectro.com/tutorials/arduino_basic_vga
axello
3
@ mathreadler Itu sebenarnya pertanyaan yang lebih rumit daripada yang pertama kali muncul. Jawaban singkat mungkin "ya" karena mesin khusus dapat membangun komputer tanpa memerlukan alat lengkap turing untuk melakukannya. Jawaban yang lebih panjang mungkin "tidak," karena kemampuan untuk membangun mesin turing dapat menyiratkan bahwa seseorang memiliki mesin turing yang lebih besar yang berada dalam keadaan "inisialisasi" di mana ia membangun sisa mesin negara. Jawaban lengkapnya bahkan lebih rumit karena kami belum pernah membuat perangkat Turing Lengkap. Kami telah mengembangkan ide abstrak untuk mesin yang ...
Cort Ammon
17

Seperti yang ditunjukkan oleh jawaban lain, satu CPU selalu dapat meniru banyak CPU dengan memotong waktu dan memainkan peran masing-masing CPU virtual. Persaingan ini tentu saja akan menghitung jawaban yang benar.

Di dunia nyata, waktu eksekusi mungkin penting. Ini bisa berarti perbedaan antara frame rate yang biasa-biasa saja dan pengalaman visual bintang. Atau perbedaan antara laba dan rugi dalam perdagangan.

Satu situasi patologis di mana multiprosesor jauh lebih cepat daripada uniprosesor adalah di mana pemrosesan adalah pipa data, pengalihan konteks mahal, dan kode mesin untuk setiap tahap pipa hanya pas di cache CPU.

Biarkan saya ilustrasikan dengan beberapa angka. Misalkan Anda memiliki jalur pipa data (rendering 3D, dll.) Yang memiliki 4 tahap pemrosesan, setiap tahap memiliki kode program 256 KiB, dan Anda dengan mudah memiliki 4 CPU dengan cache L2 256 KiB. Jika Anda mencoba menjalankan pemrosesan ini pada satu CPU, beralih di antara 4 tugas akan mahal dan melibatkan kesalahan cache yang berat. Di sisi lain, jika Anda menjalankannya pada sistem 4-core, perhitungan berpotensi menjadi sangat halus, cache misses minimal, dan konteks switch tidak ada. (Sebagai catatan, ini terkait dengan gagasan menyematkan aplikasi tertentu ke core tertentu - misalnya hanya melakukan operasi kernel OS dalam satu inti, atau penanganan TCP / IP, dll.)

Nayuki
sumber
7

Jauh lebih sulit untuk mengembangkan balapan data yang sangat jahat dengan satu CPU. Maksud saya, tentu saja, Anda dapat menarik antara kata-kata jika Anda mengganggu CPU tunggal, tetapi dapatkah Anda membuat skenario eksotis di mana tidak ada satu benang tunggal yang melakukan apa yang Anda inginkan?

Oke, mungkin membuat bug berbahaya tidak dianggap sebagai penggunaan multi-kode yang valid. Ternyata, tidak banyak yang mutli-core dapat lakukan bahwa core tunggal tidak dapat memberikan waktu. Alasannya sederhana. Jika Anda mencoba menghindari ras data jahat itu, Anda harus memiliki titik sinkronisasi dalam kode Anda. Jika Anda memodelkan kode Anda sebagai kisi perhitungan di mana input yang harus lengkap dan disinkronkan sebelum Anda dapat menghitung dan menghasilkan output, mudah untuk melihat bahwa satu CPU dapat dengan mudah berjalan di sepanjang kisi, menghitung blok kerja berikutnya yang tersedia .

Bahkan, jika Anda dapat menunjukkan bahwa algoritme Anda dapat diselesaikan dengan mesin Turing (yang hampir setiap algoritma yang kami pedulikan), dapat dibuktikan bahwa algoritme dapat dilakukan dengan tidak hanya satu CPU inti, tetapi pada kenyataannya mesin negara dengan selembar sangat panjang untuk memori!

The CHESS detektor lomba sebenarnya memanfaatkan ini untuk menemukan kasus ras. Ini menjalankan semua yang dilakukan secara singlethread dan secara sistematis mengeksplorasi semua interleaves yang mungkin di antara utas, mencoba menemukan kasus di mana tes gagal karena kasus ras. CHESS tergantung pada kenyataan bahwa Anda dapat menjalankan aplikasi multithreaded pada satu inti.

Kasus-kasus di mana Anda memerlukan multicore muncul ketika Anda mulai memperluas batas-batas perangkat keras. Yang jelas adalah ketika Anda memiliki keterbatasan waktu. Beberapa masalah dengan batasan waktu nyata tidak mungkin dilakukan dengan satu inti karena mereka tidak bisa menggerakkan jam satu inti dengan cukup cepat. Ada alasan mengapa CPU naik ke 4Ghz dan kemudian duduk sedikit, lebih memilih core lebih banyak pada kecepatan yang lebih rendah.

Versi yang lebih eksotis dari batasan waktu ini adalah dalam sistem waktu nyata yang sulit. Dalam beberapa sistem waktu nyata yang sulit, layanan interupsi sangat menuntut sehingga Anda benar-benar harus memilih CPU multi-core yang memungkinkan Anda membagi interupsi di seluruh core, atau Anda mengalami keterbatasan waktu.

Batas lain muncul dengan bus data. Pertimbangkan Blue Gene / P sebagai contoh. JUGENE, superkomputer Blue Gene / P tertentu, memiliki memori 144 terabyte . Mereka tidak membuat komputer CPU tunggal yang dapat mengakses semua memori itu.

Cort Ammon
sumber
1
Re, Mereka tidak membuat komputer CPU tunggal yang dapat mengakses memori [sebanyak itu]. "Jangan" tidak sama dengan "tidak bisa". Anda dapat merancang dan membangun uniprocessor dengan memori utama 144 terabyte atau lebih. Satu-satunya alasan orang tidak melakukannya karena berkurangnya pengembalian: Nilai tambahan yang praktis untuk menambahkan lebih banyak memori ke desain uni-prosesor mencapai puncak di beberapa titik dan kemudian turun saat ukuran memori tumbuh, sementara biaya tambahan tetap konstan .
Solomon Slow
@ jameslarge Itulah mengapa kalimat itu muncul di bagian jawaban saya yang membahas perangkat keras praktis kehidupan nyata, dan mengapa kalimat itu tidak muncul dalam 2/3 pertama jawaban yang membahas kapasitas teoritis.
Cort Ammon
"Jangan" vs. "Tidak bisa" diilustrasikan oleh dua sistem di ruang bawah tanah saya. Jika saya secara fisik dapat menambahkan memori sebanyak itu ke dalam konfigurasi perangkat keras mereka, CPU mereka "bisa" mengakses setiap byte. Tapi saya tidak bisa, jadi mereka "tidak bisa". Kemampuan CPU melampaui kepraktisan.
user2338816
Saya sedang memikirkan sesuatu seperti jawaban ini. Tampaknya kondisi balapan tidak mungkin (atau terjadi 100% dari waktu) dalam lingkungan inti tunggal. Sedangkan untuk aplikasi praktis, saya berteori bahwa pengembang perangkat lunak dapat merekayasa beberapa bentuk perlindungan salinan unik dengan cara mengkode beberapa tes kondisi ras aneh yang akan selalu lulus pada perangkat keras target spesifik, tetapi akan gagal pada perangkat keras yang ditiru yang dijalankan oleh satu inti. . Dalam hal ini, emulasi oleh sistem multi-core mungkin kadang-kadang akan berlalu, tetapi tidak dapat diandalkan.
Dan Henderson
6

Jika Anda perlu mengamati proses yang berjalan pada elemen pemrosesan tunggal tanpa mengganggu perilakunya yang real-time (atau sesedikit mungkin), seperti untuk pembandingan atau pencatatan aktivitas, Anda mungkin memerlukan sumber daya pemrosesan yang terpisah.

Yves Daoust
sumber
Bagus, contoh ringkas dari sesuatu yang akan membutuhkan emulasi yang tepat jika tidak banyak prosesor
Ben Leggiero
Hei, ini akunmu? Mungkin Anda ingin menggabungkannya?
Jahat
4

Jawaban lain mematuhi pandangan terbatas paralelisme sebagai "concurrency terdistribusi". Ini memberikan beberapa jawaban: dalam model komputasi yang bersih à la Turing, banyak core tidak menawarkan keuntungan; satu-satunya keuntungan yang Anda dapatkan adalah efisiensi.

Ada yang satu hal beberapa unit pengolahan (nanah) bisa melakukan itu satu pun tidak bisa, meskipun: melaksanakan operasi secara paralel , yaitu pada saat yang sama .

Itu sangat berguna jika Anda menjalankan banyak program secara bersamaan. Memang, jarang Anda benar-benar membutuhkan lebih dari eksekusi bersamaan, dan sebagian besar kegunaan meningkatkan efisiensi. Tapi ada adalah perbedaan ini.

Katakanlah Anda perlu memproses data sensor data dari berbagai sumber secara real time. Apa pun artinya dalam aplikasi Anda, satu PU hanya dapat menangani begitu banyak input stream bersamaan tanpa melanggar batas waktu responsnya. Jadi Anda perlu beberapa PU setelah Anda memiliki terlalu banyak sensor untuk generasi PU Anda saat ini.

Di ranah yang lebih klasik, salah satu contoh yang meyakinkan adalah algoritma portofolio . Katakanlah Anda memiliki masalah yang menyebabkan Anda memiliki banyak algoritma (misalkan ) dengan biaya ortogonal; kasus yang baik dari satu adalah kasus yang buruk untuk orang lain. Anda tidak dapat dengan cepat mengetahui mana yang terbaik untuk input yang diberikan.k

Anda dapat menjalankan semua algoritma secara paralel dan batalkan setelah satu selesai. Jika Anda memiliki setidaknya PU, Anda mendapatkan waktu berjalan minimum di antara semua algoritma dalam portofolio. Dengan hanya satu PU, Anda akan mendapatkan kali itu, dengan asumsi penjadwal yang adil, ditambah semua overhead.k kkkk

Raphael
sumber
0

dari pov CS, "multicore" tidak jauh berbeda dalam teori daripada "komputasi terdistribusi". konsep dasarnya adalah "elemen komputasi independen (yang menghitung secara paralel". sehingga sedikit mengulangi pertanyaan ("multicore" sebenarnya bukan konsep teoretis dalam CS) mengarah ke beberapa kemungkinan lain. seperti yang ditunjukkan dalam jawaban lain, pemrograman berurutan adalah setara dengan pemrograman paralel dari pov CS. Ini kembali ke definisi sistem teoritis untuk komputasi, yaitu mesin Turing. Analisis teoritis kinerja CS pada akhirnya dalam hal TMs di mana perbedaan paralel vs sekuensial tidak benar-benar berlaku ( meskipun ada beberapa analogi kasar dengan TM multitape ).

tetapi mengingat pertanyaan ini kurang abstrak, komputasi terdistribusi memang unggul atau bahkan mungkin hampir diperlukan untuk beberapa masalah yang melibatkan toleransi kesalahan . di area ini ada konsep yang berlaku ketika / di mana elemen-elemen komputasi independen dianggap memiliki tingkat tidak dapat diandalkan (ini bukan asumsi yang berlaku universal untuk semua konteks). berikut adalah beberapa kasus di mana toleransi kesalahan ditingkatkan dengan atau bahkan membutuhkan elemen komputasi independen.

  • pertimbangkan bahwa setiap prosesor memiliki peluang independen "[x]%" untuk gagal selama perhitungan. suatu sistem dapat dirancang dimana melalui komunikasi toleransi kesalahan keseluruhan sistem lebih unggul dari komponen individu. ini telah diterapkan beberapa dekade yang lalu misalnya dalam sistem Space Shuttle. baru-baru ini ada protokol dasar yang dirancang untuk menggunakannya misalnya Paxos yang memecahkan apa yang disebut masalah konsensus . contoh yang lebih sederhana adalah Google yang memiliki banyak algoritme berpemilik untuk dasarnya membangun superkomputer mereka dari elemen-elemen yang tidak dapat diandalkan secara individual ditambah dengan algoritma toleran-kesalahan.

  • Bitcoin melibatkan transaksi terdistribusi untuk menghitung buku besar dan itu bukan hanya karena masalah pemrosesan semata. Algoritma dirancang dengan hati-hati untuk menggagalkan node yang rusak. singkatnya "memecahkan" / mengimplementasikan masalah jenderal Bizantium yang bukan hanya tentang memaksimalkan kinerja paralel, itu melibatkan entitas independen "memeriksa" satu sama lain dan "secara algoritmik / kriptografis / aman" menolak perhitungan yang tidak valid alias semacam "curang" atau " korupsi".

  • analisis klasik tentang paralelisme menyimpulkan ada sekitar 7 jenis pola masalah "mendasar" yang terurai menjadi gangguan eksekusi paralel tertentu. lihat The Landscape of Parallel Computing Research: A View from Berkeley

  • ada beberapa elemen pertanyaan teoretis terbuka di sini pertimbangan kinerja yang dibahas dalam sebagian besar jawaban lain. pertanyaan apakah ada masalah yang "secara inheren lebih cepat" secara paralel daripada berurutan juga dikenal secara kasar sebagai masalah P =? NC di mana NC dianggap sebagai kelas dari algoritma "paralel yang efisien" dan P adalah "efisien [berurutan] algoritma "

vzn
sumber
1
Saya suka jawaban ini! Saya belajar banyak dari contoh Anda: D
Ben Leggiero
+1 untuk toleransi kesalahan dalam lingkungan misi-kritis dengan radiasi, -1 karena kurangnya tutup dan redundansi.
Cees Timmerman