Merancang prosesor untuk menghasilkan kinerja tinggi jauh lebih dari sekadar meningkatkan clock rate. Ada banyak cara lain untuk meningkatkan kinerja, diaktifkan melalui hukum Moore dan berperan dalam desain prosesor modern.
Nilai jam tidak dapat meningkat tanpa batas.
Sekilas, mungkin terlihat bahwa prosesor hanya menjalankan aliran instruksi satu demi satu, dengan peningkatan kinerja yang dicapai melalui laju clock yang lebih tinggi. Namun, meningkatkan laju jam saja tidak cukup. Konsumsi daya dan output panas meningkat seiring laju jam naik.
Dengan kecepatan clock yang sangat tinggi, peningkatan tegangan inti CPU yang signifikan menjadi perlu. Karena TDP meningkat dengan kuadrat inti V , kami akhirnya mencapai titik di mana konsumsi daya yang berlebihan, keluaran panas, dan persyaratan pendinginan mencegah peningkatan lebih lanjut dalam laju jam. Batas ini tercapai pada tahun 2004, pada zaman Pentium 4 Prescott . Sementara peningkatan baru-baru ini dalam efisiensi daya telah membantu, peningkatan laju jam yang signifikan tidak lagi layak. Lihat: Mengapa produsen CPU berhenti meningkatkan kecepatan clock prosesor mereka?
Grafik kecepatan clock stock di PC antusias terkini selama bertahun-tahun. Sumber gambar
- Melalui hukum Moore , sebuah pengamatan yang menyatakan bahwa jumlah transistor pada sirkuit terintegrasi berlipat ganda setiap 18 hingga 24 bulan, terutama sebagai akibat dari penyusutan cetakan. , berbagai teknik yang meningkatkan kinerja telah diimplementasikan. Teknik-teknik ini telah disempurnakan dan disempurnakan selama bertahun-tahun, memungkinkan lebih banyak instruksi untuk dieksekusi selama periode waktu tertentu. Teknik-teknik ini dibahas di bawah ini.
Aliran instruksi yang tampaknya berurutan seringkali dapat diparalelkan.
- Meskipun sebuah program dapat terdiri dari serangkaian instruksi untuk dieksekusi satu demi satu, instruksi ini, atau bagian-bagiannya, dapat sangat sering dijalankan secara bersamaan. Ini disebut level-level parallelism (ILP) . Mengeksploitasi ILP sangat penting untuk mencapai kinerja tinggi, dan prosesor modern menggunakan banyak teknik untuk melakukannya.
Pipelining memecah instruksi menjadi potongan-potongan kecil yang dapat dieksekusi secara paralel.
Setiap instruksi dapat dipecah menjadi urutan langkah-langkah, yang masing-masing dijalankan oleh bagian prosesor yang terpisah. Instruksi pipelining memungkinkan banyak instruksi untuk melalui langkah-langkah ini satu demi satu tanpa harus menunggu setiap instruksi selesai sepenuhnya. Pipelining memungkinkan kecepatan clock yang lebih tinggi: dengan memiliki satu langkah dari setiap instruksi yang lengkap dalam setiap siklus clock, lebih sedikit waktu yang dibutuhkan untuk setiap siklus daripada jika seluruh instruksi harus diselesaikan satu per satu.
The pipa RISC klasik berisi lima tahap: instruksi fetch, decode instruksi, pelaksanaan instruksi, akses memori, dan writeback. Prosesor modern memecah eksekusi menjadi lebih banyak langkah, menghasilkan saluran pipa yang lebih dalam dengan lebih banyak tahapan (dan meningkatkan laju clock yang dapat dicapai karena setiap tahap lebih kecil dan membutuhkan waktu lebih sedikit untuk menyelesaikannya), tetapi model ini harus memberikan pemahaman dasar tentang cara kerja pemipaan perpipaan.
Sumber gambar
Namun, pipelining dapat menimbulkan bahaya yang harus diselesaikan untuk memastikan eksekusi program yang benar.
Karena bagian yang berbeda dari setiap instruksi dieksekusi pada saat yang sama, adalah mungkin untuk terjadi konflik yang mengganggu pelaksanaan yang benar. Ini disebut bahaya . Ada tiga jenis bahaya: data, struktural, dan kontrol.
Bahaya data terjadi ketika instruksi membaca dan memodifikasi data yang sama pada saat yang sama atau dalam urutan yang salah, berpotensi menyebabkan hasil yang salah. Bahaya struktural terjadi ketika beberapa instruksi perlu menggunakan bagian tertentu dari prosesor pada saat yang bersamaan. Bahaya kontrol terjadi ketika instruksi cabang bersyarat ditemukan.
Bahaya ini dapat diatasi dengan berbagai cara. Solusi paling sederhana adalah dengan hanya menunda pipa, sementara menunda pelaksanaan satu atau instruksi dalam pipa ditahan untuk memastikan hasil yang benar. Ini dihindari sedapat mungkin karena mengurangi kinerja. Untuk bahaya data, teknik seperti penerusan operan digunakan untuk mengurangi kedai. Bahaya pengendalian ditangani melalui prediksi cabang , yang membutuhkan perawatan khusus dan dibahas di bagian selanjutnya.
Prediksi cabang digunakan untuk menyelesaikan bahaya kontrol yang dapat mengganggu seluruh pipa.
Bahaya pengendalian, yang terjadi ketika cabang bersyarat ditemukan, sangat serius. Cabang-cabang memperkenalkan kemungkinan bahwa eksekusi akan berlanjut di tempat lain dalam program daripada hanya instruksi berikutnya dalam aliran instruksi, berdasarkan pada apakah kondisi tertentu benar atau salah.
Karena instruksi selanjutnya yang harus dilakukan tidak dapat ditentukan sampai kondisi cabang dievaluasi, tidak mungkin untuk memasukkan instruksi apa pun ke dalam pipa setelah cabang tanpa ada. Pipa karena itu dikosongkan ( memerah ) yang dapat membuang siklus clock hampir sebanyak ada tahapan dalam pipa. Cabang cenderung terjadi sangat sering dalam program, sehingga bahaya kontrol dapat sangat mempengaruhi kinerja prosesor.
Prediksi cabang mengatasi masalah ini dengan menebak apakah cabang akan diambil. Cara paling sederhana untuk melakukan ini adalah dengan mengasumsikan bahwa cabang selalu diambil atau tidak pernah diambil. Namun, prosesor modern menggunakan teknik yang jauh lebih canggih untuk akurasi prediksi yang lebih tinggi. Intinya, prosesor melacak cabang sebelumnya dan menggunakan informasi ini dalam beberapa cara untuk memprediksi instruksi selanjutnya yang akan dieksekusi. Pipa kemudian dapat dimasukkan dengan instruksi dari lokasi yang benar berdasarkan prediksi.
Tentu saja, jika prediksi itu salah, instruksi apa pun yang dimasukkan melalui pipa setelah cabang harus dijatuhkan, sehingga menyiram pipa. Hasilnya, keakuratan prediktor cabang menjadi semakin penting karena pipa semakin lama semakin panjang. Teknik prediksi cabang tertentu berada di luar cakupan jawaban ini.
Tembolok digunakan untuk mempercepat akses memori.
Prosesor modern dapat menjalankan instruksi dan memproses data jauh lebih cepat daripada yang dapat diakses di memori utama. Ketika prosesor harus mengakses RAM, eksekusi dapat terhenti untuk waktu yang lama sampai data tersedia. Untuk mengurangi efek ini, area memori kecil berkecepatan tinggi yang disebut cache disertakan pada prosesor.
Karena ruang terbatas yang tersedia pada die prosesor, ukuran cache sangat terbatas. Untuk memanfaatkan kapasitas terbatas ini, cache hanya menyimpan data yang paling baru atau sering diakses ( temporal locality ). Karena akses memori cenderung berkerumun dalam area tertentu ( lokalitas spasial ), blok data di dekat apa yang baru-baru ini diakses juga disimpan dalam cache. Lihat: Lokalitas referensi
Cache juga disusun dalam berbagai tingkatan ukuran yang berbeda untuk mengoptimalkan kinerja karena cache yang lebih besar cenderung lebih lambat daripada cache yang lebih kecil. Misalnya, prosesor mungkin memiliki cache level 1 (L1) yang hanya berukuran 32 KB, sedangkan cache level 3 (L3) -nya bisa beberapa megabita besar. Ukuran cache, serta asosiatifitas cache, yang memengaruhi cara prosesor mengelola penggantian data pada cache penuh, secara signifikan memengaruhi peningkatan kinerja yang diperoleh melalui cache.
Eksekusi out-of-order mengurangi warung karena bahaya dengan memungkinkan instruksi independen untuk dieksekusi terlebih dahulu.
Tidak setiap instruksi dalam aliran instruksi bergantung satu sama lain. Misalnya, meski a + b = c
harus dieksekusi sebelumnya c + d = e
, a + b = c
dan d + e = f
bersifat independen dan dapat dieksekusi pada saat bersamaan.
Eksekusi out-of-order memanfaatkan fakta ini untuk memungkinkan instruksi lain yang independen untuk dieksekusi sementara satu instruksi terhenti. Alih-alih membutuhkan instruksi untuk mengeksekusi satu demi satu secara berbaris,perangkat keras penjadwalan ditambahkan untuk memungkinkan instruksi independen untuk dieksekusi dalam urutan apa pun. Instruksi dikirimkan ke antrian instruksi dan dikeluarkan ke bagian prosesor yang sesuai ketika data yang dibutuhkan tersedia. Dengan begitu, instruksi yang macet menunggu data dari instruksi sebelumnya tidak mengikat instruksi selanjutnya yang independen.
Sumber gambar
- Diperlukan beberapa struktur data baru dan diperluas untuk melakukan eksekusi out-of-order. Antrian instruksi yang disebutkan di atas, stasiun reservasi , digunakan untuk menyimpan instruksi sampai data yang diperlukan untuk eksekusi tersedia. The re-order penyangga (ROB) digunakan untuk melacak keadaan petunjuk berlangsung, dalam urutan di mana mereka diterima, sehingga petunjuk diselesaikan dalam urutan yang benar. Sebuah register file yang melampaui jumlah register yang disediakan oleh arsitektur itu sendiri diperlukan untuk mendaftar penggantian nama , yang membantu mencegah petunjuk jika tidak independen dari menjadi tergantung karena kebutuhan untuk berbagi set terbatas register yang disediakan oleh arsitektur.
Arsitektur Superscalar memungkinkan beberapa instruksi dalam aliran instruksi untuk dieksekusi pada saat yang sama.
Teknik-teknik yang dibahas di atas hanya meningkatkan kinerja pipa instruksi. Teknik-teknik ini saja tidak memungkinkan lebih dari satu instruksi diselesaikan per siklus clock. Namun, sering kali memungkinkan untuk mengeksekusi instruksi individual dalam aliran instruksi secara paralel, seperti ketika mereka tidak saling bergantung (seperti yang dibahas di bagian eksekusi di luar pesanan di atas).
Arsitektur Superscalar memanfaatkan paralelisme tingkat instruksi ini dengan memungkinkan instruksi dikirim ke beberapa unit fungsional sekaligus. Prosesor dapat memiliki beberapa unit fungsional dari jenis tertentu (seperti ALU integer) dan / atau berbagai jenis unit fungsional (seperti floating-point dan unit integer) di mana instruksi dapat dikirim secara bersamaan.
Dalam prosesor superscalar, instruksi dijadwalkan seperti dalam desain out-of-order, tetapi sekarang ada beberapa port masalah , yang memungkinkan instruksi yang berbeda dikeluarkan dan dieksekusi pada saat yang sama. Sirkuit penguraian kode instruksi yang diperluas memungkinkan prosesor untuk membaca beberapa instruksi sekaligus dalam setiap siklus clock dan menentukan hubungan di antara mereka. Prosesor modern berkinerja tinggi dapat menjadwalkan hingga delapan instruksi per siklus clock, tergantung pada apa yang dilakukan setiap instruksi. Beginilah cara prosesor dapat menyelesaikan beberapa instruksi per siklus clock. Lihat: Mesin eksekusi Haswell di AnandTech
Sumber gambar
- Namun, arsitektur superscalar sangat sulit untuk dirancang dan dioptimalkan. Memeriksa dependensi di antara instruksi memerlukan logika yang sangat kompleks yang ukurannya dapat menskala secara eksponensial ketika jumlah instruksi simultan meningkat. Juga, tergantung pada aplikasinya, hanya ada sejumlah instruksi terbatas dalam setiap aliran instruksi yang dapat dieksekusi pada saat yang sama, sehingga upaya untuk mengambil keuntungan yang lebih besar dari ILP menderita dari pengembalian yang semakin berkurang.
Instruksi lebih lanjut ditambahkan yang melakukan operasi kompleks dalam waktu kurang.
Dengan meningkatnya anggaran transistor, dimungkinkan untuk menerapkan instruksi yang lebih maju yang memungkinkan operasi kompleks dilakukan dalam waktu yang lebih singkat. Contohnya termasuk set instruksi vektor seperti SSE dan AVX yang melakukan perhitungan pada beberapa bagian data pada saat yang sama dan set instruksi AES yang mempercepat enkripsi dan dekripsi data.
Untuk melakukan operasi kompleks ini, prosesor modern menggunakan operasi mikro (μops) . Instruksi kompleks diterjemahkan ke dalam urutan μops, yang disimpan di dalam buffer khusus dan dijadwalkan untuk dieksekusi secara terpisah (sejauh diizinkan oleh dependensi data). Ini memberikan lebih banyak ruang bagi prosesor untuk mengeksploitasi ILP. Untuk lebih meningkatkan kinerja, cache μop khusus dapat digunakan untuk menyimpan μops yang baru didekodekan, sehingga μop untuk instruksi yang baru-baru ini dijalankan dapat dilihat dengan cepat.
Namun, penambahan instruksi ini tidak secara otomatis meningkatkan kinerja. Instruksi baru dapat meningkatkan kinerja hanya jika aplikasi ditulis untuk menggunakannya. Adopsi instruksi ini terhambat oleh kenyataan bahwa aplikasi yang menggunakannya tidak akan bekerja pada prosesor yang lebih lama yang tidak mendukungnya.
Jadi bagaimana teknik ini meningkatkan kinerja prosesor dari waktu ke waktu?
Pipa telah menjadi lebih lama selama bertahun-tahun, mengurangi jumlah waktu yang dibutuhkan untuk menyelesaikan setiap tahap dan karenanya memungkinkan laju clock yang lebih tinggi. Namun, antara lain, pipa yang lebih panjang meningkatkan penalti untuk prediksi cabang yang salah, sehingga pipa tidak bisa terlalu panjang. Dalam mencoba mencapai kecepatan clock yang sangat tinggi, prosesor Pentium 4 menggunakan jaringan pipa yang sangat panjang, hingga 31 tahap di Prescott . Untuk mengurangi defisit kinerja, prosesor akan mencoba menjalankan instruksi bahkan jika mereka gagal, dan akan terus berusaha sampai mereka berhasil . Hal ini menyebabkan konsumsi daya yang sangat tinggi dan mengurangi kinerja yang diperoleh dari hyper-threading . Prosesor yang lebih baru tidak lagi menggunakan pipa selama ini, terutama karena penskalaan laju jam telah mencapai dinding; Haswell menggunakan pipa yang panjangnya bervariasi antara 14 dan 19 tahap, dan arsitektur berdaya rendah menggunakan pipa yang lebih pendek (Intel AtomSilvermont memiliki 12 hingga 14 tahap).
Keakuratan prediksi cabang telah meningkat dengan arsitektur yang lebih maju, mengurangi frekuensi flushes pipa yang disebabkan oleh kesalahan prediksi dan memungkinkan lebih banyak instruksi untuk dieksekusi secara bersamaan. Mempertimbangkan panjang pipa dalam prosesor saat ini, ini sangat penting untuk mempertahankan kinerja tinggi.
Dengan meningkatnya anggaran transistor, cache yang lebih besar dan lebih efektif dapat tertanam dalam prosesor, mengurangi warung karena akses memori. Akses memori dapat membutuhkan lebih dari 200 siklus untuk diselesaikan pada sistem modern, jadi penting untuk mengurangi kebutuhan untuk mengakses memori utama sebanyak mungkin.
Prosesor yang lebih baru dapat memanfaatkan ILP dengan lebih baik melalui logika eksekusi superscalar yang lebih maju dan desain "lebih luas" yang memungkinkan lebih banyak instruksi untuk diterjemahkan dan dieksekusi secara bersamaan. The Haswell arsitektur dapat memecahkan kode empat instruksi dan mengirimkan 8 mikro-operasi per siklus clock. Peningkatan anggaran transistor memungkinkan lebih banyak unit fungsional seperti integer ALU untuk dimasukkan dalam inti prosesor. Struktur data utama yang digunakan dalam eksekusi out-of-order dan superscalar, seperti stasiun reservasi, buffer pemesanan ulang, dan file register, diperluas dalam desain yang lebih baru, yang memungkinkan prosesor mencari jendela instruksi yang lebih luas untuk mengeksploitasi ILP mereka. Ini adalah kekuatan pendorong utama di balik peningkatan kinerja prosesor saat ini.
Instruksi yang lebih kompleks dimasukkan dalam prosesor yang lebih baru, dan semakin banyak aplikasi menggunakan instruksi ini untuk meningkatkan kinerja. Kemajuan dalam teknologi kompiler, termasuk peningkatan dalam pemilihan instruksi dan vektorisasi otomatis , memungkinkan penggunaan instruksi ini secara lebih efektif.
Selain di atas, integrasi yang lebih besar dari bagian-bagian yang sebelumnya eksternal ke CPU seperti northbridge, memory controller, dan jalur PCIe mengurangi I / O dan latensi memori. Ini meningkatkan throughput dengan mengurangi warung yang disebabkan oleh keterlambatan mengakses data dari perangkat lain.