Mengapa Anda tidak dapat memiliki instruksi tinggi per siklus dan kecepatan clock tinggi?

37

Mitos Megahertz menjadi taktik promosi karena perbedaan antara prosesor INTEL 8086 PC dan prosesor Rockwell 6502 Apple. The 8086 berlari pada 4,77MHz sedangkan 6502 berlari pada 1MHz. Namun, instruksi pada 6502 membutuhkan lebih sedikit siklus; sehingga lebih sedikit, pada kenyataannya, itu berjalan lebih cepat daripada 8086. Mengapa beberapa instruksi memerlukan siklus lebih sedikit? Dan mengapa tidak dapat instruksi 6502, yang membutuhkan siklus lebih sedikit, dikombinasikan dengan prosesor bersepeda cepat 8086?

Artikel Wikipedia untuk instruksi per siklus (IPC) mengatakan

Faktor-faktor yang mengatur IPC
Level instruksi tertentu per detik dapat dicapai dengan IPC tinggi dan kecepatan clock rendah ... atau dari IPC rendah dan kecepatan clock tinggi.

Mengapa Anda tidak dapat memiliki instruksi tinggi per siklus dan kecepatan clock tinggi?

Mungkin ini ada hubungannya dengan apa itu clock cycle? Wikipedia menyebutkan sinkronisasi sirkuit? Tidak yakin apa artinya itu.

Atau mungkin ini ada hubungannya dengan cara kerja pipa? Saya tidak yakin mengapa instruksi dalam pipa pendek berbeda dari instruksi dalam pipa panjang.

Wawasan apa pun akan luar biasa! Hanya berusaha memahami arsitektur di balik mitos tersebut. Terima kasih!

Referensi:

Instruksi per Siklus vs. Jumlah Siklus yang Ditingkatkan

http://en.wikipedia.org/wiki/Instructions_per_cycle

http://en.wikipedia.org/wiki/Clock_cycle

dobus
sumber
1
> Mengapa beberapa instruksi memerlukan siklus yang lebih sedikit? RISC / CISC (well, semacam ). Dan mengapa tidak dapat instruksi 6502, yang membutuhkan siklus lebih sedikit, dikombinasikan dengan prosesor bersepeda cepat 8086? Mereka dapat dan memiliki. Masalahnya adalah bahwa begitu Anda telah membangun sebuah pangkalan, sulit untuk membuang segalanya dan memulai model berikutnya dari awal.
Synetech
@Synetech, intel agak melakukan itu dengan menghadirkan instruksi CISC yang diatur ke programmer, kemudian mengubahnya menjadi instruksi RISCier pada chip
soandos
Nah ketika saya mengatakan bahwa keduanya telah digabungkan, maksud saya oleh pembuat chip yang sama sekali berbeda. Saya tidak memiliki daftar, tetapi ada orang lain (non-Intel / AMD) yang telah melakukan hal-hal seperti itu. (Kebanyakan orang lupa bahwa ada banyak pembuat chip karena Intel dan AMD sekarang mendominasi pasar desktop.)
Synetech

Jawaban:

21

tl; dr

Pipa yang lebih pendek berarti kecepatan clock yang lebih cepat, tetapi dapat mengurangi throughput. Juga, lihat jawaban # 2 dan 3 di bagian bawah (mereka pendek, saya janji).

Versi lebih panjang:

Ada beberapa hal yang perlu dipertimbangkan di sini:

  1. Tidak semua instruksi memakan waktu yang sama
  2. Tidak semua instruksi bergantung pada apa yang dilakukan segera (atau bahkan sepuluh atau dua puluh) instruksi kembali

Saluran pipa yang sangat disederhanakan (apa yang terjadi pada chip Intel modern sangat kompleks) memiliki beberapa tahap:

Fetch -> Decode -> Memory Access -> Execute -> Writeback -> Pembaruan program counter

Di setiap -> ada biaya waktu yang dikeluarkan. Selain itu, setiap centang (siklus jam), semuanya bergerak dari satu tahap ke tahap berikutnya, sehingga tahap paling lambat Anda menjadi kecepatan untuk SEMUA tahap (ini benar-benar membayar mereka untuk memiliki panjang yang sama).

Katakanlah Anda memiliki 5 instruksi, dan Anda ingin menjalankannya (gambar diambil dari wikipedia, di sini pembaruan PC belum selesai). Akan terlihat seperti ini:

masukkan deskripsi gambar di sini

Meskipun setiap instruksi membutuhkan 5 siklus clock untuk menyelesaikan, instruksi yang selesai keluar dari pipa setiap siklus. Jika waktu yang dibutuhkan untuk masing-masing tahap adalah 40 ns, dan 15 ns untuk bit-bit antara (menggunakan enam tahap pipeline saya di atas), akan membutuhkan 40 * 6 + 5 * 15 = 315 ns untuk mengeluarkan instruksi pertama.

Sebaliknya, jika saya benar-benar menghilangkan pipa (tetapi menjaga semuanya tetap sama), hanya perlu 240 ns untuk mengeluarkan instruksi pertama. (Perbedaan kecepatan untuk mengeluarkan instruksi "pertama" ini disebut latensi. Secara umum kurang penting dibandingkan dengan throughput, yang merupakan jumlah instruksi per detik).

Namun perbedaan sebenarnya adalah bahwa dalam contoh pipelined, saya mendapatkan instruksi baru (setelah yang pertama) setiap 60 ns. Dalam yang non-pipa, dibutuhkan 240 setiap kali. Ini menunjukkan bahwa jaringan pipa bagus dalam meningkatkan throughput.

Mengambil langkah lebih jauh, akan terlihat bahwa pada tahap akses memori, saya akan memerlukan unit tambahan (untuk melakukan perhitungan alamat). Itu berarti bahwa jika ada instruksi yang tidak menggunakan tahap mem siklus itu, maka saya bisa melakukan penambahan lain. Jadi saya dapat melakukan dua tahap eksekusi (dengan satu berada di tahap akses memori) pada satu prosesor dalam satu centang (penjadwalan adalah mimpi buruk, tapi jangan pergi ke sana. Selain itu, tahap pembaruan PC juga akan membutuhkan unit tambahan di kasus lompatan, jadi saya bisa melakukan tiga tambahan mengeksekusi negara dalam satu centang). Dengan memiliki saluran pipa, dapat dirancang sedemikian rupa sehingga dua (atau lebih) instruksi dapat menggunakan tahapan yang berbeda (atau tahapan leapfog, dll), menghemat waktu yang berharga.

Perhatikan bahwa untuk melakukan ini, prosesor melakukan banyak "sihir" ( eksekusi di luar urutan , prediksi cabang , dan banyak lagi), tetapi ini memungkinkan banyak instruksi keluar lebih cepat daripada tanpa pipa (perhatikan bahwa pipa yang terlalu lama sangat sulit untuk dikelola, dan menimbulkan biaya yang lebih tinggi hanya dengan menunggu antar tahap). Sisi sebaliknya adalah bahwa jika Anda membuat pipa terlalu lama, Anda bisa mendapatkan kecepatan jam gila, tetapi kehilangan banyak manfaat asli (memiliki jenis logika yang sama yang dapat ada di banyak tempat, dan digunakan pada waktu yang sama ).

Jawaban # 2:

Prosesor SIMD (satu instruksi beberapa data) (seperti kebanyakan GPU) melakukan banyak pekerjaan pada banyak bit informasi, tetapi membutuhkan lebih lama untuk melakukannya. Membaca semua nilai membutuhkan waktu lebih lama (berarti jam lebih lambat, meskipun ini diimbangi dengan memiliki bus yang jauh lebih luas sampai batas tertentu) tetapi Anda bisa mendapatkan lebih banyak instruksi dilakukan sekaligus (instruksi lebih efektif per siklus).

Jawaban # 3:

Karena Anda dapat "menipu" secara artifisial memperpanjang jumlah siklus sehingga Anda dapat melakukan dua instruksi setiap siklus (cukup membagi dua kecepatan clock). Dimungkinkan juga untuk hanya melakukan sesuatu setiap dua kutu sebagai lawan satu (memberikan kecepatan 2x jam, tetapi tidak mengubah instruksi satu detik).

soando
sumber
3
Pipa pendek berarti kecepatan jam lebih lambat ! Pentium 4 memiliki jam tinggi karena jaringan pipa yang panjang, inilah WP: "NetBurst berbeda dari P6 (Pentium III, II, dll.) Dengan menampilkan pipa instruksi yang sangat dalam untuk mencapai kecepatan clock yang sangat tinggi". Intinya adalah Anda melakukan sedikit per tahap untuk mencapai kecepatan tinggi. Ini tidak terbukti bisa diterapkan, dan Intel kehilangan momentum besar untuk AMD karena ini. Mereka kembali ke arsitektur Pentium 3, dan muncul dengan "Core".
stolsvik
@stolsvik, bisakah Anda menjelaskan ini? Tidak masuk akal bagi saya (memiliki tahap interstitial yang kurang berarti semua yang lain sama, siklus clock akan lebih pendek, memberikan kecepatan clock yang lebih tinggi)
soandos
4
Satu tahap pipa dilakukan per siklus clock ; Seluruh pipa bergerak satu langkah per jam - mengambil instruksi baru di bagian bawah, "memancarkan" instruksi selesai di bagian atas. Oleh karena itu, ide dengan Pentium4 adalah membuat langkah-langkah sangat kecil yang cepat dilakukan, memberikan jam tinggi, tetapi dengan demikian membutuhkan saluran pipa yang panjang. Petunjuk dengan pipeline (semua prosesor menggunakan satu) adalah bahwa Anda memiliki beberapa instruksi yang sedang diproses saat ini. Pipa panjang berarti banyak instruksi sedang berlangsung - dan jika prediksi cabang gagal, maka Anda harus menyiram keseluruhan pipa.
stolsvik
Untuk jawaban Anda # 2, CPU hanya mengakses data melalui cache (akses memori biasanya transparan dari perspektif instruksi). Memperlambat frekuensi jam tidak akan mempengaruhi berapa lama data akan diambil dari RAM (jika tidak ada dalam cache). Juga, lebar bus hanya mempengaruhi kecepatan operasi SIMD relatif terhadap ukuran operan Anda (yaitu saya dapat memuat 8 operan 8-bit pada bus 64-bit sekaligus, tetapi saya masih harus memuat secara manual 8 nilai 64-bit jika saya memiliki operan 64-bit).
Terobosan
2
Juga untuk jawaban # 1, ketika Anda mengatakan "jika ada instruksi yang tidak menggunakan tahap mem siklus itu, maka saya bisa melakukan penambahan lain", ini salah. Eksekusi out of order diterapkan pada level instruksi, bukan level operasi mikro. Jika instruksi memang membutuhkan dua eksekusi dalam pipa, ini akan menyebabkan gelembung di pipa . Terakhir, arsitektur x86 memiliki ALU terpisah untuk menghitung alamat memori dengan cepat saat memori membaca / menulis (memungkinkan untuk [EBX+ECX*4+100]pengalamatan gaya).
Terobosan
8

Saya terlalu menyederhanakan hal ini, tetapi poin penting yang perlu diingat adalah bahwa istilah ini membandingkan apel dengan jeruk. "Siklus" bukan unit pengukuran tunggal yang sama di semua prosesor, seperti "kedua" adalah pengukuran waktu yang disatukan. Alih-alih, sebuah siklus mewakili unit kerja tertentu, yang didefinisikan agak sewenang-wenang tetapi dibatasi oleh kompleksitas desain pipa dan tentu saja oleh fisika.

Dalam banyak kasus, melakukan banyak pekerjaan dalam satu siklus dapat memungkinkan Anda untuk menghapus seluruh pipa. Jika berhasil, ini berarti bahwa siklus Anda berikutnya tidak akan dioptimalkan karena Anda harus mengisi saluran pipa lagi, yang dapat memakan waktu.

Saya dapat merancang prosesor yang sangat sederhana yang memproses satu tahap dari satu instruksi RISC setiap siklus, dan jika ini adalah dasar dari CPU saya, saya mungkin dapat mencapai siklus yang sangat, sangat tinggi per detik karena berkurangnya kompleksitas dari apa yang merupakan "a siklus ".

Detailnya masuk ke banyak bidang fisika dan teknik listrik yang tidak terlalu saya mengerti, tetapi ingat bahwa clock rate tidak tercapai hanya dengan menambahkan secara naif tegangan input ke prosesor dan berharap yang terbaik. Paling tidak, profil termal adalah masalah lain yang perlu.

allquixotic
sumber
Ini tidak benar-benar menjawab pertanyaannya (yang tidak ada hubungannya dengan mengapa hal-hal tidak bisa dipercepat). Dia bertanya berapa banyak siklus! = Lebih banyak pekerjaan setiap saat
soandos
Namun jawaban ini membahas masalah yang tidak saya lihat dalam jawaban lain, yaitu berbicara tentang masuknya set instruksi tertentu yang menyelesaikan operasi pada siklus clock yang lebih sedikit dan kemampuan untuk mengukur siklus clock berdasarkan pada set instruksi paling lambat yang mungkin tidak seefisien itu. (Saya bisa saja sangat salah ... Saya menemukan arsitektur menarik tetapi saya tidak akan menganggap diri saya seorang ahli dengan cara apa pun)
Stephen R
5

Berikut ini penjelasan yang sangat sederhana (mungkin terlalu disederhanakan): Katakanlah Anda memiliki pekerjaan tertentu, katakan tambahkan dua angka 32-bit. Anda dapat mengambil dua pendekatan. Anda dapat membaginya menjadi sejumlah besar langkah yang sangat kecil atau Anda dapat membaginya menjadi sejumlah kecil langkah yang sangat besar.

Misalnya, Anda bisa mengatakan "tambahkan dua angka". Sekarang Anda hanya memiliki satu langkah. Tetapi langkah itu memiliki beberapa bagian dan akan memakan waktu lebih lama untuk dilakukan. Jadi, Anda memiliki instruksi tinggi per siklus - satu dalam hal ini. Tetapi kecepatan jam Anda tidak bisa tinggi karena ada banyak hal yang harus Anda lakukan dalam siklus itu.

Anda bisa juga mengatakan, "Ambil nomor pertama ke dalam register. Kemudian ambil nomor kedua. Kemudian tambahkan bit paling tidak signifikan. Kemudian tambahkan bit paling tidak signifikan kedua dengan carry dari sebelumnya. Kemudian tambahkan ketiga paling sedikit ... Kemudian tambahkan bit yang paling signifikan. Jika ada carry, atur flag overflow. Kemudian tulis hasilnya ke memori. " Sekarang Anda memiliki banyak langkah. Tetapi setiap langkah bisa sangat cepat. Jadi Anda memiliki instruksi rendah per siklus (1/36 atau lebih dalam hal ini). Tetapi kecepatan jam Anda bisa sangat tinggi karena setiap siklus hanya memiliki sedikit yang harus dilakukan.

Untuk memiliki instruksi tinggi per siklus dan kecepatan clock tinggi, Anda harus membagi instruksi yang kompleks menjadi sejumlah kecil langkah yang sangat sederhana. Tetapi itu tidak bisa dilakukan karena instruksinya kompleks.

Pengorbanan dan jumlah siklus spesifik yang sebenarnya sangat berbeda karena CPU modern merupakan instruksi yang disingkat dan tumpang tindih. Tapi ide dasarnya benar.

David Schwartz
sumber
2

Anda dapat memiliki instruksi tinggi per siklus dan kecepatan clock tinggi. Di mana Anda mengalami batas adalah ketika penundaan propagasi sirkuit digital melebihi lebar pulsa satu siklus clock. Ini dapat diatasi dengan meningkatkan tegangan CPU, tetapi harus dicatat bahwa ini akan meningkatkan konsumsi daya (dan dengan demikian, panas hilang).

Jadi, jika Anda menginginkan kecepatan clock yang lebih cepat, Anda harus meningkatkan voltase (meningkatkan kecepatan drift elektron ) untuk mengurangi penundaan propagasi. Jika keterlambatan ini melebihi siklus clock, CPU kemungkinan besar tidak akan berperilaku seperti yang diharapkan, dan perangkat lunak yang berjalan di atasnya akan crash atau melempar pengecualian. Jelas ada batas untuk tegangan yang dapat Anda jalankan melalui prosesor, dan ini ditentukan oleh desain CPU itu sendiri - terutama, kapasitas arus listrik internal.


Pipelining memungkinkan kecepatan clock yang lebih tinggi dalam beberapa kasus, karena setiap instruksi dibagi menjadi beberapa "operasi mikro" yang lebih kecil. Operasi mikro ini adalah operasi yang sangat sederhana, menggunakan sirkuit yang jauh lebih kecil yang saling berhubungan dalam rantai (dalam arti fisik, semakin sedikit jarak yang dibutuhkan elektron untuk bepergian, semakin pendek penundaan propagasi melalui sub-unit tertentu).

Keuntungan tambahan untuk CPU pipelined adalah Anda dapat sangat meningkatkan jumlah instruksi yang dieksekusi per unit-waktu, dengan mengorbankan desain yang lebih kompleks.

Adapun mengapa beberapa instruksi memerlukan lebih atau kurang siklus, itu tergantung pada instruksi apa yang Anda jalankan. Misalnya, dalam set instruksi x86, ada MOVSinstruksi yang dapat memindahkan seluruh string dalam memori dari satu tempat ke tempat lain. Jelas, Anda tidak bisa secara instan menyalin string panjang, tetapi Anda bisa dengan menyalinnya kata demi kata, dengan mengambil beberapa siklus jam. Dengan demikian, MOVSinstruksi membutuhkan waktu yang bervariasi (tergantung pada jumlah karakter yang akan disalin).

Efek dari operasi multi-siklus kurang terlihat pada desain RISC (yaitu ARM) dibandingkan dengan desain CISC (yaitu x86). Ini karena desain berbasis RISC hanya akan memiliki operasi dasar yang paling umum digunakan, dan jauh lebih mudah untuk disalurkan dengan cara mencapai throughput satu instruksi per siklus.

Penerobosan
sumber
1

Berapa lama komputer Anda untuk menyelesaikan tugas tertentu tidak tergantung pada kecepatan jam komputer ... itu tergantung pada bagaimana unit komputasi dirancang dan direkayasa.

Kecepatan clock sebenarnya adalah (kurang lebih) keputusan sewenang-wenang yang dibuat oleh perancang CPU, kadang-kadang karena alasan yang baik (efisiensi), kadang-kadang untuk yang buruk (iklan).

Katakanlah CPU yang diberikan memiliki campuran instruksi yang membutuhkan waktu antara 1 dan 100 nanodetik (ns) untuk diselesaikan. Anda dapat mengatur clock rate sedemikian rupa sehingga 1 "tick" adalah 100 ns (10 MHz), artinya setiap instruksi akan menyelesaikan tepat 1 tick. Namun, jika waktu pelaksanaan instruksi didistribusikan secara merata, ini berarti bahwa unit komputasi Anda akan menganggur 50% dari waktu (kecepatan eksekusi rata-rata adalah 50ns, meninggalkan 50ns lainnya dari tick tick idle). Sebaliknya, jika Anda menetapkan kutu Anda menjadi 10ns, instruksi akan berkisar antara 1 dan 10 tick, tetapi unit tidak akan pernah menganggur lebih dari 9ns sebelum instruksi berikutnya dimulai, dan rata-rata idle adalah 5ns.

Selama pengembangan, CPU akan dirancang untuk berjalan pada kecepatan tertentu, berdasarkan pada seberapa banyak pekerjaan yang sebenarnya mampu dilakukan oleh CPU. Jika Anda menaikkan atau menurunkan kecepatan clock, Anda tidak benar-benar mengubah jumlah pekerjaan yang dapat dilakukan CPU, Anda hanya mengacaukan rasio efisiensi itu.

(Dan sebelum Anda menangis tentang overclocking CPU: ini memberi Anda dua keuntungan yang menghasilkan keuntungan kecepatan dunia nyata: instruksi eksekusi cepat (yang memakan waktu kurang dari 1 siklus) berakhir dengan waktu eksekusi yang lebih cepat, dan semua instruksi memiliki waktu idle yang lebih sedikit. Keduanya ini sebenarnya bisa meningkatkan jumlah pekerjaan yang dapat dilakukan komputer Anda, tetapi Anda akan menemukan bahwa overclocking CPU sebesar X% tidak selalu sama dengan peningkatan X% dalam pekerjaan yang dilakukan saat Anda membandingkannya.)

TL; DR

CPU dapat menyelesaikan pekerjaan X dalam sedetik. Jika Anda menggunakan kecepatan jam H dan I IPC, kami memiliki I = X / H. Mengubah H tidak mengubah X, tetapi berbanding terbalik mempengaruhi saya.

Benjamin Chambers
sumber
1
Kecepatan clock jauh dari keputusan sewenang-wenang. Itu perlu dipilih dengan hati-hati sebagai fungsi dari tegangan pasokan CPU, serta panjang jejak IC (untuk menghindari keterlambatan propagasi yang berlebihan).
Terobosan
Saya pikir Anda melewatkan fakta bahwa CPU adalah sirkuit digital yang sinkron . Instruksi tidak mengambil X nanodetik (dengan asumsi siklus clock Anda kurang dari penundaan propagasi), semuanya terjadi pada naik atau turunnya clock edge - atau keduanya. Instruksi mengambil siklus X, bukan X unit waktu. Ya, Anda dapat memodifikasi berapa lama suatu siklus, tetapi perbedaannya adalah apa yang terjadi ketika. Dan terakhir, jumlah pekerjaan yang dapat dilakukan CPU dalam sedetik adalah fungsi kecepatan clock, jadi rumus Anda tidak benar-benar lihat di sini.
cp2141
CPU adalah penggabungan sinkron dari beberapa unit asinkron. Kutu jam digunakan untuk mengatur berbagai hal dengan baik, tetapi mereka tidak menentukan berapa lama waktu eksekusi ... Misalnya, penambahan bilangan bulat akan memakan waktu tertentu berdasarkan seberapa jauh arus harus melalui CPU dan seberapa cepat transistor akan beralih status. Hasilnya adalah BACA pada tick jam berikutnya, tetapi perhitungan yang sebenarnya dilakukan secara tidak sinkron sepanjang tick.
Benjamin Chambers
0

Seseorang tidak dapat memiliki instruksi tinggi per siklus dan kecepatan clock tinggi karena persyaratannya saling bertentangan.

Orang dapat menunjukkan bahwa, dalam perkiraan pertama, IPC tergantung pada kompleksitas (A) dari desain

IPC = a sqrt (A)

sedangkan frekuensi maks (F) dapat dicapai oleh skala desain sebagai [1]

F = 1 / {b + c sqrt (A)}

dengan parameter a, b dan c.

Jadi meningkatkan kompleksitas muarch meningkatkan IPC dengan mengorbankan mengurangi frekuensi kerja, sedangkan mengurangi kompleksitas meningkatkan frekuensi dengan mengorbankan IPC. Ini sesuai dengan dua kasus ekstrem yang disebutkan dalam artikel wikipedia, tetapi wikipedia gagal menyebutkan nama: Brainiac dan speed-demon.

  • Desain Brainiac: IPC tinggi dan frekuensi rendah
  • Desing Kecepatan-iblis: Frekuensi tinggi dan IPC rendah.

[1] Beberapa penulis mengklaim ekspresi untuk frekuensi adalah "1 / {b + c A}" sebagai gantinya, tetapi dalam kedua kasus peningkatan kompleksitas mengurangi frekuensi maksimum yang dapat dicapai.

juanrga
sumber