Dynamic RAM diorganisasi menjadi bank, row, dan column. Sebuah memory request tidak sekadar menunjuk byte lalu menerima data dengan biaya yang selalu sama. Di dalam setiap bank, perangkat terlebih dahulu membawa seluruh row ke sense amplifier yang sekaligus berfungsi sebagai row buffer. Command column kemudian memilih data dari row yang sedang aktif tersebut.
Susunan ini menciptakan perbedaan timing yang nyata antara akses yang tetap berada pada row aktif dan akses yang membutuhkan row berbeda.
Activation membuka sebuah row
Sebuah sel DRAM menyimpan muatan listrik kecil. Membaca sebuah row menghubungkan banyak sel ke bitline, lalu sense amplifier mendeteksi dan memulihkan nilainya. Command ACTIVATE melakukan operasi ini untuk row yang dipilih dalam sebuah bank.
Setelah activation, row tersebut tetap direpresentasikan dalam sense amplifier bank. Command read dan write kemudian dapat mengakses column di dalamnya. Bank tidak memerlukan activation baru untuk setiap column request selama row tersebut tetap aktif.
Keadaan ini sering disebut open row. State-nya bersifat lokal pada sebuah bank: bank yang berbeda dapat memiliki row aktif yang berbeda pada saat yang sama.
Row hit menghindari command bank tambahan
Request yang menargetkan row yang sudah aktif pada bank-nya disebut row hit. Controller dapat mengeluarkan command column yang sesuai setelah timing constraint mengizinkannya.
Request ke row lain dalam bank yang sama membutuhkan lebih banyak pekerjaan. Row yang sedang aktif harus ditutup dengan PRECHARGE, yang menyiapkan bitline untuk activation berikutnya. Controller kemudian mengaktifkan row target sebelum mengeluarkan command column.
Operasi tambahan tersebut menambah delay dan memakai command bandwidth. Operasi ini juga memengaruhi scheduling karena aturan timing DRAM menetapkan jeda minimum di antara command tertentu.
Hasilnya bukan satu angka latensi yang universal. Generasi memori, transfer rate, parameter timing, kebijakan controller, state bank, aktivitas refresh, dan contention semuanya berkontribusi terhadap waktu akses yang teramati.
Address mapping membentuk row locality
Memory controller memetakan physical address ke channel, rank, bank, row, dan column. Pemetaan ini menentukan pola address mana yang masuk ke row yang sama dan pola mana yang tersebar ke beberapa bank.
Traffic sequential sering menghasilkan row locality yang berguna karena cache line yang berdekatan dapat dipetakan ke column dalam satu row. Controller dapat melayani beberapa request dari row tersebut sebelum menutupnya.
Traffic random dapat menghasilkan lebih banyak row conflict, terutama ketika request berulang kali menargetkan row berbeda dalam bank yang sama. Lebih banyak bank dapat menyediakan parallelism, tetapi bank parallelism dan row locality adalah dua properti yang berbeda. Sebuah workload dapat memakai banyak bank sambil tetap menyebabkan pergantian row yang sering di setiap bank.
Pemetaan yang tepat bersifat spesifik platform dan dapat melibatkan address hashing atau interleaving. Karena itu, software tidak dapat mengasumsikan bahwa batas physical address sederhana selalu sama dengan batas row DRAM.
Kebijakan open-page dan close-page menukar biaya yang berbeda
Controller dapat membiarkan sebuah row tetap terbuka setelah request selesai untuk mengantisipasi request berikutnya ke row yang sama. Pendekatan open-page ini dapat memanfaatkan locality dengan menghasilkan lebih banyak row hit.
Sebaliknya, controller dapat melakukan precharge lebih awal. Pendekatan close-page mengorbankan sebagian peluang row hit berikutnya, tetapi dapat mengurangi penalti ketika request selanjutnya menargetkan row lain.
Controller modern dapat memakai kebijakan adaptif alih-alih satu aturan tetap. Controller dapat mempertimbangkan request yang sedang antre, pola akses terbaru, fairness, target daya, dan timing constraint saat menentukan command berikutnya.
Reordering juga penting. Jika beberapa request dalam antrean menargetkan row aktif, melayaninya bersama-sama dapat meningkatkan throughput. Namun, preferensi berlebihan terhadap row hit dapat menunda request menuju row lain, sehingga scheduler biasanya menyeimbangkan locality dengan fairness dan usia request.
Row buffer bukan CPU cache
Sekilas, row buffer dapat terlihat seperti cache karena data yang baru diaktifkan tersedia dengan biaya command lebih rendah. Namun, mekanisme dan perannya berbeda.
CPU cache menyimpan salinan data memori yang dipilih dan dapat mempertahankan banyak cache line berdasarkan aturan placement dan replacement. Row buffer pada sebuah bank DRAM merupakan bagian dari jalur sensing untuk row yang sedang aktif. Mengaktifkan row lain pada bank tersebut menggantikan isi row buffer sebelumnya sebagai bagian dari operasi normal DRAM.
Karena itu, row hit tidak berarti processor menemukan data dalam cache konvensional. Artinya, row target sudah aktif di dalam bank DRAM yang relevan.
Pola akses mengubah pekerjaan command
Dua workload dengan jumlah byte serupa dapat memberikan tekanan berbeda pada DRAM. Salah satunya mungkin berulang kali mengakses column dari row yang aktif, sedangkan yang lain dapat memaksa siklus precharge dan activation secara sering.
Perbedaan tersebut dapat memengaruhi latensi, bandwidth efektif, penggunaan energi, dan interference di antara stream request yang berjalan bersamaan. Hal ini juga membantu menjelaskan nilai memory-controller scheduling: urutan request dalam antrean dapat mengubah jumlah pergantian row meskipun request-nya sendiri tetap identik.
State utamanya sederhana. Setiap bank DRAM dapat mempertahankan sebuah row yang telah diaktifkan di row buffer. Request ke row tersebut menggunakan kembali state aktif; request ke row lain mengharuskan bank menutup row saat ini dan mengaktifkan row berikutnya.