Saya tidak mengerti mengapa produsen CPU membuat chip multi-core. Penskalaan beberapa core sangat mengerikan, ini sangat spesifik untuk aplikasi, dan saya yakin Anda dapat menunjukkan program atau kode tertentu yang berjalan dengan baik pada banyak core, tetapi sebagian besar waktu penskalaan adalah sampah. Ini adalah pemborosan ruang cetakan silikon dan pemborosan energi.
Game, misalnya, hampir tidak pernah menggunakan lebih dari empat core. Simulasi sains dan teknik seperti Ansys atau Fluent dihargai dari berapa banyak core yang dimiliki PC, jadi Anda membayar lebih banyak karena Anda memiliki lebih banyak core, tetapi manfaat lebih banyak core menjadi sangat buruk melewati 16 core, namun Anda memiliki 64 core ini. workstation ... ini buang-buang uang dan energi. Lebih baik membeli pemanas 1500 W untuk musim dingin, jauh lebih murah.
Mengapa mereka tidak membuat CPU hanya dengan satu inti besar?
Saya pikir jika mereka membuat satu inti setara dengan CPU delapan inti, bahwa satu inti akan memiliki peningkatan IPC 800%, sehingga Anda akan mendapatkan kinerja penuh di semua program, bukan hanya yang dioptimalkan untuk banyak inti. Semakin banyak IPC meningkatkan kinerja di mana-mana, ini cara yang andal dan sederhana untuk meningkatkan kinerja. Multiple core meningkatkan kinerja hanya dalam sejumlah program terbatas, dan penskalaannya mengerikan dan tidak dapat diandalkan.
Jawaban:
Masalahnya terletak pada asumsi bahwa produsen CPU hanya dapat menambahkan lebih banyak transistor untuk membuat satu inti CPU lebih kuat tanpa konsekuensi.
Untuk membuat CPU melakukan lebih banyak, Anda harus merencanakan apa yang harus dilakukan dengan melakukan lebih banyak. Sebenarnya ada tiga opsi:
Buat inti berjalan pada frekuensi clock yang lebih tinggi - Masalahnya adalah kita sudah mencapai batasan apa yang bisa kita lakukan.
Penggunaan daya dan karenanya disipasi termal meningkat dengan frekuensi - jika Anda menggandakan frekuensi Anda secara nominal menggandakan disipasi daya. Jika Anda menambah tegangan, maka disipasi daya Anda akan naik dengan kuadrat tegangan.
Interkoneksi dan transistor juga mengalami keterlambatan propagasi karena sifat dunia yang tidak ideal. Anda tidak dapat hanya meningkatkan jumlah transistor dan berharap dapat berjalan pada frekuensi jam yang sama.
Kami juga dibatasi oleh perangkat keras eksternal - terutama RAM. Untuk membuat CPU lebih cepat, Anda harus meningkatkan bandwidth memori, dengan menjalankannya lebih cepat, atau menambah lebar bus data.
Tambahkan instruksi yang lebih kompleks - Alih-alih berjalan lebih cepat, kita dapat menambahkan set instruksi yang lebih kaya - tugas umum seperti enkripsi dll. Dapat dikeraskan ke dalam silikon. Alih-alih mengambil banyak siklus jam untuk menghitung dalam perangkat lunak, kami malah memiliki akselerasi perangkat keras.
Ini sudah dilakukan pada prosesor Complex Instruction Set (CISC). Lihat hal-hal seperti SSE2, SSE3. Satu inti CPU saat ini jauh lebih kuat daripada inti CPU bahkan dari 10 tahun yang lalu bahkan jika berjalan pada frekuensi clock yang sama.
Masalahnya adalah, saat Anda menambahkan instruksi yang lebih rumit, Anda menambahkan lebih banyak kompleksitas dan membuat chip semakin besar. Sebagai akibat langsung , CPU menjadi lebih lambat - frekuensi clock yang dapat diterima turun karena penundaan propagasi meningkat.
Instruksi kompleks ini juga tidak membantu Anda dengan tugas-tugas sederhana. Anda tidak dapat mengeraskan setiap kasus penggunaan yang mungkin, jadi sebagian besar perangkat lunak yang Anda jalankan tidak akan mendapat manfaat dari instruksi baru, dan pada kenyataannya akan dirugikan oleh penurunan laju jam yang dihasilkan.
Anda juga dapat membuat lebar bus data lebih besar untuk memproses lebih banyak data sekaligus, namun sekali lagi ini membuat CPU lebih besar dan Anda menekan tradeoff antara throughput yang diperoleh melalui bus data yang lebih besar dan clock rate menurun. Jika Anda hanya memiliki data kecil (mis. Integer 32-bit), memiliki CPU 256-bit tidak terlalu membantu Anda.
Jadikan CPU lebih paralel - Daripada mencoba melakukan satu hal lebih cepat, alih-alih lakukan banyak hal sekaligus. Jika tugas yang Anda lakukan cocok untuk beroperasi pada beberapa hal sekaligus, maka Anda ingin satu CPU yang dapat melakukan beberapa perhitungan per instruksi (Single Instruction Multiple Data (SIMD)), atau memiliki beberapa CPU yang masing-masing dapat melakukan satu perhitungan.
Ini adalah salah satu pendorong utama untuk CPU multi-core. Jika Anda menjalankan banyak program, atau dapat membagi program tunggal Anda menjadi beberapa tugas, maka memiliki beberapa inti CPU memungkinkan Anda melakukan lebih banyak hal sekaligus.
Karena masing-masing inti CPU adalah blok yang terpisah secara efektif (pembatasan cache dan antarmuka memori), masing-masing inti individu lebih kecil daripada inti monolitik tunggal yang setara. Karena inti lebih kompak, penundaan propagasi berkurang, dan Anda dapat menjalankan setiap inti lebih cepat.
Seperti apakah suatu program tunggal dapat mengambil manfaat dari memiliki beberapa inti, itu sepenuhnya tergantung pada apa yang sedang dilakukan oleh program tersebut, dan bagaimana program itu ditulis.
sumber
Selain jawaban lain, ada elemen lain: hasil chip . Sebuah prosesor modern memiliki beberapa miliar transistor di dalamnya, masing-masing dan setiap transistor harus bekerja dengan sempurna agar seluruh chip berfungsi dengan baik.
Dengan membuat prosesor multi-core, Anda dapat mempartisi grup transistor dengan bersih. Jika ada cacat di salah satu core, Anda dapat menonaktifkan core itu , dan menjual chip dengan harga yang dikurangi sesuai dengan jumlah core yang berfungsi. Demikian juga, Anda juga dapat merakit sistem dari komponen yang divalidasi seperti pada sistem SMP.
Untuk hampir setiap CPU yang Anda beli, ia mulai hidup menjadi model premium kelas atas untuk jajaran prosesor tersebut. Apa yang Anda hasilkan, tergantung pada bagian mana dari chip yang bekerja secara salah dan dinonaktifkan. Intel tidak membuat prosesor i3: semuanya i7 rusak, dengan semua fitur yang memisahkan lini produk dinonaktifkan karena gagal pengujian. Namun, porsi yang masih berfungsi masih bermanfaat dan bisa dijual jauh lebih murah. Yang lebih buruk menjadi pernak-pernik gantungan kunci.
Dan cacat tidak jarang terjadi. Menciptakan milyaran transistor dengan sempurna bukanlah tugas yang mudah. Jika Anda tidak memiliki kesempatan untuk secara selektif menggunakan bagian dari chip yang diberikan, harga hasilnya akan naik, sangat cepat.
Hanya dengan satu prosesor über, pembuatan semuanya atau tidak sama sekali, menghasilkan proses yang jauh lebih boros. Untuk beberapa perangkat, seperti sensor gambar untuk keperluan ilmiah atau militer, di mana Anda memerlukan sensor yang sangat besar dan semuanya harus bekerja, biaya perangkat tersebut sangat besar sehingga hanya anggaran tingkat negara bagian yang dapat membelinya.
sumber
Ketergantungan data
Cukup mudah untuk menambahkan lebih banyak instruksi per jam dengan membuat chip "lebih luas" - ini telah menjadi pendekatan "SIMD". Masalahnya adalah ini tidak membantu kebanyakan kasus penggunaan.
Secara kasar ada dua jenis beban kerja, independen dan dependen. Contoh beban kerja independen mungkin "diberi dua urutan angka A1, A2, A3 ... dan B1, B2, ... dll, menghitung (A1 + B1) dan (A2 + B2) dll." Beban kerja semacam ini terlihat dalam grafik komputer, pemrosesan audio, pembelajaran mesin, dan sebagainya. Cukup banyak ini telah diberikan kepada GPU, yang dirancang khusus untuk menanganinya.
Beban kerja dependen mungkin adalah "Diberikan A, tambahkan 5 ke atasnya dan cari di tabel. Ambil hasilnya dan tambahkan 16 di atasnya. Lihat di atas di tabel yang berbeda."
Keuntungan dari beban kerja independen adalah dapat dibagi menjadi banyak bagian yang berbeda, sehingga lebih banyak transistor yang membantu. Untuk beban kerja yang tergantung, ini sama sekali tidak membantu - lebih banyak transistor hanya bisa membuatnya lebih lambat . Jika Anda harus mendapatkan nilai dari memori, itu adalah bencana untuk kecepatan. Sebuah sinyal harus dikirim melintasi motherboard, bepergian dengan kecepatan sub-lampu, DRAM harus mengisi daya satu baris dan menunggu hasilnya, kemudian mengirimkannya kembali. Ini membutuhkan puluhan nanodetik. Kemudian, setelah melakukan perhitungan sederhana, Anda harus mengirim untuk yang berikutnya.
Manajemen daya
Core cadangan dimatikan sebagian besar waktu. Pada kenyataannya, pada cukup banyak prosesor, Anda tidak dapat menjalankan semua core sepanjang waktu tanpa hal yang memanas, sehingga sistem akan mematikannya atau menurunkannya untuk Anda.
Menulis ulang perangkat lunak adalah satu-satunya cara ke depan
Perangkat keras tidak dapat secara otomatis mengubah beban kerja dependen menjadi beban kerja independen. Juga tidak dapat perangkat lunak. Tetapi seorang programmer yang siap untuk mendesain ulang sistem mereka untuk mengambil keuntungan dari banyak core mungkin saja.
sumber
Kembali ke masa lalu, prosesor tidak dapat berlari secepat itu. Akibatnya, jika Anda ingin melakukan lebih banyak pemrosesan maka Anda membutuhkan lebih banyak prosesor. Ini bisa dengan coprocessor matematika, atau bisa juga dengan lebih dari prosesor yang sama. Contoh terbaik dari hal ini adalah Inmos Transputer dari tahun 80-an, yang secara khusus dirancang untuk pemrosesan paralel besar-besaran dengan beberapa prosesor yang dihubungkan bersama. Seluruh konsep bergantung pada asumsi bahwa tidak ada cara yang lebih baik untuk meningkatkan daya pemrosesan daripada menambah prosesor.
Masalahnya, asumsi itu (sementara) salah. Anda juga bisa mendapatkan lebih banyak kekuatan pemrosesan dengan membuat satu prosesor melakukan lebih banyak perhitungan. Intel dan AMD menemukan cara untuk mendorong kecepatan clock semakin tinggi, dan seperti yang Anda katakan, jauh lebih mudah untuk menjaga semuanya pada satu prosesor. Hasilnya adalah bahwa sampai pertengahan 2000-an, prosesor single-core cepat dimiliki pasar. Inmos meninggal pada awal tahun 90-an, dan semua pengalaman mereka mati bersama mereka.
Masa-masa indah harus berakhir. Begitu kecepatan clock naik ke GHz, benar-benar tidak ada ruang untuk melangkah lebih jauh. Dan kembali kami pergi ke beberapa core lagi. Jika Anda benar-benar tidak bisa lebih cepat, lebih banyak inti adalah jawabannya. Seperti yang Anda katakan, tidak selalu mudah untuk menggunakan inti tersebut secara efektif. Kami jauh lebih baik hari ini, tetapi kami masih beberapa cara membuatnya semudah Transputer lakukan.
Tentu saja ada opsi lain untuk peningkatan juga - Anda bisa lebih efisien sebagai gantinya. SIMD dan set instruksi serupa menyelesaikan lebih banyak pemrosesan untuk jumlah kutu jam yang sama. DDR membuat data Anda masuk dan keluar dari prosesor lebih cepat. Itu semua membantu. Tetapi ketika datang ke pemrosesan, kita kembali ke 80-an dan beberapa core lagi.
sumber
Pertanyaan bagus, atau setidaknya satu dengan jawaban yang menarik. Bagian dari jawaban ini menggambarkan dunia di mana CPU dapat mengukur lebar secara efisien daripada dengan beberapa inti terpisah. Model lisensi / harga akan berbeda!
Sisanya menjelaskan mengapa mereka tidak bisa. Ringkasan:
Anda tidak menyebutkan frekuensi, hanya IPC, tetapi frekuensi penskalaan juga sulit. Frekuensi yang lebih tinggi membutuhkan tegangan yang lebih tinggi, sehingga skala daya dengan frekuensi potong dadu :
^1
dari frekuensi secara langsung, dan^2
dari tegangan. (Timbangan energi tersimpan kapasitor dengan V ^ 2, dan sebagian besar daya dinamis di luar arus bocor adalah dari memompa muatan ke beban kapasitif gerbang + kabel FET.)Kinerja = frekuensi kali IPC. (Dalam arsitektur yang sama. SIMD yang lebih luas memungkinkan Anda menyelesaikan pekerjaan yang sama dengan instruksi yang lebih sedikit, dan beberapa ISA lebih padat daripada yang lain, misalnya MIPS sering membutuhkan lebih banyak instruksi untuk melakukan pekerjaan yang sama daripada x86 atau AArch64.)
Biaya berada di area mati (biaya produksi) dan / atau daya (yang secara tidak langsung membatasi frekuensi karena pendinginan sulit). Selain itu, daya dan kinerja per Watt yang lebih rendah adalah tujuan itu sendiri, terutama untuk seluler (baterai) dan server (kepadatan daya / biaya pendinginan / biaya listrik).
Sebelum multi-core per socket adalah suatu hal, Anda memang memiliki sistem multi-socket untuk kasus penggunaan kelas atas di mana Anda menginginkan lebih banyak throughput daripada yang dapat dicapai dengan satu CPU yang dapat diproduksi, jadi itu adalah satu-satunya sistem SMP. (Server, stasiun kerja kelas atas).
Jika satu inti dapat menskala seefisien yang Anda inginkan, kami akan memiliki sistem dengan 1 inti fisik per soket, dan SMT (mis. HyperThreading) untuk memungkinkannya bertindak sebagai beberapa inti logis. Desktop / laptop biasa hanya akan memiliki 1 inti fisik, dan kami tidak akan kesulitan untuk memaralelkan hal-hal yang tidak skala secara linear dengan lebih banyak core. misalnya
make -j4
untuk memanfaatkan server multi-socket, dan / atau untuk menyembunyikan latensi I / O pada desktop. (Atau mungkin kita masih akan mencoba untuk memparalelkan banyak jika lebar pipa dengan mudah diskalakan tetapi IPC tidak, jadi kami harus menggunakan lebih banyak benang SMT.) Kernel OS Anda masih perlu dijalankan di semua inti logis, kecuali cara CPU menyajikan SMT ke OS sangat berbeda, sehingga algoritma penjadwalan paralel dan penguncian masih akan diperlukan di sana.Donald Knuth mengatakan dalam sebuah wawancara tahun 2008
Ya, jika kita dapat memiliki keajaiban single-core CPU dengan 8x throughput pada program nyata , kita mungkin masih akan menggunakannya. Dengan sistem dual socket hanya ketika itu layak membayar lebih banyak untuk throughput lebih (bukan kinerja single-threaded).
Banyak CPU mengurangi biaya pengalih-konteks ketika banyak program berjalan (dengan membiarkannya benar-benar berjalan secara paralel alih-alih beralih cepat di antaranya); multitasking pre-emptive mengganggu mesin out-of-order besar seperti CPU akan membutuhkan mungkin akan lebih menyakitkan daripada yang sekarang.
Secara fisik itu akan menjadi single core (untuk hierarki cache sederhana tanpa ada interkoneksi antar core) tetapi mendukung SMT (mis. Intel HyperThreading) sehingga perangkat lunak dapat menggunakannya sebagai 8 core logis yang secara dinamis bersaing untuk sumber daya throughput. Atau ketika hanya 1 utas yang berjalan / tidak terhenti, itu akan mendapat manfaat penuh.
Jadi, Anda akan menggunakan banyak utas saat itu sebenarnya lebih mudah / alami (mis. Proses terpisah berjalan bersamaan), atau untuk masalah yang mudah diparalelkan dengan rantai ketergantungan yang akan mencegah memaksimalkan IPC binatang ini.
Namun sayangnya itu adalah angan-angan Knuth bahwa CPU multi-core akan berhenti menjadi sesuatu pada saat ini.
Penskalaan kinerja satu utas
Ya itu benar. Jika mungkin untuk membangun CPU seperti itu sama sekali, itu akan sangat luar biasa. Tapi saya pikir itu benar - benar mustahil pada proses pembuatan semikonduktor yang sama (yaitu kualitas / efisiensi yang sama dari transistor). Ini tentu saja tidak mungkin dengan anggaran daya yang sama dan area mati sebagai CPU 8-core, meskipun Anda akan menghemat logika untuk merekatkan core bersama, dan tidak akan membutuhkan banyak ruang untuk cache pribadi per-core.
Bahkan jika Anda mengizinkan peningkatan frekuensi (karena kriteria sebenarnya adalah bekerja per detik, bukan bekerja per jam), membuat CPU yang 2x lebih cepat akan menjadi tantangan besar.
Jika mungkin di mana saja di dekat daya yang sama dan anggaran die-area (sehingga biaya produksi) untuk membangun CPU seperti itu, ya vendor CPU sudah akan membangun mereka seperti itu.
Lihat Mikroprosesor Modern, Panduan 90 Menit!
Secara khusus, Lebih Banyak Core atau Core Lebih Luas? bagian, untuk latar belakang yang diperlukan untuk memahami jawaban ini; itu mulai sederhana dengan cara kerja pipelined CPU, kemudian superscalar (beberapa instruksi per jam). Kemudian menjelaskan bagaimana kita menabrak dinding daya di sekitar era P4, yang mengarah ke akhir penskalaan frekuensi yang mudah, menyisakan sebagian besar hanya IPC dan menyelesaikan lebih banyak pekerjaan per instruksi (misalnya SIMD) sebagai jalur maju, bahkan dengan transistor yang lebih kecil.
Membuat saluran pipa lebih lebar (instruksi maksimal per jam) biasanya menimbang biaya dengan lebar kuadrat . Biaya tersebut diukur dalam area die dan / atau daya, untuk pengecekan dependensi paralel yang lebih luas (deteksi bahaya), dan penjadwal out-of-order yang lebih luas untuk menemukan instruksi siap untuk dijalankan. Dan lebih banyak port baca / tulis pada file register dan cache Anda jika Anda ingin menjalankan instruksi selain
nop
. Terutama jika Anda memiliki instruksi 3-input seperti FMA atau add-with-carry (2 register + flag).Ada juga berkurangnya pengembalian IPC untuk membuat CPU lebih luas ; sebagian besar beban kerja telah membatasi skala kecil / jarak pendek ILP (Instruction-Level Parallelism) untuk dieksploitasi oleh CPU, sehingga membuat core lebih luas tidak meningkatkan IPC (instruksi per jam) jika IPC sudah dibatasi kurang dari lebar inti oleh rantai ketergantungan, kehilangan cabang, ketinggalan cache, atau warung lainnya. Tentu Anda akan mendapatkan speedup di beberapa loop terbuka dengan iterasi independen, tapi bukan itu yang dilakukan sebagian besar kode. Bandingkan / instruksi cabang membuat 20% dari campuran instruksi dalam kode "khas", IIRC. (Saya pikir saya sudah membaca angka dari 15 hingga 25% untuk berbagai set data.)
Juga, cache ketinggalan yang menghentikan semua instruksi yang bergantung (dan kemudian semuanya begitu kapasitas ROB tercapai) lebih mahal untuk CPU yang lebih luas. (Biaya peluang meninggalkan lebih banyak unit eksekusi; lebih banyak pekerjaan potensial yang tidak dilakukan.) Atau kehilangan cabang juga menyebabkan gelembung.
Untuk mendapatkan IPC 8x, kami membutuhkan setidaknya 8x peningkatan dalam akurasi prediksi cabang dan tingkat hit cache . Tetapi cache hit rate tidak dapat diukur dengan baik dengan kapasitas cache melewati titik tertentu untuk sebagian besar beban kerja. Dan HW prefetching cerdas, tetapi tidak bisa yang pintar. Dan pada 8x IPC, prediktor cabang perlu menghasilkan 8x lebih banyak prediksi per siklus serta membuatnya lebih akurat.
Teknik saat ini untuk membangun eksekusi CPU yang tidak sesuai pesanan hanya dapat menemukan ILP dari jarak dekat . Misalnya, ukuran ROB Skylake adalah 224 domain-leburan uops, penjadwal untuk u-non-eksekusi adalah 97 domain-tidak-terpakai. Lihat Memahami dampak lfence pada loop dengan dua rantai ketergantungan panjang, untuk meningkatkan panjang untuk kasus di mana ukuran penjadwal adalah faktor pembatas dalam mengekstraksi ILP dari 2 rantai instruksi yang panjang, jika terlalu panjang. Dan / atau lihat ini jawaban yang lebih umum dan pengantar ).
Jadi menemukan ILP antara dua loop panjang yang terpisah bukanlah sesuatu yang bisa kita lakukan dengan perangkat keras. Rekompilasi biner dinamis untuk fusi loop dapat dimungkinkan dalam beberapa kasus, tetapi sulit dan bukan sesuatu yang benar-benar dapat dilakukan CPU kecuali mereka menggunakan rute Transmeta Crusoe. (Lapisan emulasi x86 di atas ISA internal yang berbeda; dalam hal ini VLIW). Tetapi desain x86 modern standar dengan cache uop dan decoder yang kuat tidak mudah dikalahkan untuk sebagian besar kode.
Dan di luar x86, semua ISA masih digunakan relatif mudah untuk memecahkan kode, sehingga tidak ada motivasi untuk kompilasi dinamis selain optimasi jarak jauh. TL: DR: berharap untuk kompiler ajaib yang dapat mengekspos lebih banyak ILP ke perangkat keras tidak berfungsi untuk Itanium IA-64 , dan tidak mungkin bekerja untuk CPU super-lebar untuk setiap ISA yang ada dengan model serial eksekusi.
Jika Anda memang memiliki CPU super-lebar, Anda pasti ingin itu mendukung SMT sehingga Anda dapat membuatnya tetap bekerja dengan menjalankan beberapa utas rendah-ILP.
Karena Skylake saat ini lebar 4 uops (dan mencapai IPC nyata 2 hingga 3 uops per jam, atau bahkan lebih dekat dengan 4 dalam kode throughput tinggi), CPU 8x yang lebih lebar secara hipotetis akan berukuran 32-lebar!
Mampu mengukir itu kembali ke 8 atau 16 CPU logis yang secara dinamis berbagi sumber daya eksekusi akan fantastis: utas yang tidak macet mendapatkan semua bandwidth front-end dan throughput back-end.
Tetapi dengan 8 core yang terpisah, ketika sebuah thread berhenti, tidak ada lagi yang bisa membuat unit eksekusi diberi makan; utas lainnya tidak mendapat manfaat.
Eksekusi sering meledak-ledak: ia berhenti menunggu cache gagal dimuat, lalu begitu yang tiba banyak instruksi secara paralel dapat menggunakan hasil itu. Dengan CPU super-lebar, burst itu bisa lebih cepat, dan sebenarnya bisa membantu dengan SMT.
Tetapi kita tidak dapat memiliki CPU super lebar ajaib
Jadi untuk mendapatkan throughput kita malah harus mengekspos paralelisme ke perangkat keras dalam bentuk paralelisme tingkat-benang . Umumnya kompiler tidak pandai mengetahui kapan / bagaimana menggunakan utas, selain untuk kasus sederhana seperti loop yang sangat besar. (OpenMP, atau gcc
-ftree-parallelize-loops
). Masih dibutuhkan kepintaran manusia untuk mengolah kode agar dapat secara efisien menyelesaikan pekerjaan yang berguna secara paralel, karena komunikasi antar-thread mahal, dan begitu juga utas startup.TLP adalah paralelisme berbutir kasar, tidak seperti ILP berbutir halus dalam satu utas eksekusi yang dapat dieksploitasi oleh HW.
CPU yang ditujukan untuk beban kerja interaktif (seperti Intel / AMD x86, dan core high-end Apple / ARM AArch64) pasti mendorong penurunan hasil penskalaan IPC, karena kinerja single-threaded masih sangat berharga ketika latensi penting, bukan hanya throughput untuk masalah paralel masif.
Mampu menjalankan 8 salinan game secara paralel pada 15fps masing-masing jauh lebih berharga daripada mampu menjalankan satu salinan pada 45fps. Vendor CPU mengetahui hal ini, dan itulah sebabnya CPU modern menggunakan eksekusi out-of-order meskipun biayanya besar dan mati. (Tetapi GPU tidak karena beban kerjanya paralel secara masif).
Perangkat keras banyak-inti Intel Xeon Phi (Knight's Landing / Knight's Mill) adalah titik setengah jalan yang menarik: eksekusi out-of-order yang sangat terbatas dan SMT untuk menjaga core 2-lebar yang diberi instruksi AVX512 SIMD untuk mengolah angka. Inti didasarkan pada arsitektur Silvermont berdaya rendah Intel. (Ex-of-order eksekutif tetapi dengan jendela menata ulang kecil, jauh lebih kecil dari keluarga inti Sandybridge. Dan pipa yang lebih sempit.)
BTW, semua ini ortogonal ke SIMD. Mengerjakan lebih banyak pekerjaan per instruksi selalu membantu, jika memungkinkan untuk masalah Anda.
Model harga
Model penentuan harga perangkat lunak didasarkan pada lanskap perangkat keras terkini.
Model lisensi per-inti menjadi lebih luas (dan relevan bahkan untuk desktop soket tunggal) dengan munculnya CPU multi-core. Sebelum itu, itu hanya relevan untuk server dan workstation besar.
Jika perangkat lunak tidak memerlukan banyak inti untuk berjalan dengan kecepatan tinggi, tidak akan ada cara untuk menjualnya lebih murah kepada orang-orang yang tidak mendapatkan banyak manfaat karena mereka menjalankannya pada CPU yang lebih lemah. Kecuali jika mungkin ekosistem perangkat lunak / perangkat keras mengembangkan kontrol pada "saluran SMT" yang memungkinkan Anda mengkonfigurasi lebar eksekusi maksimum untuk kode yang berjalan pada inti logis itu. (Sekali lagi membayangkan dunia di mana skala CPU dalam lebar pipa, bukan beberapa core terpisah.)
sumber
Biarkan saya menggambar analogi:
Jika Anda memiliki monyet mengetik di mesin tik, dan Anda ingin lebih banyak mengetik selesai, Anda bisa memberikan kopi monyet, mengetik pelajaran, dan mungkin membuat ancaman untuk membuatnya bekerja lebih cepat, tetapi ada titik di mana monyet akan mengetik di kapasitas maksimum.
Jadi, jika Anda ingin lebih banyak mengetik, Anda harus mendapatkan lebih banyak monyet.
Untuk memperluas analogi lebih lanjut, Anda memerlukan mesin tik terpisah untuk setiap monyet (mewakili bus data yang dibutuhkan masing-masing inti), Anda memerlukan cara untuk membawa pisang ke setiap monyet dan sesuatu untuk mengambil kotorannya (analog dengan distribusi daya dan panas disipasi) dan Anda perlu cara untuk memastikan bahwa monyet tidak semua mencoba untuk mengetikkan bagian yang sama di Twelfth Night (analog dengan membagi beban kerja di antara prosesor). Tetapi semua ini kurang berhasil untuk mendapatkan lebih banyak daripada mencoba untuk mendapatkan lebih banyak mengetik dari satu monyet.
sumber
Anda menunjukkan bahwa banyak perangkat lunak tidak menggunakan lebih dari (x) core. Tetapi ini sepenuhnya merupakan batasan yang ditempatkan oleh perancang perangkat lunak itu. PC rumahan yang memiliki banyak inti masih baru (ish) dan mendesain perangkat lunak multi-ulir juga lebih sulit dengan API dan bahasa tradisional.
PC Anda juga tidak hanya menjalankan 1 program itu. Itu melakukan banyak hal lain yang dapat dimasukkan ke core yang kurang aktif sehingga perangkat lunak utama Anda tidak terganggu oleh mereka sebanyak itu.
Saat ini tidak mungkin untuk hanya meningkatkan kecepatan satu core untuk mencocokkan throughput 8 core. Lebih banyak kecepatan kemungkinan harus berasal dari arsitektur baru.
Karena lebih banyak core tersedia dan API dirancang dengan asumsi itu, programmer akan mulai menggunakan core lebih banyak. Upaya membuat desain multi-ulir lebih mudah dilakukan sedang berlangsung. Jika Anda mengajukan pertanyaan ini dalam beberapa tahun, Anda mungkin akan mengatakan "Game saya hanya menggunakan 32 core, jadi mengapa CPU saya memiliki 256?".
sumber
Alasan paling meyakinkan dari sudut pandang historis, adalah disipasi kekuasaan .
Setelah Pentium IV, Intel mencoba mengejar Tejas prosesor generasi berikutnya yang diberi nama kode yang seharusnya berjalan dalam rentang 4 GHz hingga 12 GHz. Masalahnya adalah bahwa berlari pada kecepatan itu menghasilkan terlalu banyak panas untuk bisa hidup.
Setelah Tejas dibatalkan, Intel memerlukan waktu 10 hingga 15 tahun sebelum akhirnya core mereka berjalan pada 4 GHz dengan tingkat panas yang dapat diterima.
Lihat Tejas dan Jayhawk .
Intel memiliki proyek lain yang paralel dengan Tejas yang melibatkan penggunaan beberapa inti. Proyek itu memiliki tingkat panas yang dapat diterima, jadi begitulah caranya. Itu memungkinkan mereka untuk meningkatkan kinerja sekarang daripada menunggu 10 tahun lagi untuk proses pembuatan 10 nm.
Dengan asumsi core tidak kekurangan sumber daya, maka untuk mendapatkan jumlah instruksi yang sama per detik dari satu core, bukan N core, Anda akan membutuhkan tingkat instruksi dari core tunggal menjadi N kali lebih cepat. Disipasi daya dinamis dari inti CPU berbanding lurus dengan frekuensi operasi. Itu juga sebanding dengan kuadrat dari tegangan operasi. Berjalan pada frekuensi yang lebih rendah memungkinkan penggunaan tegangan operasi yang lebih rendah. Menggunakan tegangan yang lebih rendah pada frekuensi yang lebih rendah berarti panas yang dihasilkan secara praktis turun bersama kubus frekuensi operasi.
Contoh ekstremnya adalah otak manusia, yang dapat melakukan operasi yang setara dengan 2 ^ 18 per detik hanya dengan menggunakan daya 20 W. Ini mencapai ini dengan menggunakan miliaran neuron yang berjalan secara paralel dengan hanya beberapa ratus Hz.
Juga perlu diingat bahwa biasanya ada ratusan atau ribuan utas yang berjalan sekaligus pada PC. Sistem operasi menangani alokasi waktu pada inti untuk setiap utas. Jadi, bahkan jika suatu program individu tidak mengambil keuntungan dari semua inti, itu masih menguntungkan karena program-program lain mengambil lebih sedikit waktu CPU-nya jika mereka berjalan pada inti lain.
Jika ada, pasar berkinerja tinggi bergerak ke pemrosesan yang lebih paralel dalam bentuk FPGA. Intel baru-baru ini membeli Altera (produsen FPGA terbesar kedua) dan sekarang menjual papan dengan akselerator perangkat keras FPGA. Perangkat lunak dapat memuat FPGA dengan gambar saat dijalankan menggunakan panggilan API. CPU kemudian memasukkan data ke dalam FPGA dan memungkinkannya melakukan sebagian besar pekerjaan. Jenis aplikasi biasanya encoding video, AI, rendering, pencarian basis data, dll.
sumber
Hanya untuk melengkapi gambaran di mana semua ini terjadi ...
Neural Networks dan AI adalah topik yang sangat panas saat ini. Salah satu alasannya adalah bahwa seseorang dapat secara efisien menggunakan sejumlah besar core sederhana secara paralel dan karenanya mengekstrak mendekati kinerja komputasi maksimum. Persyaratan ini secara inheren paralel dan peta cukup mudah ke array prosesor tanpa banyak komunikasi yang dibutuhkan antara core. Inilah sebabnya mengapa GPU adalah teknologi goto pertama untuk akselerasi AI. Saat ini kami melihat chip dioptimalkan lebih baik daripada GPU video untuk NN yang datang ke pasar. Langkah selanjutnya, atau mungkin final, adalah membuat NN menggunakan teknologi analog seperti memristor.
Dan sebagai tambahan, dalam sesuatu seperti PC gaming ada jauh lebih banyak kinerja mentah dalam kartu grafis daripada multicore Intel atau AMD CPU
sumber
Pada dasarnya, kerugian CMOS secara eksponensial (^ 1,5) sebanding dengan frekuensi dan kinerja CPU paralel agak kurang dari linear sebanding dengan jumlah CPU.
Jadi rasio untuk penghitungan daya ke daya disipasi ditingkatkan untuk aplikasi multi-CPU pada laju jam yang berbeda ketika membandingkan kecepatan vs jumlah CPU untuk disipasi daya tetap.
Ini lebih kompleks dari ini, tetapi ini adalah dasar mengapa CPU paralel lebih baik bang per Watt dalam aplikasi dinamis. Akan selalu ada pengecualian saat dioptimalkan untuk satu skenario.
Bukan ukuran CPU yang lebih besar yang membuatnya lebih cepat untuk aplikasi PC khas Intel / AMD, melainkan ukuran yang diperkecil dari resolusi litograf dan kapasitansi gerbang yang lebih rendah yang mengurangi daya seiring dengan berkurangnya tingkat sub-ambang batas dan tegangan Core.
Peningkatannya tidak linier dan tidak berarti 8 core 4x lebih baik dari 2 tetapi tujuannya jika bertemu adalah untuk memiliki lebih banyak pemrosesan rentang dinamis dengan pelambatan pembuangan daya, kecepatan dan tegangan untuk meningkatkan kinerja dan efisiensi dan daya puncak sesuai permintaan tanpa kenaikan suhu yang berlebihan.
Untuk jawaban yang lebih ilmiah, baca https://www.sciencedirect.com/topics/computer-science/dynamic-power-consumption
sumber
Multicores biasanya tidak multiscalar. Dan core multiscalar bukan multicores.
Ini akan menjadi semacam penemuan sempurna arsitektur multiscalar yang berjalan di beberapa megahertz, tetapi secara umum jembatannya tidak akan memungkinkan konsumen, tetapi mahal sehingga kecenderungannya adalah pemrograman multicore pada frekuensi yang lebih rendah daripada instruksi pendek pada kecepatan clock tinggi.
Beberapa inti instruksi lebih murah dan lebih mudah untuk diperintahkan, dan itu sebabnya itu ide yang buruk memiliki arsitektur multiscalar di beberapa gigahertz.
sumber
vpaddd ymm0, ymm1, ymm2
instruksi per jam, masing-masing melakukan 8 penambahan bilangan bulat 32-bit. Jadi 24 bilangan bulat ditambahkan per jam tetapi mesin eksekusi yang tidak sesuai "hanya" harus melacak 3 instruksi dalam penerbangan. Itu jauh lebih murah untuk membangun daripada CPU yang bisa menjalankan 24add eax, edx
instruksi per jam. SIMD pada dasarnya ortogonal ke lebar pipa.