Waktu yang dibutuhkan untuk mengambil satu data dari memori sangat bergantung pada letak data itu, dan selisihnya antartingkat penyimpanan mencapai jutaan kali lipat. Angka-angka latensi ini bukan catatan kaki yang boleh dilupakan, melainkan kunci yang menjelaskan mengapa cache menjadi tuas performa terbesar pada program modern. Topik ini menyajikan orde besar waktu akses dari register sampai disk, menghitung waktu rata-rata akses memori (Average Memory Access Time, AMAT), lalu menutup dengan arti praktisnya bagi pemrogram.
Orde besar dari register sampai disk#
Register berada di dalam prosesor dan menyediakan nilainya dalam satu siklus clock, sehingga menjadi tingkat tercepat dalam hierarki memori. Di bawahnya terdapat cache, yaitu memori kecil yang cepat dan biasanya ditempatkan pada chip prosesor, yang tersusun berjenjang dari L1, L2, sampai L3 dengan kapasitas yang makin besar dan waktu akses yang makin lambat. Memori utama berupa DRAM (Dynamic RAM) berada di luar chip dan menyimpan miliaran kata dengan waktu akses sekitar seratus nanodetik. SSD mempercepat penyimpanan permanen, sedangkan disk mekanis tetap menjadi tingkat paling lambat pada banyak sistem.
| Tingkat penyimpanan | Orde besar waktu akses | Kelipatan terhadap register |
|---|---|---|
| Register | ~1 ns | 1 |
| Cache L1 | ~1 ns | ~1 |
| Cache L2 | ~4 ns | ~4 |
| Cache L3 | ~15 ns | ~15 |
| Memori utama (DRAM) | ~100 ns | ~100 |
| SSD | ~0,1 ms | ~100.000 |
| Disk mekanis | ~10 ms | ~10.000.000 |
Angka pada tabel adalah orde besar, bukan spesifikasi, karena nilai pastinya berbeda antarperangkat dan antargenerasi. Hal yang jauh lebih stabil adalah rasio antartingkatnya, yaitu setiap turun satu tingkat waktu akses naik sekitar empat sampai sepuluh kali lipat, dan lompatan dari DRAM ke SSD bahkan mencapai seribu kali lipat. Pola inilah yang menjelaskan keberadaan cache, yaitu mengisi jurang waktu antara prosesor dan DRAM dengan beberapa tingkat penyimpanan menengah.
Menghitung AMAT#
Rasio pada tabel baru berdampak nyata apabila dihubungkan dengan frekuensi miss. Waktu rata-rata akses memori dirumuskan sebagai berikut, dengan sebagai waktu satu hit, sebagai peluang miss, dan sebagai tambahan waktu yang dibayar ketika miss terjadi.
Sebagai contoh, ambil cache L1 dengan waktu hit 1 ns, tingkat miss 2 persen, dan biaya satu miss yang sampai ke DRAM sekitar 100 ns. Skrip kecil berikut menghitung AMAT untuk contoh itu dan membandingkannya dengan keadaan tanpa cache.
# Perhitungan AMAT (Average Memory Access Time) untuk contoh pada topik.
# Semua angka berupa orde besar yang sengaja dipilih agar mudah dihitung ulang.
t_hit = 1.0 # waktu satu akses hit pada cache L1, dalam nanodetik
p_miss = 0.02 # tingkat miss L1, yaitu 2 persen dari seluruh akses
t_miss = 100.0 # tambahan waktu satu miss yang harus mencapai DRAM
amat = t_hit + p_miss * t_miss
print(f"AMAT = {t_hit:g} + ({p_miss:g} x {t_miss:g}) = {amat:g} ns")
print(f"Tanpa cache, setiap akses langsung memakan {t_miss:g} ns")
print(f"Selisihnya {t_miss / amat:.1f} kali lipat")AMAT = 1 + (0.02 x 100) = 3 ns
Tanpa cache, setiap akses langsung memakan 100 ns
Selisihnya 33.3 kali lipatAMAT bernilai 3 ns, bukan 1 ns, karena 2 persen akses harus membayar 100 ns. Tingkat miss yang tampak kecil itu melipatgandakan waktu rata-rata lebih dari tiga kali lipat dibandingkan waktu hit semata. Tanpa cache, setiap akses langsung membayar 100 ns, sehingga cache pada perhitungan ini memberi percepatan sekitar 33 kali lipat. Inilah alasan pengurangan miss sekecil apa pun selalu layak diperjuangkan.
Arti praktis bagi pemrogram#
Orde besar pada tabel menerjemahkan sejumlah kebiasaan pemrograman menjadi soal waktu yang terukur. Mengakses data secara berurutan memanfaatkan satu blok cache untuk banyak akses, sedangkan melompat-lompat melalui pointer, yaitu variabel yang menyimpan alamat memori nilai lain, memaksa cache menarik blok baru untuk setiap lompatan. Menggunakan kembali data yang masih berada di cache jauh lebih murah daripada memuat ulangnya, sehingga mengelompokkan pekerjaan yang menyentuh data yang sama biasanya mempercepat program. Menyimpan data yang diakses setiap saat pada SSD, meskipun terasa cepat, tetap seribu kali lebih lambat daripada DRAM.
Angka-angka ini juga menjelaskan mengapa dua algoritme dengan kompleksitas yang sama dapat berbeda beberapa kali lipat kecepatannya. Jumlah operasinya sama, tetapi jumlah miss-nya berbeda, dan selisih itu terbaca langsung pada rumus AMAT. Karena itu, membedah cara cache bekerja secara rinci menjadi langkah yang wajar, dan sebagian besar keputusan performa memori berujung pada satu pertanyaan, yaitu berapa banyak miss yang dihasilkan.
Kesalahan umum#
Tiga kekeliruan berikut paling sering muncul ketika angka latensi dipakai untuk menilai performa.
- Memperlakukan angka tabel sebagai spesifikasi. Nilai pasti berbeda antarperangkat, antargenerasi, dan antarbeban kerja. Perbaikannya adalah memakai rasio antartingkat untuk penalaran dan mengukur perangkat sungguhan untuk keputusan akhir.
- Menyepelekan tingkat miss yang kecil. Miss 2 persen terdengar ringan, tetapi contoh AMAT menunjukkan penambahan waktu dari 1 ns menjadi 3 ns. Perbaikannya adalah selalu menghitung AMAT, bukan membaca persentase mentahnya.
- Menyamakan SSD dengan memori utama. SSD sekitar seribu kali lebih lambat daripada DRAM, sehingga data yang diakses berulang kali dalam satu eksekusi tidak boleh diperlakukan sebagai data yang selalu tersedia cepat. Perbaikannya adalah menaruh data kerja di memori utama dan menyisakan SSD untuk penyimpanan permanen.
Ringkasan#
- Waktu akses naik pesat mengikuti hierarki, yaitu register dan L1 sekitar 1 ns, DRAM sekitar 100 ns, SSD sekitar 0,1 ms, dan disk mekanis sekitar 10 ms.
- AMAT dihitung dengan , dan contoh 1 ns, 2 persen, serta 100 ns menghasilkan 3 ns.
- Tingkat miss yang kecil pun mengubah waktu rata-rata secara besar, sehingga pengurangan miss menjadi tuas performa terbesar.
- Angka pasti bervariasi antarperangkat, sedangkan rasio antartingkat relatif stabil dan lebih layak dihafal.
Referensi#
- Computer Systems: A Programmer’s Perspective — Randal Bryant dan David O’Hallaron — Buku yang membahas hierarki memori, angka latensi, dan rumus AMAT dari sudut pandang pemrogram.