Pernah penasaran bagaimana sebuah prosesor bisa menjalankan banyak instruksi dalam waktu yang sangat singkat? Ketika membuka aplikasi, memutar video, menjalankan browser, atau bermain game, CPU sebenarnya sedang menangani begitu banyak instruksi.
Salah satu teknik yang membantu CPU melakukan pekerjaan tersebut adalah Superscalar Processor.
Superscalar memungkinkan sebuah CPU untuk mengeksekusi lebih dari satu instruksi dalam satu siklus clock, selama instruksi tersebut siap dijalankan dan tidak memiliki ketergantungan yang menghalangi. Kemampuan ini membuat CPU dapat memanfaatkan beberapa unit eksekusi secara bersamaan.
Namun, CPU tidak asal menjalankan semua instruksi secara bersamaan. Ada proses panjang untuk mengambil instruksi, membaca dependency, menentukan resource yang digunakan, menjadwalkan instruksi, hingga memastikan hasil akhirnya tetap benar.
Pada artikel ini, kita akan membahas bagaimana superscalar processor menjalankan banyak instruksi sekaligus dengan cara yang mudah dipahami.
Apa Itu Superscalar Processor?
Superscalar processor adalah desain CPU yang memungkinkan beberapa instruksi dieksekusi secara paralel dalam satu siklus clock menggunakan beberapa execution unit.
Pada prosesor dengan kemampuan superscalar, CPU tidak hanya memiliki satu jalur eksekusi.
Misalnya terdapat beberapa execution unit:
CPU
│
┌──────┼──────┐
↓ ↓ ↓
ALU FPU Load/Store
│ │ │
└──────┼──────┘
↓
Hasil Eksekusi
Setiap unit dapat menangani jenis pekerjaan tertentu.
Contohnya:
- ALU untuk operasi integer dan logika
- FPU untuk operasi floating point
- Load/Store Unit untuk membaca dan menulis data
- Branch Unit untuk menangani instruksi percabangan
Dengan beberapa unit tersebut, CPU memiliki peluang untuk mengerjakan beberapa instruksi secara bersamaan.
Mengapa CPU Perlu Menjalankan Banyak Instruksi Sekaligus?
CPU bekerja dengan sangat banyak instruksi.
Jika CPU hanya menjalankan satu instruksi pada satu waktu, beberapa execution unit mungkin tidak digunakan secara maksimal.
Misalnya:
Instruksi A → ALU
Instruksi B → FPU
Instruksi C → Load/Store
Jika CPU mampu menjalankan ketiganya secara paralel dan tidak ada dependency yang menghalangi, resource CPU dapat digunakan dengan lebih efisien.
Konsep inilah yang menjadi salah satu alasan mengapa desain superscalar dikembangkan.
Tujuannya bukan sekadar membuat CPU “bekerja lebih cepat”, tetapi memanfaatkan sebanyak mungkin peluang parallelism yang tersedia dalam instruksi program.
Bagaimana Superscalar Processor Menjalankan Banyak Instruksi?
Secara sederhana, prosesnya dapat digambarkan seperti:
Fetch
↓
Decode
↓
Dispatch
↓
Check Dependency
↓
Schedule
↓
Execute
↓
Write Back
↓
Retire
Mari kita lihat setiap tahapnya.
1. CPU Mengambil Beberapa Instruksi
Langkah pertama adalah Instruction Fetch.
CPU mengambil instruksi dari instruction cache atau sumber instruksi lainnya.
Pada prosesor superscalar, CPU memiliki kemampuan untuk mengambil beberapa instruksi dalam satu waktu.
Misalnya:
Instruksi A
Instruksi B
Instruksi C
Instruksi D
Instruksi tersebut kemudian masuk ke bagian berikutnya untuk diproses.
Kemampuan mengambil beberapa instruksi ini membantu menyediakan instruksi yang cukup untuk mengisi execution pipeline.
2. CPU Menerjemahkan Instruksi
Setelah instruksi diambil, CPU melakukan Instruction Decode.
Pada tahap ini, CPU menentukan apa yang harus dilakukan oleh masing-masing instruksi.
Contohnya:
Instruksi A → Penjumlahan
Instruksi B → Perkalian
Instruksi C → Load data
Instruksi D → Percabangan
CPU juga mengetahui data dan resource apa yang dibutuhkan.
3. CPU Memeriksa Ketergantungan Instruksi
Tidak semua instruksi dapat langsung dijalankan secara bersamaan.
CPU harus memeriksa apakah ada dependency antar-instruksi.
Contohnya:
A = B + C
D = A + E
Instruksi kedua membutuhkan hasil dari instruksi pertama.
Karena itu, CPU tidak bisa sembarangan menjalankan keduanya secara bersamaan.
Berbeda dengan:
A = B + C
D = E + F
Instruksi tersebut tidak bergantung satu sama lain sehingga terdapat peluang untuk menjalankannya secara paralel.
4. CPU Menentukan Instruksi yang Siap
Setelah dependency diperiksa, CPU menentukan instruksi mana yang sudah siap dijalankan.
Misalnya:
Instruksi A → Menunggu data
Instruksi B → Siap
Instruksi C → Siap
Instruksi D → Menunggu A
CPU dapat memilih:
Instruksi B → Execute
Instruksi C → Execute
sementara A dan D masih menunggu.
Pada prosesor yang mendukung Out-of-Order Execution, instruksi yang sudah siap dapat dijalankan lebih dahulu meskipun posisinya berada setelah instruksi yang sedang menunggu.
Inilah salah satu mekanisme yang membuat superscalar processor dapat memanfaatkan execution unit dengan lebih maksimal.
5. Instruksi Dikirim ke Execution Unit
Instruksi yang sudah siap kemudian dikirim ke unit eksekusi yang sesuai.
Contohnya:
Instruksi A → Integer ALU
Instruksi B → Floating Point Unit
Instruksi C → Load/Store Unit
Jika beberapa unit tersedia dan instruksinya tidak saling menghambat, beberapa instruksi dapat diproses secara paralel.
Misalnya:
Siklus Clock
ALU 1 → Instruksi A
ALU 2 → Instruksi B
FPU → Instruksi C
Di sinilah kemampuan superscalar terlihat.
Contoh Sederhana Eksekusi Paralel
Misalnya sebuah CPU memiliki kemampuan 4-way superscalar.
Terdapat beberapa instruksi:
A = B + C
D = E + F
G = H × I
J = K - L
Jika keempat instruksi tersebut independen dan execution unit tersedia, secara sederhana CPU memiliki peluang untuk menjalankannya dalam satu kelompok eksekusi:
Siklus 1:
ALU 1 → A = B + C
ALU 2 → D = E + F
FPU → G = H × I
ALU 3 → J = K - L
Namun, istilah 4-way tidak berarti setiap siklus CPU pasti menyelesaikan empat instruksi.
Jumlah instruksi yang benar-benar dapat dieksekusi bergantung pada:
- Dependency
- Jenis instruksi
- Ketersediaan execution unit
- Data yang tersedia
- Cache
- Branch
- Kondisi pipeline
Jadi, superscalar merupakan kemampuan maksimum desain, bukan jaminan jumlah instruksi yang selalu selesai pada setiap siklus.
Apa Itu Superscalar Width?
Kemampuan CPU menjalankan beberapa instruksi per siklus sering dikaitkan dengan istilah superscalar width.
Misalnya:
| Width | Kemampuan Teoretis |
|---|---|
| 2-way | Hingga 2 instruksi per siklus |
| 4-way | Hingga 4 instruksi per siklus |
| 6-way | Hingga 6 instruksi per siklus |
| 8-way | Hingga 8 instruksi per siklus |
Namun, angka tersebut bukan berarti CPU selalu mencapai jumlah tersebut.
Misalnya CPU 4-way sedang menjalankan program dengan banyak dependency:
A → B → C → D
Instruksi-instruksi tersebut saling bergantung sehingga kesempatan menjalankannya secara paralel menjadi terbatas.
Hubungan Superscalar dengan Pipelining
Superscalar sangat erat hubungannya dengan pipelining.
Pipelining membagi proses eksekusi instruksi menjadi beberapa tahap.
Contohnya:
Fetch → Decode → Execute → Memory → Write Back
Sementara superscalar memungkinkan beberapa instruksi diproses secara paralel.
Jika keduanya digabungkan, gambaran sederhananya seperti ini:
Pipeline
↓
┌─────────┼─────────┐
↓ ↓ ↓
Instruksi A Instruksi B Instruksi C
↓ ↓ ↓
ALU 1 ALU 2 FPU
Jadi:
Pipelining membagi pekerjaan menjadi beberapa tahap.
Superscalar menyediakan kemampuan menjalankan beberapa instruksi secara paralel.
Keduanya dapat bekerja bersama pada satu CPU.
Hubungan dengan Out-of-Order Execution
Superscalar juga sering dikombinasikan dengan Out-of-Order Execution.
Mengapa?
Karena tidak semua instruksi siap pada waktu yang sama.
Contohnya:
A → Menunggu data
B → Siap
C → Siap
D → Menunggu A
Jika CPU hanya mengikuti urutan secara ketat, B dan C mungkin ikut tertahan karena A belum selesai.
Dengan Out-of-Order Execution:
A → Menunggu
B → Execute
C → Execute
D → Menunggu
CPU dapat menggunakan execution unit untuk menjalankan instruksi yang sudah siap.
Ketika A akhirnya selesai:
A → Selesai
D → Execute
Teknik ini membantu memanfaatkan waktu CPU dengan lebih baik.
Peran Instruction-Level Parallelism
Kemampuan menjalankan beberapa instruksi sekaligus sangat berkaitan dengan Instruction-Level Parallelism (ILP).
ILP adalah peluang untuk menjalankan beberapa instruksi secara paralel atau tumpang tindih.
Contoh:
A = B + C
D = E + F
G = H + I
Instruksi tersebut relatif independen.
CPU memiliki peluang untuk mengerjakannya secara paralel.
Namun:
A = B + C
D = A + E
G = D + F
Memiliki dependency:
A → D → G
Akibatnya, instruksi tidak semuanya bisa dijalankan sekaligus.
Jadi, program juga memengaruhi seberapa besar kemampuan superscalar dapat dimanfaatkan.
Bagaimana CPU Menentukan Instruksi yang Bisa Paralel?
CPU perlu melakukan analisis terhadap instruksi yang sedang diproses.
Beberapa hal yang diperhatikan antara lain:
1. Dependency Data
Apakah instruksi membutuhkan hasil dari instruksi lain?
2. Execution Unit
Apakah unit eksekusi yang dibutuhkan sedang tersedia?
3. Register
Apakah data pada register sudah siap digunakan?
4. Memory
Apakah data yang dibutuhkan tersedia di cache atau masih harus diambil dari tingkat memori yang lebih lambat?
5. Branch
Apakah terdapat percabangan yang dapat mengubah aliran instruksi?
Semua faktor tersebut memengaruhi kemampuan CPU menjalankan instruksi secara paralel.
Peran Branch Prediction
Percabangan dapat mengganggu aliran instruksi dalam pipeline.
Contohnya:
if (A > B) {
X
} else {
Y
}
CPU perlu mengetahui apakah kondisi tersebut benar atau salah.
Sementara menunggu hasilnya, pipeline bisa kehilangan peluang untuk terus bekerja.
Karena itu, prosesor modern menggunakan branch prediction untuk memperkirakan arah percabangan.
Jika prediksi benar:
Branch → Prediksi benar
↓
Pipeline terus berjalan
Jika salah:
Branch → Prediksi salah
↓
Instruksi dibatalkan
↓
Ambil instruksi yang benar
Kesalahan prediksi dapat menyebabkan pekerjaan yang sudah dilakukan harus dibuang sehingga mengurangi efisiensi.
Peran Cache dalam Superscalar
Superscalar juga sangat bergantung pada sistem cache.
Bayangkan CPU memiliki banyak execution unit, tetapi data yang dibutuhkan belum tersedia.
Misalnya:
Execution Unit → Siap bekerja
↓
Data → Belum tersedia
↓
CPU → Menunggu
Jika data harus diambil dari memori utama, waktu tunggu dapat menjadi jauh lebih besar dibandingkan akses ke cache.
Karena itu, cache menjadi bagian penting dalam menjaga aliran data agar CPU tidak terlalu sering menunggu.
Apa yang Terjadi Jika Semua Instruksi Tidak Bisa Paralel?
Tidak masalah.
Superscalar bukan berarti CPU harus selalu menjalankan banyak instruksi sekaligus.
Jika hanya satu instruksi yang siap:
Siklus:
ALU 1 → Instruksi A
ALU 2 → Idle
FPU → Idle
CPU tetap menjalankan instruksi tersebut.
Jika kemudian muncul instruksi lain yang dapat dijalankan:
ALU 1 → Instruksi A
ALU 2 → Instruksi B
FPU → Instruksi C
Maka resource CPU dapat dimanfaatkan lebih banyak.
Dengan kata lain, superscalar memberikan ruang untuk parallel execution ketika peluang tersebut tersedia.
Superscalar Tidak Sama dengan Multi-Core
Ada satu hal yang sering membingungkan: superscalar bukan berarti multi-core.
Superscalar berkaitan dengan kemampuan satu core untuk menjalankan beberapa instruksi secara paralel.
Sementara multi-core berarti satu prosesor memiliki beberapa core.
Contohnya:
CPU
├── Core 1 → Superscalar
├── Core 2 → Superscalar
├── Core 3 → Superscalar
└── Core 4 → Superscalar
Satu prosesor bisa memiliki banyak core, dan setiap core tersebut dapat memiliki kemampuan superscalar.
Jadi keduanya merupakan konsep yang berbeda.
Apa Keuntungan Superscalar Processor?
Superscalar memberikan beberapa manfaat penting dalam desain CPU.
1. Meningkatkan Throughput
CPU memiliki peluang menyelesaikan lebih banyak instruksi dalam periode waktu tertentu.
2. Memanfaatkan Execution Unit
Berbagai unit eksekusi dapat digunakan secara bersamaan jika instruksi yang sesuai tersedia.
3. Memanfaatkan Instruction-Level Parallelism
CPU dapat mencari instruksi independen dan menjalankannya secara paralel.
4. Mengurangi Waktu Menganggur
Jika satu instruksi sedang menunggu, instruksi lain yang sudah siap dapat dikerjakan pada kondisi tertentu.
5. Mendukung Performa CPU Modern
Superscalar dapat dikombinasikan dengan pipelining, branch prediction, cache, dan Out-of-Order Execution untuk membangun mikroarsitektur CPU yang kompleks.
Apa Tantangan Superscalar Processor?
Di balik kemampuannya, superscalar juga membuat desain CPU menjadi lebih kompleks.
Dependency
Instruksi yang saling bergantung tidak bisa sembarangan dijalankan secara paralel.
Resource Conflict
Beberapa instruksi dapat membutuhkan execution unit yang sama.
Branch
Percabangan dapat mengganggu aliran instruksi.
Memory Latency
CPU dapat harus menunggu data ketika data yang dibutuhkan tidak tersedia dengan cepat.
Kompleksitas Hardware
CPU membutuhkan logika tambahan untuk melakukan scheduling, dependency checking, register management, dan berbagai fungsi lainnya.
Contoh Gambaran Superscalar Processor
Agar lebih mudah dipahami, berikut gambaran sederhana prosesnya:
INSTRUKSI
↓
┌───────────────┐
│ Fetch & Decode│
└───────┬───────┘
↓
Cek Dependency
↓
Instruksi Siap?
↙ ↘
Tidak Ya
↓ ↓
Menunggu Scheduler
↓
┌─────────┼─────────┐
↓ ↓ ↓
ALU FPU Load/Store
↓ ↓ ↓
└─────────┼─────────┘
↓
Write Back
↓
Retire
Dari gambaran tersebut, terlihat bahwa CPU harus melakukan banyak pekerjaan sebelum sebuah instruksi benar-benar dieksekusi.
Jadi, kemampuan menjalankan banyak instruksi sekaligus bukan sekadar memiliki banyak ALU. CPU juga membutuhkan mekanisme untuk mengatur instruksi dan menentukan mana yang aman serta siap dijalankan.
Mengapa Superscalar Penting pada CPU Modern?
Aplikasi modern semakin kompleks.
Browser, game, software desain, sistem operasi, hingga aplikasi AI dapat menghasilkan banyak instruksi yang harus diproses CPU.
Dengan kemampuan superscalar, CPU memiliki peluang untuk memanfaatkan parallelism yang terdapat dalam aliran instruksi.
Namun, performa CPU tetap dipengaruhi banyak faktor.
Clock speed, cache, IPC, dependency, branch prediction, memory latency, dan desain mikroarsitektur semuanya dapat berpengaruh.
Karena itu, memahami superscalar membantu kita melihat bahwa performa prosesor tidak hanya ditentukan oleh angka GHz.
Kesimpulan
Superscalar processor menjalankan banyak instruksi sekaligus dengan memanfaatkan beberapa execution unit yang dapat bekerja secara paralel.
Prosesnya dimulai dari mengambil dan menerjemahkan instruksi, memeriksa dependency, menentukan instruksi yang siap, menjadwalkannya ke execution unit, hingga memastikan hasil akhirnya tetap benar.
Kemampuan tersebut semakin efektif ketika dikombinasikan dengan teknologi lain seperti pipelining, Out-of-Order Execution, branch prediction, cache, dan Instruction-Level Parallelism.
Hal yang perlu diingat adalah CPU superscalar tidak selalu mengeksekusi jumlah instruksi maksimum pada setiap siklus. Jumlah instruksi yang benar-benar dapat berjalan bersamaan bergantung pada dependency, resource hardware, data yang tersedia, dan karakteristik program.
Dengan memahami cara kerja superscalar, kita bisa lebih mudah memahami bagaimana prosesor modern mampu menangani begitu banyak instruksi dalam waktu yang sangat singkat.
Pada pembahasan selanjutnya, topik yang menarik untuk dipelajari adalah Instruction-Level Parallelism (ILP) dan bagaimana CPU menemukan instruksi yang bisa dijalankan secara bersamaan.
