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
Jawaban:
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:
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:
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).
sumber
[EBX+ECX*4+100]
pengalamatan gaya).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.
sumber
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.
sumber
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
MOVS
instruksi 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,MOVS
instruksi 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.
sumber
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.
sumber
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.
[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.
sumber