| Tweet |
|
Topik:
|
Bagaimana Cara Kerja CPU? Penjelasan Lengkap tentang Otak Komputer AndaOleh: Hobon.id (26/07/2026)
Setiap kali kita mengetuk ikon aplikasi, memuat halaman web, atau mengirim pesan, sebuah chip yang lebih kecil dari perangko melakukan miliaran operasi listrik yang tepat untuk mewujudkan tindakan tersebut. Chip itu adalah Central Processing Unit, atau CPU — yang biasa disebut "otak" komputer. CPU adalah mesin yang sangat cepat dan sangat literal yang melakukan satu hal berulang kali, miliaran kali per detik: ia membaca instruksi, mencari tahu apa arti instruksi tersebut, dan melaksanakannya. Tindakan tunggal yang berulang itu — yaitu membaca, memahami, melakukan — adalah seluruh rahasia di balik semua yang dapat dicapai komputer. Tidak ada momen di mana CPU "berpikir" dalam arti yang berarti. Tidak ada pemahaman tentang apa itu spreadsheet, apa itu video game, atau apa yang coba dicapai oleh mesin pencari. CPU hanya melihat aliran instruksi numerik yang tak henti-hentinya, masing-masing memerintahkannya untuk memindahkan nilai dari satu tempat ke tempat lain, menambahkan dua angka, membandingkan dua nilai, atau melompat ke tempat lain dalam aliran instruksinya. Memahami cara kerja CPU sebenarnya berarti memahami bagaimana sesuatu yang secara mekanis sederhana ini, yang diulang dalam skala miliaran operasi per detik, sehingga menghasilkan semua yang kita alami sebagai "komputasi." Advertisement:
Transistor: Awal Mula Segala SesuatuTransistor adalah sakelar elektronik kecil. Dalam bentuknya yang paling sederhana dan berguna untuk komputasi, transistor dapat berupa "on" atau "off", sehingga memungkinkan arus listrik mengalir melaluinya, atau memblokir arus tersebut. Perilaku biner dua keadaan ini adalah dasar fisik untuk sistem bilangan biner yang menjadi andalan semua komputasi digital, yaitu transistor "on" merepresentasikan nilai 1, dan transistor "off" merepresentasikan nilai 0. Sebuah transistor tunggal, dengan sendirinya, tidak menghitung apa pun yang berarti. Namun, CPU modern mengandung miliaran transistor — prosesor unggulan saat ini memuat puluhan miliar transistor ke dalam satu chip yang lebih kecil dari kuku jari, masing-masing berukuran hanya beberapa nanometer, skala yang sangat kecil sehingga puluhan transistor dapat muat di sepanjang lebar sehelai rambut manusia. Alasan mengapa jumlah transistor sangat penting dalam desain prosesor adalah karena transistor merupakan blok bangunan fundamental untuk setiap bagian logika yang dilakukan CPU. Lebih banyak transistor, yang disusun dengan terampil, berarti lebih banyak gerbang logika, yang berarti lebih banyak kemampuan komputasi yang dikemas dalam ruang fisik yang sama. Tren tanpa henti selama beberapa dekade untuk memasukkan lebih banyak transistor ke dalam area chip yang sama adalah kisah fisik yang mendasari mengapa komputer menjadi semakin mampu secara eksponensial selama beberapa dekade sekaligus menjadi lebih kecil, lebih murah, dan lebih hemat daya. Dari Transistor ke Gerbang Logika hingga Rangkaian ListrikGerbang logika menerima satu atau lebih input biner dan menghasilkan output biner berdasarkan aturan tetap. Gerbang AND, misalnya, hanya menghasilkan 1 jika kedua inputnya adalah 1. Gerbang OR menghasilkan 1 jika salah satu inputnya adalah 1. Gerbang NOT hanya membalik input tunggalnya, mengubah 0 menjadi 1 dan sebaliknya. Aturan-aturan ini terdengar terlalu sederhana untuk diperhatikan, tetapi menggabungkan cukup banyak gerbang sederhana ini dalam pola yang tepat akan menghasilkan rangkaian yang mampu melakukan penjumlahan, pengurangan, perbandingan, dan setiap operasi aritmatika dan logika lainnya yang dilakukan komputer. Rangkaian penjumlahan, yang dibangun dari susunan gerbang AND, OR, dan XOR tertentu, dapat menjumlahkan dua bilangan biner dan menangani "carry" yang terjadi ketika sejumlah digit biner berjumlah lebih dari 1 — persis konsep carry yang diajarkan dalam penjumlahan di sekolah dasar, hanya dieksekusi dalam logika listrik murni. Ini adalah lompatan konseptual yang mudah dilewati tetapi benar-benar layak untuk direnungkan, yaitu tidak ada satu pun titik dalam seluruh rantai ini di mana CPU melakukan sesuatu yang lebih canggih daripada menggabungkan keadaan hidup/mati listrik sederhana sesuai dengan aturan tetap. Perkalian, dekode video, simulasi fisika dalam permainan video, perhitungan jaringan saraf di balik model AI — setiap hal ini, tidak peduli seberapa canggihnya tampak dari luar, pada akhirnya diimplementasikan sebagai sejumlah besar operasi gerbang logika sederhana yang terjadi dengan kecepatan luar biasa. Kompleksitas yang kita alami sebagai pengguna sepenuhnya berasal dari skala dan kecepatan, bukan dari satu operasi pun yang cerdas. Anatomi Inti CPUControl Unit adalah komponen yang bertanggung jawab untuk mengarahkan keseluruhan aliran operasi di dalam CPU. Unit ini tidak melakukan perhitungan sendiri; sebaliknya, ia membaca setiap instruksi, mencari tahu apa yang perlu dilakukan, dan mengirimkan sinyal yang sesuai ke komponen lain untuk mewujudkannya — seperti seorang konduktor yang mengarahkan orkestra daripada memainkan instrumen itu sendiri. Control Unit mengelola siklus fetch-decode-execute, mengoordinasikan secara tepat kapan data berpindah, kapan perhitungan terjadi, dan kapan hasilnya disimpan. Arithmetic Logic Unit, yang secara universal disingkat sebagai ALU, adalah tempat perhitungan sebenarnya terjadi. Setiap penjumlahan, pengurangan, perbandingan, dan operasi logika (AND, OR, NOT, dan kombinasinya) yang dibutuhkan program dilakukan di dalam ALU. Ketika sebuah program memeriksa apakah suatu angka lebih besar dari angka lain, atau menambahkan tarif pajak ke suatu harga, atau menentukan apakah sebuah tombol pada keyboard telah ditekan, keputusan atau perhitungan tersebut terjadi di dalam ALU. Register adalah lokasi penyimpanan yang sangat kecil dan sangat cepat yang dibangun langsung ke dalam CPU itu sendiri, digunakan untuk menyimpan data, instruksi, dan alamat memori yang sedang aktif dikerjakan pada saat tertentu. Cache memory adalah kumpulan kecil memori yang sangat cepat yang terletak di atau sangat dekat dengan chip CPU, digunakan untuk menyimpan salinan data dan instruksi yang kemungkinan akan dibutuhkan CPU lagi dalam waktu dekat, secara dramatis mengurangi waktu yang dihabiskan untuk menunggu informasi tiba dari memori utama yang lebih lambat. Cache adalah salah satu inovasi kinerja terpenting dalam sejarah CPU. Bus adalah jalur fisik — kumpulan kabel listrik — yang membawa informasi antara berbagai bagian CPU dan antara CPU dan bagian komputer lainnya. Address bus membawa lokasi memori yang diakses, bus data membawa informasi aktual yang ditransfer, dan bus kontrol membawa sinyal yang mengkoordinasikan seluruh proses. Machine Code: Satu-satunya Bahasa yang Dipahami CPUSetiap bahasa pemrograman yang pernah dibuat — seperti Python, JavaScript, Swift, C++, dan ribuan lainnya — ada untuk memudahkan manusia mendeskripsikan apa yang mereka inginkan agar komputer lakukan. Tetapi CPU tidak dapat membaca Python atau JavaScript secara langsung. Sebelum program apa pun dapat dijalankan, program tersebut harus diterjemahkan, melalui proses yang disebut kompilasi atau interpretasi, ke dalam kode mesin, yaitu serangkaian instruksi biner mentah yang spesifik untuk jenis CPU yang akan menjalankannya. Instruksi kode mesin dibangun dari dua bagian penting, yaitu opcode, yang menentukan operasi apa yang akan dilakukan (menambahkan dua nilai ini, memuat nilai ini dari memori, melompat ke titik yang berbeda dalam program), dan satu atau lebih operand, yang menentukan data apa yang harus ditindaklanjuti oleh operasi tersebut (register mana, alamat memori mana, angka spesifik mana). Satu instruksi kode mesin, dalam bentuk biner mentahnya, mungkin terlihat seperti rangkaian tiga puluh dua atau enam puluh empat angka satu dan nol — sama sekali tidak dapat dibaca oleh manusia, tetapi sangat tepat dan tidak ambigu bagi CPU yang dirancang untuknya. Inilah mengapa software yang dikompilasi untuk satu jenis arsitektur CPU umumnya tidak dapat berjalan langsung pada arsitektur yang pada dasarnya berbeda tanpa penerjemahan atau emulasi — aplikasi yang dikompilasi untuk prosesor berbasis ARM pada ponsel menggunakan bahasa mesin yang benar-benar berbeda dibandingkan software yang dikompilasi untuk prosesor desktop berbasis x86 tradisional, meskipun kedua chip tersebut, pada tingkat konseptual yang dijelaskan dalam panduan ini, pada dasarnya melakukan jenis pekerjaan yang sama. Siklus Fetch-Decode-ExecuteSiklus ini bekerja persis seperti namanya. Pertama, CPU mengambil (fetch) instruksi berikutnya dari memori — mengambil instruksi kode mesin mentah yang perlu dieksekusi selanjutnya. Kedua, CPU mendekode instruksi tersebut, menerjemahkan opcode biner mentah dan operand ke dalam sinyal internal dan perintah kontrol spesifik yang dibutuhkan untuk menjalankannya. Ketiga, CPU mengeksekusi instruksi tersebut, benar-benar melakukan operasi yang ditentukan, baik itu perhitungan aritmatika di ALU, pergerakan data antara register dan memori, atau lompatan ke lokasi yang berbeda dalam program. Setelah eksekusi selesai, siklus dimulai lagi segera dengan instruksi berikutnya, dan berlanjut tanpa jeda selama komputer berjalan, mengeksekusi potensi miliaran siklus tiga langkah ini setiap detik. Pengulangan tanpa henti ini, bukan momen pengambilan keputusan yang canggih, adalah realitas mekanis sebenarnya di balik semua yang dilakukan komputer kita. Memahami masing-masing dari tiga tahap secara lebih mendalam akan mengungkapkan mengapa proses ini bekerja dan mengapa CPU modern membutuhkan trik yang semakin cerdas untuk membuatnya cukup cepat untuk memenuhi tuntutan software modern. Tahap Fetch Instruksi Secara DetailTahap fetch instruksi dimulai dengan register khusus di dalam CPU yang disebut Program Counter, sering disingkat sebagai PC. Program Counter menyimpan alamat memori dari instruksi berikutnya yang perlu dieksekusi — pada dasarnya sebuah penanda yang memberi tahu CPU persis di mana harus mencari di lautan memori yang sangat besar untuk menemukan apa yang perlu dilakukan selanjutnya. Ketika tahap fetch instruksi dimulai, CPU mengirimkan alamat yang saat ini disimpan dalam Program Counter melalui bus alamat ke memori utama, meminta instruksi yang disimpan di lokasi spesifik tersebut. Memori utama merespons dengan mengirimkan instruksi aktual kembali melalui bus data ke register penyimpanan sementara di dalam CPU. Segera setelah mengeluarkan permintaan ini, Program Counter diinkrementasikan — yaitu diperbarui untuk menunjuk ke instruksi berikutnya dalam urutan — sehingga siklus pengambilan instruksi berikutnya akan mengambil instruksi berikutnya yang benar daripada mengambil instruksi yang sama lagi. Pada arsitektur modern yang menggunakan instruksi 32-bit dengan panjang tetap, inkrement ini hanya menambahkan empat byte ke nilai Program Counter saat ini, mempersiapkannya untuk pengambilan instruksi berikutnya bahkan sebelum instruksi saat ini selesai diproses. Tahap ini terdengar sederhana, dan secara konseptual memang demikian, tetapi di baliknya tersembunyi salah satu tantangan kinerja paling signifikan dalam desain CPU, yaitu memori utama jauh lebih lambat daripada CPU itu sendiri, yang berarti setiap pengambilan data berpotensi melibatkan CPU yang menunggu — terkadang dalam jangka waktu yang relatif sangat lama dalam istilah CPU — hingga instruksi yang diminta tiba. Ketidaksesuaian antara kecepatan CPU dan kecepatan memori ini cukup signifikan sehingga mendorong beberapa inovasi arsitektur terpenting yang akan dibahas kemudian dalam panduan ini, khususnya caching dan prefetching instruksi. Tahap Decode Secara DetailSetelah sebuah instruksi diambil dan berada di register penyimpanan CPU, instruksi tersebut hanya ada sebagai urutan angka biner mentah — tidak berarti sampai tahap dekode menginterpretasikannya. Tahap dekode ditangani oleh komponen khusus yang disebut dekoder instruksi, yang memeriksa opcode instruksi (bagian yang menentukan operasi apa yang akan dilakukan) dan operandnya (bagian yang menentukan data apa yang akan dioperasikan). Tugas dekoder adalah menerjemahkan pola biner mentah ini ke dalam serangkaian sinyal kontrol internal spesifik yang dibutuhkan untuk menjalankan instruksi dengan benar. Jika opcode menunjukkan operasi penjumlahan, dekoder mengaktifkan jalur yang sesuai melalui ALU dan mengidentifikasi register mana yang menyimpan dua nilai yang akan dijumlahkan. Jika opcode menunjukkan operasi pemuatan memori, dekoder malah mengaktifkan jalur yang mengambil data dari alamat memori tertentu ke dalam register. Setiap jenis operasi yang dapat dilakukan CPU memiliki pola opcode yang berbeda, dan arsitektur set instruksi dari keluarga CPU tertentu mendefinisikan kosakata lengkap dari pola-pola ini — topik yang akan dibahas lebih mendalam nanti dalam panduan ini ketika membandingkan arsitektur RISC dan CISC. Proses decoding ini, seperti tahap pengambilan instruksi sebelumnya, membutuhkan waktu nyata untuk diselesaikan, dan ini adalah salah satu tahap spesifik yang memungkinkan CPU untuk tumpang tindih dengan pengambilan dan eksekusi instruksi lain, daripada diam saja sementara decoding terjadi, berkat pipelining — yang dijelaskan nanti. Tahap Execute Secara DetailTahap eksekusi adalah tempat tujuan sebenarnya dari instruksi akhirnya dilaksanakan, dan apa yang terjadi secara spesifik selama tahap ini sepenuhnya bergantung pada jenis instruksi yang sedang diproses. Jika instruksi tersebut adalah operasi aritmatika atau logika — seperti menambahkan dua angka, membandingkan dua nilai, melakukan operasi bitwise — sinyal kontrol yang didekodekan mengaktifkan sirkuit yang sesuai di dalam Arithmetic Logic Unit, yang melakukan perhitungan dan menghasilkan hasil. Jika instruksi tersebut adalah operasi perpindahan data — seperti memuat nilai dari memori ke dalam register, atau menyimpan kembali isi register ke memori — tahap eksekusi mengaktifkan jalur akses memori untuk menyelesaikan transfer tersebut. Jika instruksi tersebut adalah operasi aliran kontrol — lompatan bersyarat atau tanpa syarat yang mengubah instruksi mana yang harus dieksekusi selanjutnya, daripada hanya melanjutkan secara berurutan — tahap eksekusi memperbarui Program Counter secara langsung, mengarahkan seluruh siklus fetch-decode-execute ke lokasi yang berbeda dalam aliran instruksi program. Perlu dicatat secara eksplisit bahwa tidak setiap instruksi selesai dalam waktu yang sama persis. Operasi sederhana antar register seringkali dapat diselesaikan dalam satu siklus clock, sementara operasi yang memerlukan akses ke memori utama, atau operasi kompleks seperti pembagian, seringkali memerlukan beberapa siklus clock untuk diselesaikan — sebuah kenyataan yang menambah kompleksitas nyata pada cara CPU modern menjadwalkan dan menumpuk eksekusi beberapa instruksi secara bersamaan. Clock: Apa yang Sebenarnya Menggerakkan SiklusTidak satu pun dari tahap fetch, decode, dan execute terjadi atas inisiatif sendiri — semuanya digerakkan, dengan presisi mekanis, oleh komponen yang disebut clock, yang memancarkan pulse listrik pada frekuensi tetap yang sangat presisi dan sangat cepat. Setiap tahap pemrosesan setiap instruksi disinkronkan dengan pulse clock ini, itulah sebabnya gaya operasi CPU ini digambarkan sebagai sinkron, yaitu pada setiap detak clock, operasi yang ditentukan terjadi, baik itu maju ke tahap berikutnya dari instruksi saat ini atau memulai instruksi berikutnya sepenuhnya. Inilah asal mula spesifikasi "clock speed" yang kita lihat diiklankan untuk setiap prosesor, yaitu angka seperti 3,5 gigahertz, yang berarti clock memancarkan 3,5 miliar pulse setiap detik. Setiap satu dari miliaran pulse tersebut mewakili kesempatan bagi CPU untuk memajukan keadaan internalnya satu langkah. Kecepatan clock yang lebih tinggi berarti lebih banyak langkah ini terjadi per detik, yang — dengan asumsi semua hal lainnya sama — berarti lebih banyak instruksi dapat diproses dalam rentang waktu tertentu. Inilah juga mengapa kecepatan clock mentah, meskipun merupakan faktor kinerja yang penting, bukanlah keseluruhan cerita tentang kinerja CPU, karena jumlah pekerjaan bermanfaat yang sebenarnya diselesaikan per siklus clock sangat bergantung pada faktor arsitektur seperti pipelining, caching, dan paralelisme tingkat instruksi, yang semuanya akan dibahas di bagian selanjutnya, dan inilah mengapa dua CPU dengan kecepatan clock yang identik dapat berkinerja sangat berbeda dalam praktiknya. Register: Ruang Kerja Langsung CPURegister layak diperhatikan lebih detail karena perannya dalam kinerja CPU sangat penting dan seringkali diremehkan. Register adalah lokasi penyimpanan kecil yang dibangun langsung ke dalam silikon CPU itu sendiri — bukan chip memori terpisah, tetapi secara fisik merupakan bagian dari prosesor itu sendiri — yang mampu menyimpan satu nilai, biasanya 32 atau 64 bit tergantung pada arsitekturnya, dan mampu dibaca atau ditulis dalam satu siklus clock. Alasan mengapa register sangat penting adalah kecepatan, yaitu karena register secara fisik terintegrasi ke dalam CPU daripada berada di chip memori terpisah yang harus diakses melalui bus, mengakses register jauh lebih cepat — seringkali ratusan kali — daripada mengakses memori utama tercepat sekalipun. Inilah mengapa arsitektur CPU dirancang berdasarkan prinsip memindahkan data ke register sebelum mengoperasikannya: instruksi penjumlahan, misalnya, biasanya menentukan bahwa ALU harus menambahkan nilai yang saat ini disimpan dalam dua register tertentu dan menempatkan hasilnya di register ketiga, daripada bekerja langsung terhadap lokasi memori utama yang lebih lambat. Jumlah register yang tersedia merupakan karakteristik penting dan dipertimbangkan dengan cermat dalam arsitektur CPU mana pun. Jika register terlalu sedikit, CPU akan dipaksa untuk terus-menerus memindahkan data bolak-balik ke memori yang lebih lambat untuk memberi ruang bagi nilai-nilai baru, sehingga menciptakan hambatan kinerja. Desain CPU modern mengalokasikan sejumlah register tujuan umum yang spesifik dan terbatas di samping beberapa register tujuan khusus — termasuk Program Counter yang dijelaskan sebelumnya, dan register status yang melacak hasil operasi sebelumnya, seperti apakah perhitungan menghasilkan hasil nol atau memicu carry — masing-masing memainkan peran yang ditentukan secara tepat dalam siklus pengambilan-dekode-eksekusi secara keseluruhan. Mengapa Kecepatan Memori Adalah Hambatan SebenarnyaSalah satu fakta terpenting dan paling tidak intuitif tentang komputasi modern adalah ini: CPU itu sendiri biasanya bukanlah faktor pembatas seberapa cepat komputer dapat berjalan. Memori utama — RAM yang terpasang di komputer — adalah hambatannya, dan memahami mengapa hal ini terjadi akan mengungkapkan mengapa begitu banyak desain CPU modern dibangun di sekitar strategi cerdas untuk menyembunyikan masalah ini daripada hanya membuat CPU itu sendiri lebih cepat. CPU modern dapat mengeksekusi miliaran instruksi per detik. Memori utama, sebaliknya, merespons permintaan data hanya setelah penundaan — diukur dalam nanodetik, tetapi nanodetik yang mewakili rentang waktu yang sangat besar dari perspektif CPU — yang belum berkurang secepat peningkatan kecepatan clock CPU selama beberapa dekade. Kesenjangan yang semakin besar antara seberapa cepat CPU secara teoritis dapat memproses instruksi dan seberapa cepat memori utama dapat benar-benar menyediakan data dan instruksi yang dibutuhkan proses tersebut sering digambarkan sebagai "memory wall", dan telah menjadi salah satu tantangan teknik utama dalam desain prosesor selama beberapa dekade. Jika sebuah CPU harus menunggu tanpa bantuan setiap kali perlu mengambil instruksi atau memuat sepotong data dari memori utama, sebagian besar daya pemrosesan teoritisnya akan menganggur, terbuang untuk menunggu daripada melakukan komputasi. Solusi untuk masalah ini — cache memory — cukup signifikan sehingga layak mendapatkan penjelasan khusus, karena ini adalah salah satu ide terpenting dalam seluruh panduan ini. Cache Memory: Mengatasi Kesenjangan KecepatanCache memory adalah kumpulan kecil memori yang sangat cepat yang dibangun di dalam atau sangat dekat dengan chip CPU itu sendiri, yang diposisikan secara khusus untuk menjembatani kesenjangan kecepatan antara kecepatan pemrosesan internal CPU yang sangat cepat dan waktu respons memori utama yang relatif lambat. Ketika CPU perlu mengambil instruksi atau memuat sepotong data, ia memeriksa cache terlebih dahulu, sebelum mengakses memori utama yang lebih lambat. Ketika informasi yang diminta sudah ada di dalam cache — hasil yang disebut cache hit — informasi tersebut dapat diambil hampir seketika, dengan kecepatan yang jauh lebih dekat dengan kecepatan operasi internal CPU sendiri daripada yang dapat diberikan oleh memori utama. Ketika informasi yang diminta tidak ada di dalam cache — cache miss — CPU tidak punya pilihan selain mengambilnya dari memori utama yang lebih lambat, sehingga menimbulkan penalti waktu penuh yang justru ingin dihindari oleh caching. Karena program sangat sering mengakses instruksi dan wilayah data yang sama berulang kali dalam waktu singkat — pola perilaku yang terdokumentasi dengan baik yang dikenal sebagai lokalitas referensi — cache yang dirancang dengan baik mencapai tingkat hit yang tinggi dalam praktiknya, secara dramatis mengurangi waktu rata-rata yang dihabiskan CPU untuk menunggu informasi yang dibutuhkannya. CPU modern mengimplementasikan cache sebagai hierarki multi-level daripada satu pool tunggal, khususnya karena ada trade-off inheren antara kecepatan cache dan ukuran cache. Cache Level 1 (L1) adalah yang terkecil dan tercepat, secara fisik paling dekat dengan logika eksekusi inti CPU, biasanya hanya menyimpan puluhan kilobyte tetapi merespons hanya dalam satu atau dua siklus clock. Cache Level 2 (L2) lebih besar — seringkali beberapa ratus kilobyte hingga beberapa megabyte — dan sedikit lebih lambat, bertindak sebagai lini pertahanan kedua ketika L1 tidak berisi apa yang dibutuhkan. Cache Level 3 (L3) lebih besar lagi — umumnya puluhan megabyte pada prosesor modern — dan lebih lambat lagi, tetapi masih jauh lebih cepat daripada mencapai memori utama. Struktur berlapis ini berarti CPU memeriksa cache yang semakin besar dan lambat secara berurutan, dan hanya kembali ke memori utama sebagai upaya terakhir. Selain sekadar menunggu permintaan, CPU modern juga menggunakan prefetching instruksi, yaitu sebuah teknik di mana CPU secara proaktif memprediksi instruksi atau data mana yang kemungkinan akan segera dibutuhkan dan memuatnya ke dalam cache sebelum benar-benar diminta, berdasarkan pola bagaimana program biasanya mengakses memori. Ketika prefetching dengan benar mengantisipasi apa yang akan datang selanjutnya, operasi pengambilan yang sesuai secara efektif terjadi secara instan, karena informasi yang dibutuhkan sudah menunggu di cache pada saat diminta. Pipelining: Melakukan Banyak Hal SekaligusJika CPU menangani siklus fetch-decode-execute dengan cara yang paling literal dan berurutan — yaitu menyelesaikan sepenuhnya fetch, decode, dan execute satu instruksi sebelum mulai mengambil instruksi berikutnya — sejumlah besar perangkat keras internal CPU akan menganggur pada saat tertentu, karena hanya satu tahap yang akan aktif pada satu waktu. Pipelining adalah inovasi arsitektur yang memecahkan pemborosan ini, dan merupakan salah satu teknik kinerja terpenting dalam desain CPU modern. Ide inti pipelining mudah dipahami setelah divisualisasikan secara konkret, yaitu daripada menunggu satu instruksi menyelesaikan setiap tahap sebelum memulai tahap berikutnya, CPU mulai mengambil instruksi kedua segera setelah instruksi pertama berpindah dari tahap pengambilan ke tahap dekode. Pada saat instruksi pertama mencapai tahap eksekusi, instruksi kedua sedang didekode, dan instruksi ketiga sudah diambil. Ketiga tahap pipeline — fetch, decode, and execute — sibuk secara bersamaan, masing-masing mengerjakan instruksi yang berbeda, daripada hanya satu tahap yang aktif sementara dua tahap lainnya menganggur. Efek praktis dari pipelining adalah peningkatan dramatis dalam throughput instruksi secara keseluruhan — yaitu jumlah total instruksi yang dapat diproses CPU per satuan waktu — meskipun setiap instruksi individual tidak selesai lebih cepat daripada tanpa pipelining. CPU modern memperluas konsep ini jauh lebih jauh daripada contoh tiga tahap yang disederhanakan di atas, memecah pemrosesan instruksi menjadi sepuluh, lima belas, atau lebih tahap pipeline yang berbeda, masing-masing menangani bagian yang lebih sempit dari keseluruhan pekerjaan, memungkinkan lebih banyak instruksi untuk berjalan secara bersamaan pada berbagai tahap penyelesaian. Pipelining bukannya tanpa komplikasi. Ketika satu instruksi bergantung pada hasil instruksi sebelumnya yang belum selesai dieksekusi, atau ketika instruksi lompatan mengubah instruksi mana yang harus datang selanjutnya, kelancaran aliran pipeline dapat terganggu, sehingga memaksa CPU untuk berhenti atau membuang pekerjaan yang sebagian selesai — masalah yang secara khusus diatasi oleh dua bagian berikutnya, tentang prediksi percabangan dan eksekusi di luar urutan. Branch Prediction: Menebak Masa Depan dengan TepatProgram jarang sekali berupa urutan instruksi tunggal yang dieksekusi satu demi satu dari awal hingga akhir. Program terus-menerus bercabang — membuat keputusan berdasarkan kondisi, kembali ke bagian kode yang sama sekali berbeda, dan melompat ke bagian yang sama sekali berbeda berdasarkan hasil perbandingan. Setiap titik percabangan ini menciptakan masalah nyata bagi pipelined CPU, yaitu instruksi mana yang harus mulai diambil selanjutnya, ketika jawaban yang benar bergantung pada hasil perbandingan yang belum selesai dieksekusi? Branch prediction adalah solusi CPU untuk masalah ini. Alih-alih hanya menunggu, diam, sampai hasil percabangan diketahui sepenuhnya, CPU modern membuat tebakan yang tepat tentang arah percabangan, berdasarkan sirkuit pengenalan pola yang canggih yang melacak perilaku historis percabangan spesifik tersebut dan percabangan serupa di tempat lain dalam program. CPU kemudian secara spekulatif mulai mengambil dan bahkan mengeksekusi instruksi di sepanjang jalur yang diprediksi, jauh sebelum kondisi percabangan sebenarnya dievaluasi sepenuhnya. Ketika prediksi ini ternyata benar — dan prediktor percabangan modern sangat akurat, seringkali melebihi 95 persen akurasi pada kode dunia nyata yang umum — CPU secara efektif telah menghilangkan penundaan yang seharusnya terjadi akibat menunggu hasil percabangan, karena instruksi yang benar telah diambil, didekode, dan dieksekusi sebagian atau seluruhnya terlebih dahulu. Namun, ketika prediksi ternyata salah, semua pekerjaan yang dieksekusi secara spekulatif di sepanjang jalur yang salah harus dibuang, dan pipeline harus dikosongkan dan dimulai ulang di sepanjang jalur yang benar — penalti yang membutuhkan waktu jauh lebih banyak daripada jika CPU hanya menunggu sejak awal. Inilah mengapa kesalahan prediksi percabangan adalah salah satu masalah kinerja yang paling banyak dipelajari dalam arsitektur CPU, dan mengapa begitu banyak upaya rekayasa dilakukan untuk membuat prediktor percabangan seakurat mungkin. Out-of-Order ExecutionKecanggihan lebih lanjut yang digunakan CPU berkinerja tinggi modern adalah out-of-order execution atau eksekusi tidak berurutan, yaitu kemampuan untuk mengeksekusi instruksi dalam urutan yang berbeda dari urutan ketat yang muncul dalam program, khususnya untuk menghindari penundaan yang tidak perlu ketika satu instruksi menunggu operasi yang lambat, seperti akses memori yang belum selesai. Logika di balik eksekusi tidak berurutan adalah bahwa banyak instruksi dalam program tipikal sebenarnya tidak bergantung pada hasil satu sama lain, meskipun muncul secara berurutan. Jika instruksi A menunggu pemuatan memori yang lambat selesai, tetapi instruksi B, yang muncul kemudian dalam program, tidak bergantung pada hasil instruksi A dan telah memiliki semua data yang dibutuhkan, CPU yang mampu melakukan eksekusi tidak berurutan dapat melanjutkan instruksi B sementara instruksi A terus menunggu, daripada memaksa seluruh pipeline untuk berhenti hingga A selesai. Setelah data A tersedia, eksekusinya dilanjutkan, dan komponen khusus memastikan hasil akhir diurutkan ulang dan dikomit dengan benar dalam urutan program yang tepat, sehingga dari perspektif perangkat lunak yang berjalan di CPU, semuanya masih tampak terjadi dalam urutan yang diharapkan, meskipun urutan eksekusi internal sebenarnya telah diatur ulang untuk efisiensi. Kemampuan ini membutuhkan kompleksitas perangkat keras tambahan yang substansial — seperti melacak ketergantungan antar instruksi, mengelola kumpulan instruksi yang siap dieksekusi versus menunggu data, dan memastikan pengurutan akhir yang benar — tetapi ini adalah salah satu kontributor paling signifikan terhadap kinerja dunia nyata CPU kelas atas modern, memungkinkan mereka untuk menjaga unit eksekusi mereka tetap sibuk jauh lebih konsisten daripada desain yang sepenuhnya berurutan. Multi-Core Processor: Lebih dari Satu OtakSemua yang telah dijelaskan sejauh ini dalam panduan ini berlaku untuk satu inti pemrosesan tunggal, yaitu satu unit lengkap dan independen yang mampu menjalankan siklus fetch-decode-execute sendiri. Sepanjang sejarah komputasi, CPU hanya berisi satu inti seperti itu, dan cara utama untuk mempercepat CPU adalah dengan meningkatkan kecepatan clock-nya. Pendekatan itu akhirnya menemui keterbatasan fisik yang serius, terutama terkait panas dan konsumsi daya yang timbul akibat peningkatan kecepatan clock, yang akan dibahas lebih detail di bagian selanjutnya. Respon industri terhadap keterbatasan ini adalah dengan menempatkan beberapa inti pemrosesan independen pada satu chip CPU — desain yang kini universal di hampir setiap prosesor modern, dari ponsel pintar hingga laptop hingga server pusat data, yang umumnya memiliki empat inti pada perangkat konsumen kelas menengah hingga puluhan atau bahkan ratusan inti pada prosesor server khusus. Setiap inti, dalam pengertian fundamental yang dijelaskan di seluruh panduan ini, adalah prosesor yang lengkap dan independen, yaitu ia memiliki siklus fetch-decode-execute sendiri yang berjalan terus menerus, register sendiri, dan biasanya cache L1 dan L2 khusus sendiri, sementara berbagi cache L3 yang lebih besar dan koneksi ke memori utama dengan inti lain pada chip yang sama. Manfaat praktis dari banyak inti adalah paralelisme sejati, yaitu alih-alih satu inti yang beralih dengan cepat antara tugas yang berbeda untuk menciptakan ilusi eksekusi simultan — yaitu teknik utama yang tersedia untuk prosesor inti tunggal — CPU multi-inti dapat memiliki beberapa aliran instruksi yang benar-benar independen yang dieksekusi pada saat yang tepat, satu per inti. Inilah mengapa sistem operasi modern dan software modern dirancang untuk membagi pekerjaan mereka ke dalam beberapa thread independen kapan pun memungkinkan, khususnya untuk memanfaatkan paralelisme perangkat keras sejati ini daripada membiarkan inti tambahan menganggur. Ini juga alasan mengapa program yang tidak dirancang untuk menggunakan banyak thread secara efektif tidak akan berjalan lebih cepat pada prosesor enam belas inti daripada pada prosesor empat inti untuk tugas spesifik tersebut — inti tambahan tersebut tidak digunakan kecuali software tersebut disusun untuk memberi mereka pekerjaan independen untuk dilakukan. Arsitektur Set Instruksi: RISC vs. CISCSetiap CPU dirancang berdasarkan arsitektur set instruksi tertentu, yang umumnya disingkat sebagai ISA — kosakata instruksi lengkap dan terdefinisi secara formal yang mampu dipahami dan dieksekusi oleh prosesor, bersama dengan aturan yang mengatur bagaimana instruksi tersebut dikodekan ke dalam kode mesin biner. Dua filosofi luas secara historis mendominasi desain ISA, dan memahami perbedaannya menjelaskan mengapa berbagai jenis perangkat menggunakan desain prosesor yang berbeda secara signifikan. CISC, atau Complex Instruction Set Computing, lebih menyukai kosakata instruksi yang kaya, beberapa di antaranya dapat melakukan operasi yang relatif rumit — seperti memuat data dari memori, melakukan perhitungan padanya, dan menyimpan hasilnya kembali ke memori, semuanya sebagai satu instruksi. Arsitektur x86 tradisional yang digunakan di sebagian besar komputer desktop dan laptop berasal dari filosofi CISC ini, yang mencerminkan keputusan desain yang dibuat beberapa dekade lalu ketika instruksi yang mampu melakukan lebih banyak hal per instruksi dihargai karena memori itu sendiri langka dan mahal. RISC, atau Reduced Instruction Set Computing, mengambil pendekatan yang berlawanan, yaitu kosakata instruksi yang lebih kecil dan lebih efisien, masing-masing menyelesaikan satu operasi yang sempit dan terdefinisi dengan baik, dieksekusi dengan sangat efisien dan dapat diprediksi. Arsitektur ARM yang mendukung sebagian besar ponsel pintar, tablet, dan — dalam tren modern yang semakin signifikan — semakin banyak laptop dan bahkan server pusat data, mengikuti filosofi RISC ini. Kesederhanaan dan prediktabilitas instruksi RISC membuatnya sangat cocok untuk optimasi pipelining dan efisiensi daya yang agresif yang dijelaskan sebelumnya dalam panduan ini, yang merupakan bagian penting mengapa chip ARM berbasis RISC menjadi sangat dominan khususnya pada perangkat seluler bertenaga baterai, di mana efisiensi daya sangat penting. Dalam praktiknya, perbedaan historis antara RISC dan CISC telah jauh kabur pada tingkat perangkat keras terdalam — prosesor x86 modern secara internal menerjemahkan instruksi CISC yang kompleks menjadi operasi internal yang lebih kecil dan lebih sederhana yang kemudian diproses dengan cara yang secara konseptual mirip dengan desain RISC, meminjam manfaat kinerja dari kedua pendekatan tersebut. Namun, ISA yang diekspos prosesor ke software tetap menjadi pilihan arsitektur yang menentukan dengan konsekuensi nyata dan praktis terhadap kompatibilitas, efisiensi daya, dan karakteristik kinerja. Mengapa CPU Menghasilkan Panas dan Mengapa Hal Itu PentingSetiap miliaran operasi switching transistor yang terjadi di dalam CPU setiap detiknya mengonsumsi sejumlah kecil energi listrik, dan energi itu harus dibuang ke suatu tempat — energi tersebut dilepaskan sebagai panas. Pada skala CPU berkinerja tinggi modern, yang melakukan triliunan operasi switching ini setiap detik di seluruh miliaran transistor, panas yang dihasilkan secara keseluruhan benar-benar substansial, itulah sebabnya setiap laptop, desktop, dan server pusat data membutuhkan sistem pendingin khusus — kipas, heat sink, dan dalam konteks yang lebih menuntut, pendingin cair — khususnya untuk mencegah CPU dari panas berlebih dan memperlambat dirinya sendiri (perilaku protektif yang disebut thermal throttling) atau mengalami kerusakan fisik. Realitas panas dan daya ini bukanlah detail periferal — ini adalah salah satu kendala utama yang membentuk hampir setiap keputusan desain CPU yang dijelaskan di seluruh panduan ini. Meningkatkan kecepatan clock meningkatkan produksi panas lebih cepat daripada meningkatkan komputasi yang bermanfaat, yang merupakan alasan utama industri beralih ke desain multi-core dan peningkatan efisiensi arsitektur — pipelining, caching, prediksi percabangan, eksekusi di luar urutan — daripada terus mendorong kecepatan clock lebih tinggi lagi, pendekatan yang telah mencapai hasil yang semakin berkurang dan akhirnya kontraproduktif bertahun-tahun yang lalu. Peningkatan proses manufaktur, yang umumnya dijelaskan menggunakan pengukuran seperti node proses "5-nanometer" atau "3-nanometer", mewakili pengungkit utama industri untuk terus meningkatkan kinerja dan efisiensi secara bersamaan, yaitu mengecilkan ukuran fisik transistor individual akan memungkinkan lebih banyak transistor untuk dikemas ke dalam area chip yang sama sementara setiap transistor individual mengkonsumsi daya lebih sedikit dan menghasilkan panas lebih sedikit, sehingga memungkinkan chip secara keseluruhan menjadi lebih cepat dan lebih hemat daya pada saat yang sama — sebuah pencapaian teknik yang benar-benar sulit yang telah menjadi pendorong utama kemajuan komputasi di era mobile dan laptop khususnya. Advertisement:
Jadi, keajaiban sejati CPU bukanlah kecerdasannya—melainkan justru sebaliknya. CPU tidak memahami apa yang dilakukannya dalam arti yang sebenarnya. Ia tidak tahu bahwa ia sedang merender foto, menghitung rumus spreadsheet, atau mengarahkan panggilan video. Ia hanya menjalankan siklus tiga langkah yang sama—fetch, decode, execute—dalam jumlah pengulangan yang sangat besar per detik, pada sesuatu yang tidak lebih canggih daripada urutan angka satu dan nol yang mengalir melalui jaringan sakelar listrik sederhana.
Artikel Terkait:
|