Prosesor tidak harus menunggu setiap store instruction menyelesaikan cache update sebelum instruction berikutnya dapat maju. Core modern umumnya menempatkan completed store ke store buffer, sehingga instruction dapat retire sementara memory subsystem menangani write sesudahnya.
Pemisahan ini meningkatkan throughput karena cache ownership, coherence traffic, dan aktivitas memori lain dapat memakan waktu lebih lama daripada yang mampu ditunggu execution pipeline. Buffer bertindak sebagai queue antara architectural execution dan cache hierarchy.
Kecepatan ini datang dengan correctness requirement yang ketat. Pending store tetap harus terlihat sesuai memory-ordering rule arsitektur, dan load yang lebih muda mungkin membutuhkan data yang belum mencapai cache.
Retirement dan global visibility adalah dua peristiwa berbeda
Instruction retirement menandai titik ketika prosesor melakukan commit architectural effect sebuah instruction sesuai program order. Namun, store yang sudah retired masih dapat menunggu di store buffer.
Store tersebut memiliki destination address dan data yang siap untuk nantinya diteruskan ke cache hierarchy. Core dapat terus me-retire instruction berikutnya selama kapasitas buffer dan ordering constraint mengizinkan.
Global visibility adalah milestone berbeda. Sebuah write menjadi observable oleh prosesor lain sesuai coherence protocol dan memory model hanya setelah cache action serta ordering action yang diperlukan terjadi.
Perbedaan ini memungkinkan execution engine yang cepat menghindari stall pada setiap cache write.
Cache ownership dapat menunda store
Core umumnya memerlukan ownership yang sesuai atas cache line sebelum memodifikasinya dalam coherent multiprocessor system. Jika core lain memegang conflicting copy, coherence message mungkin diperlukan sebelum core lokal dapat melakukan write.
Menunggu exchange tersebut langsung pada retirement path akan membuang execution capacity. Store buffer membiarkan core mencatat pending write lalu melanjutkan pekerjaan berguna sementara cache subsystem memperoleh line state yang diperlukan.
Cache miss dapat menyebabkan delay serupa. Target line mungkin harus di-fetch sebelum buffered data dapat digabungkan dengannya.
Store buffer tidak menghapus biaya ini. Ia memindahkan sebagian besar latensi keluar dari immediate instruction-retirement path.
Load dapat menerima data dari pending store
Load yang lebih muda dapat menargetkan address yang sebelumnya sudah ditulis oleh store lebih tua ke buffer. Membaca cache saja dapat mengembalikan data stale karena nilai yang lebih baru belum mencapai cache.
Prosesor mengatasi ini dengan store-to-load forwarding. Load machinery membandingkan pending store yang relevan dengan load address dan dapat meneruskan matching data langsung dari buffer.
Forwarding sangat berguna untuk kode yang menulis sebuah nilai lalu segera membacanya lagi. Operasi kedua dapat menerima nilai baru tanpa menunggu store mengalir ke cache.
Address matching dapat menjadi lebih kompleks ketika access hanya overlap sebagian atau ukuran store dan load berbeda. Kasus seperti ini dapat membutuhkan merging, replay, atau slow path tergantung microarchitecture.
Buffer penuh dapat menghentikan pipeline
Store buffer memiliki kapasitas terbatas. Jika store datang lebih cepat daripada memory subsystem dapat mengurasnya, free entry pada akhirnya habis.
Pada titik itu, store tambahan tidak dapat retire sampai space tersedia. Workload dengan sustained write traffic, cache miss, atau coherence contention berat dapat mengekspos limit ini.
Karena itu, buffer hanya menyembunyikan latensi selama queue capacity masih cukup. Ia tidak dapat menyediakan pemisahan tanpa batas antara execution dan cache progress.
Perilaku ini menjadi salah satu alasan memory stall dapat muncul secara burst. Core mungkin berjalan lancar saat store menumpuk, lalu berhenti ketika queue mencapai kapasitasnya.
Memory ordering membatasi proses draining
Prosesor tidak dapat menguras buffered store secara arbitrer jika hal itu melanggar memory model arsitektur.
Sebagian arsitektur mengizinkan lebih banyak reordering daripada arsitektur lain, tetapi masing-masing mendefinisikan aturan urutan ketika memory effect boleh menjadi visible. Store machinery, load machinery, coherence system, dan ordering logic pada core bekerja sama untuk memenuhi aturan tersebut.
Memory barrier menambahkan constraint eksplisit. Barrier dapat mengharuskan memory operation terdahulu tertentu mencapai ordering point tertentu sebelum operasi berikutnya boleh maju.
Semantics barrier yang tepat bergantung pada instruction set dan operation type. Barrier bukan sekadar perintah untuk mengosongkan setiap internal queue dalam semua kasus.
Coherence dan store buffer menyelesaikan masalah berbeda
Cache coherence mengoordinasikan copy shared cache line di seluruh prosesor. Ia menetapkan aturan ownership dan propagation agar core tidak secara independen memodifikasi copy yang saling bertentangan.
Store buffer menjalankan peran lokal pada pipeline: menahan pending write sehingga execution dapat maju sebelum cache update selesai.
Kedua mekanisme berinteraksi erat karena buffered store mungkin membutuhkan coherence permission sebelum dapat memperbarui line. Namun, satu mekanisme tidak menggantikan yang lain.
Coherent system dapat memiliki store buffer, dan buffer tersebut harus ikut berperilaku sesuai coherence protocol dan architectural memory model.
Store buffer bukan software write cache
Software umumnya tidak mengalamatkan store-buffer entry sebagai storage region terpisah. Entry tersebut adalah transient microarchitectural state yang terkait dengan pending processor store.
Store buffer juga berbeda dari cache line biasa. Cache adalah reusable copy dari memory data yang diorganisasi untuk akses berulang, sedangkan store buffer terutama melacak write yang masih perlu maju melalui memory system.
Buffer dapat meneruskan data ke local load, tetapi kemampuan itu tidak membuatnya menjadi general-purpose cache.
Isinya juga tidak boleh dianggap durable data. Power loss atau processor reset dapat menghapus transient state kecuali platform menyediakan persistence mechanism terpisah dan software mengikuti persistence protocol yang diwajibkan.
Performance counter dapat mengekspos pressure terkait
Banyak prosesor menyediakan hardware performance counter untuk memory stall, store activity, cache miss, dan pipeline event terkait. Nama dan arti counter yang tepat berbeda antar-processor family.
Store rate yang tinggi saja tidak membuktikan store-buffer capacity adalah bottleneck. Cache miss, translation activity, coherence conflict, memory bandwidth, dan instruction dependency dapat menghasilkan gejala serupa.
Analisis yang berguna menggabungkan beberapa signal: workload behavior, cache event, pipeline-stall counter, memory bandwidth, dan controlled experiment yang mengubah access pattern.
Pertanyaan praktisnya adalah apakah pending write terkuras cukup cepat untuk terus menyediakan free entry bagi retirement.
Buffer mengubah latensi menjadi queue occupancy
Store buffer tidak membuat cache write seketika. Ia memungkinkan prosesor menoleransi latensi dengan menahan completed store sementara pekerjaan berikutnya terus berjalan.
Ketika cache access dan coherence progress berlangsung cepat, entry terkuras dan buffer hampir tidak terlihat. Ketika write menumpuk, occupancy naik sampai core harus melambat.
Hal ini menjadikan store buffer contoh klasik latency-hiding queue: performa meningkat ketika delay sementara masih muat dalam kapasitas yang tersedia, sedangkan delay berkelanjutan pada akhirnya kembali muncul sebagai pipeline stall.