Bagaimana CPU dapat mengirimkan lebih dari satu instruksi per siklus?

41

Petunjuk Wikipedia per halaman kedua mengatakan bahwa i7 3630QM menghasilkan ~ 110.000 MIPS pada frekuensi 3,2 GHz; itu akan menjadi (110 / 3.2 instruksi) / 4 core = ~ 8.6 instruksi per siklus per inti ?! Bagaimana satu inti dapat memberikan lebih dari satu instruksi per siklus?

Untuk pemahaman saya, saluran pipa hanya bisa memberikan satu hasil per jam.

Ini adalah pikiran saya:

  • Frekuensi internal sebenarnya lebih tinggi dari 3,2 GHz
  • Beberapa bagian CPU tidak sinkron dengan cara yang tidak bisa dipahami oleh manusia yang rendah hati seperti saya
  • Ada beberapa pipa bersamaan per inti
  • Sebuah pipeline dapat mengirimkan lebih dari hasil per jam, sebuah instruksi dapat melewati tahapan pipeline dan ada beberapa prefetcher untuk mengikuti
  • Saya kehilangan sesuatu
tidak bisa bekerja
sumber
1
Ini memberikan 110.000 MIPS Dhrystone , jadi DMIPS, bukan MIPS, adalah sesuatu yang saya lihat secara langsung - mungkin ini bisa membuat perbedaan? Lihat en.wikipedia.org/wiki/Dhrystone

Jawaban:

44

Pertama, seperti komentar Keelan dan jawaban Turbo J menunjukkan, pengukurannya adalah 113.093 MIX Dhrystone bukan MIPS asli .

Mikroarsitektur Ivy Bridge pada i7 3630QM hanya dapat melakukan 4 µop menyatu per siklus, meskipun ia dapat memulai eksekusi 6 µops per siklus. (Jumlah µop yang menyatu dalam jejak kode kira - kira sama dengan jumlah instruksi; beberapa instruksi kompleks didekodekan menjadi beberapa µops yang tidak menyatu dan beberapa pasangan instruksi dapat digabungkan menjadi µop tunggal, misalnya, segera membandingkan diikuti oleh lompatan bersyarat.)

Dua dari spekulasi Anda tentang bagaimana beberapa instruksi dapat dieksekusi dalam satu siklus cukup valid dan telah digunakan dalam prosesor aktual. Spekulasi pertama Anda, bahwa jam internal yang lebih cepat digunakan, digunakan dalam ALU "bola api" Pentium 4 yang asli. ALU ini memiliki frekuensi dua kali lipat dari sisa inti, yang sudah relatif tinggi.

(Ini dicapai dengan menggunakan ALU terhuyung-huyung di mana bagian bawah tambahan dilakukan dalam satu siklus, yang memungkinkan operasi bergantung untuk menggunakan bagian bawah dari hasil dalam siklus berikutnya. Untuk operasi seperti menambah, xor, atau shift kiri yang hanya membutuhkan separuh operan yang lebih rendah untuk menghasilkan separuh yang lebih rendah dari hasilnya, guncangan seperti itu — juga dikenal sebagai pipeline-lebar — memungkinkan latensi hasil siklus tunggal dan juga throughput siklus tunggal.)

Teknik yang agak terkait, cascade ALUs, digunakan oleh HyperSPARC. HyperSPARC memasukkan hasil dari dua ALU menjadi ALU ketiga. Ini memungkinkan dua operasi independen dan bergantung ketiga dijalankan dalam satu siklus tunggal.

Spekulasi Anda bahwa "ada beberapa pipa bersamaan per inti" adalah teknik lain yang telah digunakan. Jenis desain ini disebut superscalar dan sejauh ini merupakan cara yang paling umum untuk meningkatkan jumlah operasi yang dilakukan dalam satu siklus tunggal.

Ada juga beberapa peluang dan akhir eksekusi instruksi lainnya yang mungkin perlu diperhatikan. Beberapa operasi dapat lebih efisien dilakukan di luar unit eksekusi biasa. Teknik penghapusan langkah mengeksploitasi penggunaan pengubahan nama register pada prosesor out-of-order untuk melakukan operasi pemindahan selama pengubahan nama register; langkah ini cukup menyalin nomor register fisik dari satu posisi di tabel penggantian nama (disebut tabel register alias) ke yang lain. Tidak hanya ini secara efektif meningkatkan lebar eksekusi tetapi juga menghilangkan ketergantungan. Teknik ini digunakan awal dengan x87 berbasis stack, tetapi sekarang digunakan secara luas dalam prosesor x86 berkinerja tinggi Intel. (Penggunaan instruksi dua operan yang merusak di x86 membuat penghapusan gerakan lebih bermanfaat daripada di RISC biasa.)

Teknik yang mirip dengan memindahkan eliminasi adalah penanganan instruksi register zeroing selama penggantian nama. Dengan memberikan nama register yang memberikan nilai nol, instruksi kliring register (seperti xor atau kurangi dengan kedua operan menjadi register yang sama) dapat dengan mudah memasukkan nama itu ke dalam tabel penggantian nama (RAT).

Teknik lain yang digunakan oleh beberapa prosesor x86 mengurangi biaya operasi push dan pop. Biasanya sebuah instruksi menggunakan stack pointer harus menunggu siklus penuh untuk push atau pop sebelumnya untuk memperbarui nilai untuk stack pointer. Dengan mengenali bahwa push dan pop hanya menambah atau mengurangi nilai kecil ke stack pointer, seseorang dapat menghitung hasil dari beberapa penambahan / subtaksi secara paralel. Penundaan utama untuk penambahan adalah propagasi carry, tetapi dengan nilai kecil bit yang lebih signifikan dari nilai dasar — ​​dalam hal ini stack pointer — hanya akan memiliki paling banyak satu carry-in. Ini memungkinkan pengoptimalan yang mirip dengan penambah carry-pilih untuk diterapkan pada beberapa tambahan nilai kecil. Selain itu, karena penunjuk tumpukan biasanya hanya diperbarui oleh konstanta,

Dimungkinkan juga untuk menggabungkan instruksi menjadi operasi tunggal yang lebih kompleks. Sementara proses kebalikan dari instruksi pemisahan menjadi beberapa, operasi yang lebih sederhana adalah teknik lama, menggabungkan instruksi (yang disebut Intel sebagai macro-op fusion) dapat memungkinkan implementasi untuk mendukung operasi yang lebih kompleks daripada yang diekspos dalam set instruksi.

Di sisi teoretis, teknik lain telah diusulkan. Konstanta kecil selain nol dapat didukung dalam RAT dan beberapa operasi sederhana yang menggunakan atau secara andal menghasilkan nilai sekecil itu dapat ditangani lebih awal. ("Physical Register Inlining", Mikko H. Lipasti et al., 2004, menyarankan penggunaan RAT sebagai cara untuk mengurangi jumlah register, tetapi gagasan tersebut dapat diperluas untuk mendukung pemuatan dengan segera kecil dan operasi sederhana dalam jumlah kecil.)

Untuk cache penelusuran (yang menyimpan urutan instruksi dengan asumsi aliran kontrol tertentu), dapat ada peluang untuk menggabungkan operasi yang dipisahkan oleh cabang dan menghapus operasi yang menghasilkan hasil yang tidak digunakan dalam penelusuran. Caching optimasi dalam cache jejak juga dapat mendorong dilakukannya optimasi seperti penggabungan instruksi yang mungkin tidak bermanfaat jika harus dilakukan setiap kali aliran instruksi diambil.

Prediksi nilai dapat digunakan untuk meningkatkan jumlah operasi yang dapat dieksekusi secara paralel dengan menghapus dependensi. Prediktor nilai berbasis langkah mirip dengan optimisasi sembulan / dorong dari mesin stack khusus yang disebutkan sebelumnya. Itu dapat menghitung banyak tambahan sebagian besar secara paralel, menghapus serialisasi. Ide umum prediksi nilai adalah bahwa dengan nilai prediksi, operasi dependen dapat berjalan tanpa penundaan. (Arah cabang dan prediksi target secara efektif hanya bentuk prediksi nilai yang sangat terbatas, memungkinkan pengambilan instruksi berikut yang bergantung pada "nilai" cabang — diambil atau tidak — dan alamat instruksi berikutnya, nilai lain.)

Paul A. Clayton
sumber
luar biasa! Terima kasih atas informasi yang berharga. Bisakah Anda menyarankan buku di mana saya bisa membaca semua teknik arsitektur ini?
tidak berfungsi
@ workless Setelah Anda melampaui dasar-dasar pemasangan pipa dan eksekusi superscal out-of-order (yang akan dibahas oleh sebagian besar buku teks arsitektur komputer), sumber terbaik untuk informasi mungkin adalah deskripsi dari mikroarsitektur prosesor spesifik (seperti artikel di Haswell terkait dalam jawaban gnasher729 ) dan makalah akademis (ISCA dan MICRO [konferensi] umumnya memiliki makalah yang bagus; HPCA, PACT, ASPLOS, dan mungkin beberapa yang lain juga memiliki reputasi baik). Andy Glew (mungkin paling terkenal karena karyanya di Pentium Pro) ...
Paul A. Clayton
1
... sedang mengerjakan wiki CompArch, yang akan menyajikan konsep yang lebih maju, tetapi kemajuannya lambat dan tampaknya diretas beberapa waktu lalu dan jadi sekarang hanya memberikan pesan kesalahan ( semipublic.comp-arch.net/wiki ). Dia bermaksud untuk mengembalikan wiki (teks asli telah dilestarikan) menggunakan perangkat lunak wiki yang berbeda (dia memiliki beberapa masalah dengan perangkat lunak yang dia gunakan dan mengambil ini sebagai kesempatan untuk melakukan perbaikan), tetapi "Ini akan lama."
Paul A. Clayton
Contoh yang baik dari keberhasilan arsitektur superscalar adalah Intel HyperThreading - dengan semua optimisasi itu, insinyur Intel menemukan bahwa sekitar 30% ALU tidak digunakan sebagian besar waktu, karena memori tidak dapat mengalir dengan cukup cepat, atau pipa tidak dapat diisi dengan cukup efisien. HyperThreading memungkinkan Anda untuk mendapatkan banyak pekerjaan secara gratis dalam skenario ideal. Ini jauh lebih sedikit daripada memiliki inti baru yang terpisah, tetapi juga jauh lebih murah (dan dapat dikombinasikan dengan multi-inti juga).
Luaan
@ PaulA.Clayton - dua tangkapan halaman itu ada di Wayback. 20 Desember 2013 , dan 14 Februari 2014 . Saya tidak tahu apakah tangkapan itu mendahului masalah dengan halaman. Sayangnya, ketika saya mencoba mengunjungi halaman-halaman itu di Wayback, saya mendapat pesan " Nyebelin. Mesin yang melayani file ini sedang down. Kami sedang mengerjakannya. ", Jadi saya tidak yakin apa yang bisa dilihat di halaman-halaman itu. .
Kevin Fegan
10

Beberapa sihir gelap terjadi di bagian dalam prosesor modern, tetapi pikiran Anda pasti sejalan.

Kunci untuk memahami efisiensi prosesor modern adalah menyadari bahwa mereka superscalar . Dari Wikipedia (penekanan pada saya):

Arsitektur CPU superscalar mengimplementasikan bentuk paralelisme yang disebut paralelisme level-instruksi dalam satu prosesor tunggal. Oleh karena itu memungkinkan throughput CPU yang lebih cepat daripada yang dimungkinkan pada laju clock yang diberikan.

Prosesor modern ini memiliki beberapa unit eksekusi per inti, seperti yang Anda duga. Hyper-threading menarik untuk dipertimbangkan, beberapa bagian dari pipa digandakan tetapi beberapa tidak.

Eksekusi out-of-order juga menarik untuk dibaca, tetapi tidak langsung menjawab pertanyaan Anda. Itu mengurangi jumlah siklus CPU "terbuang".

Efisiensi juga dipengaruhi oleh banyak hal lain yang dapat menyebabkan kios di dalam prosesor, termasuk (tapi jelas tidak terbatas pada):

  • Hasil instruksi sebelumnya tidak tersedia.
  • Tembolok merindukan.
  • Percabangan kode, yang akan membatalkan instruksi yang sudah diambil (baca tentang prediksi cabang di sini dan di sini ).

Kompiler modern mencoba membantu dengan banyak item di atas, prosesor kemudian mengambil alih. Sebagai contoh yang baik lihat pertanyaan ini di tempat lain di Stackexchange, yang menyoroti perbedaan penting antara dua instruksi yang dapat melakukan hal yang sama (dalam beberapa keadaan). Namun satu dapat "lebih cepat" daripada yang lain pada beberapa prosesor karena unit eksekusi digunakan.

Untuk penjelasan yang dapat dibaca manusia tentang pipa CPU modern, lihat Perjalanan melalui pipa CPU . Untuk penjelasan agak lebih teknis lihat Agner Fog ini Microarchitecture kertas.

David
sumber
terima kasih atas penjelasan dan tautannya yang sangat menarik. Sebagai catatan Cell terlihat sangat menarik, saya menantikan untuk mempelajari lebih lanjut tentang arsitektur cpu ^ _ ^. "" X86 menggunakan "superpipeline" seperti dijelaskan di atas. Keluarga Cell menggunakan pendekatan "sinergis" yang melibatkan sembilan mini-cpus. Memang benar bahwa setiap mini-cpu mengikuti sebagian besar saluran pipa yang dipesan, mini-cpus memiliki beberapa pipa superscalar paralel daripada satu pipa tunggal. "" "
workless
3

Apa yang Anda pikirkan terjadi: Semua insinyur di Intel, AMD, dan IBM membaca bahwa sebuah pipa hanya dapat memberikan satu hasil per siklus, dan mereka berkata "oh well, begitulah, tidak bisa membuat prosesor ini lebih cepat". Atau apakah mereka membaca ini dan berkata: "Tidak dapat memberikan lebih dari satu hasil per siklus? Kita akan melihat tentang itu!".

Sebagai pengantar yang bagus untuk arsitektur Haswell misalnya Anda dapat mengikuti tautan ini http://www.realworldtech.com/haswell-cpu/ atau Anda bisa langsung pergi ke situs web Intel dan Anda akan menemukan sedikit dokumentasi di sana.

Setiap inti dari prosesor Haswell memiliki sejumlah besar unit eksekusi, yang dapat melakukan operasi independen satu sama lain, sehingga beberapa operasi dapat dilakukan secara paralel. Selanjutnya, prosesor Haswell memiliki beberapa unit eksekusi yang menangani operasi vektor hingga 256 bit. Operasi vektor misalnya dapat melakukan empat operasi floating point presisi ganda atau delapan operasi floating point presisi tunggal dalam satu operasi vektor. Dan akhirnya, prosesor Haswell mendukung "penggandaan multiply-add", yang berarti menghitung kali b plus c hanya satu operasi.

Maksimum teoretis, karena Haswell memiliki dua unit yang mampu menggabungkan-tambah multipel, adalah dua operasi tambah-tambah gabungan per siklus, masing-masing operasi melakukan delapan perkalian presisi tunggal plus penambahan, atau 32 operasi floating-point presisi tunggal.

Prosesor 3630 tidak ada dalam daftar harga terbaru Intel, tetapi ada model seperti 3740QM dengan empat inti. Jadi, alih-alih 32, Anda bisa mendapatkan 128 operasi floating-point per siklus clock. Ini adalah maksimum teoretis. Mencapai setengah dari itu dalam kehidupan nyata adalah sebuah tantangan, tetapi bukan tidak mungkin untuk tugas yang sesuai. Ada prosesor lain yang tersedia dengan hingga 15 core (untuk harga yang bahkan fanatik game fanatik tidak akan membayar).

Jadi, Anda memiliki kombinasi beberapa pengganda:

  1. Beberapa core per prosesor.
  2. (Hyperthreading, tidak disebutkan sebelumnya, memungkinkan Anda untuk lebih dekat ke batas teoritis)
  3. Operasi multiply-add yang digabungkan melakukan dua operasi aritmatika yang hanya dihitung sebagai satu.
  4. 256-bit vektor melakukan 8 operasi hanya menghitung sebagai satu.
  5. Dua unit eksekusi vektor yang mampu menangani penambahan fused-multiply.

8.6 operasi per siklus tidak terlalu sulit untuk dicapai. Bahkan 8,6 operasi per siklus per inti tidak terlalu sulit.

gnasher729
sumber
Saya bertanya-tanya apakah akan praktis atau menguntungkan untuk merancang CPU dengan beberapa core yang menjalankan x86 dan beberapa yang menjalankan set instruksi yang dioptimalkan untuk perilaku superscalar. Saya tahu Intel dan AMD melakukan beberapa hal yang sangat luar biasa untuk mengatasi keterbatasan dalam set instruksi x86, tetapi dalam beberapa kasus saya akan berpikir bahwa mengetahui beberapa hal yang tidak dapat diungkapkan oleh set instruksi saat ini akan sangat membantu. Sebagai contoh, versi ADDinstruksi yang berbeda berdasarkan pada apakah overflow harus dibiarkan tidak terpengaruh, atau harus ditetapkan ketika overflow terjadi (dan dibiarkan diatur jika tidak).
supercat
1
Saya merasa sedih bahwa di zaman sekarang ini, banyak bahasa default untuk tidak memeriksa overflow. Saya tahu bahwa Java cukup macet oleh persyaratan semantik, tetapi dalam bahasa seperti C # yang mencakup operator aritmatika trapping dan non-trapping, satu-satunya alasan bagus saya melihat untuk tidak menjebak overflow adalah karena kita memerlukan perilaku pembungkus. Saat ini, pengecekan overflow dapat memberikan penalti kecepatan yang signifikan, tetapi jika bahasa mesin dirancang berdasarkan gagasan bahwa perangkap overflow tidak perlu tepat selama kode dapat memastikan bahwa tidak ada overflow yang terjadi sebelum operasi ...
supercat
... mencapai titik-titik kritis tertentu, seharusnya memungkinkan untuk mengurangi overhead perangkap-terperangkap menjadi hampir nol. Jika kode melakukan perhitungan, dan kemudian menyimpan nilai ke lokasi yang akan ditinggalkan jika perhitungan pertama meluap, seharusnya tidak perlu menunda toko sampai prosesor tahu apakah perhitungan pertama berhasil, tetapi prosesor saat ini tidak memiliki cara mengetahui itu. Jika kode dapat dengan mudah melakukan semua operasi yang dapat dilakukan dengan aman apakah terjadi overflow atau tidak, dan kemudian periksa apakah ada overflow yang tidak patut terjadi pada salah satu dari mereka ...
supercat
... yang sepertinya akan membantu mengurangi ketergantungan eksekusi.
supercat
2

Patokan Drystone berasal dari tahun 1984, dan mesin MIX VAX nominal 1 yang sesuai tidak sangat efisien dalam hal modern. Bahkan Cortex M3 menghasilkan 1,25 DMPIS / MHz.

Prosesor Intel Core memang bisa menjalankan banyak instruksi secara paralel dalam satu inti, karena ada banyak unit komputasi yang hadir.

Turbo J
sumber
1

Saya belajar sangat banyak dari artikel karya Ars Technica, Jon "Hannibal" Stokes, yang sangat bagus dan ekstensif tentang arsitektur mikroprosesor. Artikel-artikelnya sedikit bertanggal (tampaknya berasal dari sekitar 2004), tetapi masih sangat relevan.

Beberapa tautan ke bagian selanjutnya dari sebuah artikel rusak, namun sepertinya Anda dapat memperbaikinya sendiri dengan membandingkan URL bagian pertama dan URL yang rusak pada halaman berikutnya (misalnya menambahkan suatu tempat m-di URL).

(ya, ini adalah jawaban tautan saja yang dimuliakan, maaf; artikelnya terlalu bagus untuk tidak menyebutkannya)

marcelm
sumber