Setiap instruksi prosesor memiliki beberapa tahapan untuk operasinya. Masing-masing tahapan ini membutuhkan satu siklus CPU untuk diselesaikan. Tahapan tersebut adalah Instruksi fetch, Instruksi decode, Execute, Memory access, dan Writeback. Masing-masing ini mendapatkan instruksi yang perlu diselesaikan, pisahkan operasi dari nilai yang dioperasikan aktif, jalankan proses, buka register tempat hasilnya akan ditulis, dan tulis hasilnya ke yang dibuka daftar.
Prosesor Berurutan Historis
Di komputer awal, CPU tidak menggunakan pipa instruksi. Dalam CPU ini, setiap operasi siklus tunggal harus terjadi untuk setiap instruksi. Ini berarti dibutuhkan lima siklus clock untuk instruksi rata-rata untuk diproses seluruhnya sebelum yang berikutnya dapat dimulai. Beberapa operasi mungkin tidak perlu menulis hasil apa pun ke register, yang berarti bahwa tahap akses memori dan penulisan balik dapat dilewati.
Namun, ada masalah yang mengintai, ketika menjalankan instruksi lengkap secara berurutan sebelum dapat melanjutkan ke instruksi berikutnya. Masalahnya adalah cache miss. CPU menyimpan data yang sedang diproses secara aktif dalam register. Ini dapat diakses dengan latensi satu siklus. Masalahnya adalah registernya kecil karena sudah terpasang di inti prosesor. CPU harus pergi ke cache L1 yang lebih besar tetapi lebih lambat jika data belum dimuat. Jika tidak ada, itu harus pergi ke cache L2 yang lebih besar dan lebih lambat lagi. Langkah selanjutnya adalah cache L3; pilihan terakhir adalah sistem RAM. Masing-masing opsi ini membutuhkan lebih banyak siklus CPU untuk diperiksa.
Sekarang, tambahan latensi tambahan ini dapat menjadi masalah besar dalam sistem yang harus menyelesaikan setiap instruksi secara berurutan sebelum memulai instruksi berikutnya. Apa yang telah menjadi prosesor 5-siklus per instruksi, tiba-tiba dapat terpaku pada satu instruksi selama lusinan atau ratusan siklus clock. Sementara itu, tidak ada hal lain yang bisa terjadi di komputer. Secara teknis, ini dapat dikurangi dengan memiliki dua inti independen. Namun, tidak ada yang menghentikan mereka berdua melakukan hal yang sama, berpotensi secara bersamaan. Jadi turun ke rute multi-inti tidak memperbaiki ini.
Pipa RISC Klasik
RISC adalah singkatan dari Reduced Instruction Set Computer. Ini adalah gaya desain prosesor yang mengoptimalkan kinerja dengan membuat decoding setiap instruksi menjadi lebih mudah. Hal ini dibandingkan dengan CISC atau Komputer Set Instruksi Kompleks, yang merancang set instruksi yang lebih kompleks yang memungkinkan lebih sedikit instruksi yang diperlukan untuk melakukan tugas yang sama.
Desain RISC klasik mencakup pipeline instruksi. Alih-alih menjalankan salah satu dari lima tahapan instruksi dalam siklus tertentu, pipeline memungkinkan semua lima tahapan dilakukan. Tentu saja, Anda tidak dapat menjalankan kelima tahap dari satu instruksi dalam satu siklus. Tetapi Anda dapat mengantri lima instruksi berturut-turut dengan offset masing-masing satu tahap. Dengan cara ini, instruksi baru dapat diselesaikan setiap siklus clock. Menawarkan potensi peningkatan kinerja 5x untuk peningkatan kompleksitas inti yang relatif rendah.
Prosesor yang tidak memiliki pipeline hanya dapat menjadi sub-skalar, karena mereka tidak dapat mengeksekusi satu instruksi lengkap per siklus. Dengan pipeline lima tahap utama ini, Anda dapat membuat CPU skalar yang dapat menyelesaikan instruksi untuk setiap proses. Dengan membuat pipeline yang lebih jauh, Anda dapat membuat CPU superscalar yang dapat mengeksekusi lebih dari satu instruksi per siklus clock. Tentu saja, masih ada potensi masalah.
Masih Berurutan
Tak satu pun dari ini memecahkan masalah menunggu banyak siklus untuk respons ketika perlu menanyakan tingkat cache dan RAM yang berbeda. Ini juga menimbulkan masalah baru. Bagaimana jika satu instruksi bergantung pada output dari instruksi sebelumnya? Masalah ini diselesaikan secara independen dengan petugas operator tingkat lanjut. Ini dengan hati-hati merencanakan urutan eksekusi sehingga tidak ada instruksi yang bergantung pada output lain yang terlalu berdekatan. Itu juga menangani cache yang hilang dengan memarkir instruksi dan menggantinya di dalam pipa dengan yang lain instruksi yang siap dijalankan dan tidak memerlukan hasilnya, melanjutkan instruksi saat itu siap.
Solusi ini dapat bekerja pada prosesor unpipelined, tetapi mereka diperlukan untuk prosesor superscalar yang menjalankan lebih dari satu instruksi per jam. Prediktor cabang juga sangat berguna karena dapat mencoba memprediksi hasil instruksi dengan lebih dari satu hasil potensial dan terus menganggapnya benar kecuali terbukti sebaliknya.
Kesimpulan
Pipeline memungkinkan semua kemampuan prosesor yang berbeda untuk digunakan di setiap siklus. Ini dilakukan dengan menjalankan berbagai tahapan instruksi yang berbeda secara bersamaan. Ini bahkan tidak menambah banyak kerumitan pada desain CPU. Ini juga membuka jalan untuk memungkinkan lebih dari satu instruksi untuk melakukan satu tahap per siklus.