Beberapa area memori jauh lebih sering ditulis daripada dibaca. Frame buffer, aperture perangkat, dan area output streaming adalah contoh umum. Mengirim setiap store CPU kecil sebagai transaksi memori terpisah dapat membuang bandwidth bus dan menambah overhead transaksi.
Write combining memberi prosesor tempat sementara untuk mengumpulkan store yang kompatibel. Beberapa penulisan ke alamat yang berdekatan dapat digabung menjadi transaksi yang lebih besar sebelum meninggalkan CPU. Teknik ini menguntungkan throughput tulis berkelanjutan, tetapi juga mengubah asumsi waktu dan ordering yang aman bagi software.
Buffer combining mengumpulkan store berdasarkan area alamat
Buffer write combining melacak store yang berada pada area memori yang kompatibel. Jika store berturut-turut mengisi byte berbeda dari blok ter-alignment yang sama, hardware dapat menahan byte-byte tersebut sampai cukup data terkumpul untuk mengirim transfer yang lebih efisien.
Misalnya empat store 32-bit berurutan:
store 0 -> byte 0..3
store 1 -> byte 4..7
store 2 -> byte 8..11
store 3 -> byte 12..15Tanpa combining, jalur memori mungkin harus menangani beberapa transaksi kecil. Dengan combining, hardware dapat mengumpulkan nilainya lalu mengirim transfer yang lebih lebar. Lebar buffer, aturan penggabungan, dan ukuran transaksi sebenarnya merupakan detail implementasi, sehingga software sebaiknya tidak bergantung pada kapasitas internal tertentu.
Efek praktis utamanya adalah berkurangnya jumlah transaksi eksternal untuk store berurutan. Ini sangat berguna ketika software menulis sebuah stream satu kali lalu bergerak ke alamat berikutnya.
Data dapat tetap tertunda setelah instruksi store selesai
Instruksi store yang sudah selesai tidak selalu berarti byte-nya sudah mencapai tujuan akhir. Prosesor dapat menyelesaikan instruksi sementara data masih berada di buffer combining menunggu kondisi drain.
Buffer dapat dikosongkan ketika penuh, saat software menyentuh area yang berkonflik, ketika operasi ordering memerlukan penyelesaian, atau karena alasan implementasi lain. Visibilitas yang tertunda ini adalah fitur performa, bukan jaminan bahwa data akan tertahan selama interval tertentu.
Perbedaan ini penting untuk perangkat memory-mapped. Program mungkin menulis data perintah lalu menulis register kontrol yang menyuruh perangkat memprosesnya. Jika platform mensyaratkan data terlihat sebelum control write, software harus memakai mekanisme ordering yang ditentukan oleh arsitektur dan antarmuka perangkat tersebut.
Store berurutan paling cocok dengan mekanisme ini
Write combining paling efektif ketika store bergerak melalui alamat yang bersebelahan atau berdekatan. Loop streaming dapat mengisi buffer dengan efisien dan menghasilkan transfer besar.
Penulisan yang tersebar memberi peluang penggabungan lebih sedikit. Jika software bolak-balik di antara banyak blok yang berjauhan, sumber daya combining yang terbatas dapat dipaksa mengosongkan entri yang belum penuh. Trafik akhirnya kehilangan sebagian besar keuntungan combining.
Alignment juga memengaruhi efisiensi. Transfer yang melintasi batas tertentu pada sistem memori dapat membutuhkan transaksi tambahan. Aplikasi yang mengontrol layout buffer biasanya mengatur alignment tujuan streaming dan menulisnya dalam pola maju yang sederhana.
Pada beberapa arsitektur CPU, instruksi non-temporal atau streaming store dirancang untuk pola ini. Perilaku cache persisnya bergantung pada instruksi dan tipe memori, tetapi jalur ini dapat menghindari pengisian cache biasa dengan data yang kecil kemungkinan digunakan kembali dalam waktu dekat.
Readback tidak cocok untuk area write-combined
Write combining dioptimalkan untuk penulisan, bukan pembacaan berlatensi rendah. Membaca kembali area yang sama dapat memaksa store tertunda diselesaikan dan mungkin menggunakan tipe memori dengan performa baca yang lemah.
Loop yang menulis sebuah blok lalu langsung membacanya kembali dapat jauh lebih lambat dibanding loop pada memori cacheable biasa. Tipe memori yang tepat bergantung pada pola akses, bukan hanya bandwidth tulis.
Memori write-back cacheable normal biasanya lebih cocok untuk data yang akan dibaca dan digunakan kembali oleh CPU. Cache line menyediakan akses berulang yang cepat serta menyerap operasi baca dan tulis. Mapping write-combined lebih sesuai ketika CPU terutama mendorong data keluar dan hampir tidak perlu membacanya lagi.
Pemisahan ini umum pada grafis dan komunikasi perangkat: memori sistem biasa menyimpan struktur yang aktif digunakan ulang, sedangkan aperture atau tujuan streaming menerima output dalam jumlah besar.
Combining tidak menghapus aturan ordering
Penggabungan store dapat membuat visibilitas eksternalnya berbeda dari urutan source code kecuali arsitektur menjamin ordering yang lebih kuat untuk operasi tersebut. Protokol perangkat sering bergantung pada urutan tertentu, sehingga kode low-level portabel harus memakai barrier, fence, atau primitive akses yang ditentukan platform.
Compiler barrier dan hardware memory barrier bukan hal yang sama. Compiler barrier dapat membatasi reordering oleh compiler tanpa memaksa store yang masih tertunda menjadi terlihat secara global. Hardware ordering instruction dapat memberi batas pada level prosesor, tetapi efek persisnya tetap bergantung pada arsitektur dan tipe memori.
Untuk memory-mapped I/O, API sistem operasi biasanya menyediakan fungsi accessor dengan semantik ordering yang sudah ditentukan. Menggunakan interface tersebut lebih aman daripada memperlakukan register perangkat sebagai volatile memory biasa dan menganggap ordering level bahasa sudah cukup untuk mengendalikan transaksi bus.
Write combining berbeda dari store buffer konvensional
Store buffer CPU dan write-combining buffer menyelesaikan masalah yang terkait tetapi tidak sama.
Store buffer konvensional memungkinkan eksekusi berjalan lanjut sementara store yang sudah committed menunggu cache atau coherence system. Mekanisme ini mendukung perilaku memori cache normal dan menjadi bagian dari machinery memory ordering prosesor.
Write-combining buffer berfokus pada pengumpulan penulisan agar jalur memori dapat menghasilkan transaksi yang lebih besar atau lebih efisien, biasanya untuk tipe memori khusus atau streaming store. Implementasi hardware dapat saja berbagi struktur internal, tetapi efek arsitekturnya tetap berguna dibedakan: satu berfokus pada memisahkan progres instruksi dari penyelesaian store, sementara yang lain berfokus pada efisiensi trafik tulis.
Perbedaan ini juga mencegah kesalahan diagnosis umum. Fakta bahwa satu store sudah retire tidak memberi tahu antrean internal mana yang masih memegang datanya. Kesimpulan spesifik prosesor memerlukan performance counter atau dokumentasi arsitektur.
Keuntungan throughput bergantung pada seluruh jalur
Transaksi gabungan yang lebih lebar mengurangi overhead transaksi, tetapi throughput total tetap bergantung pada tujuan, interconnect, memory controller, perangkat, dan pola akses software. Combining tidak dapat membuat endpoint lambat menerima data lebih cepat dari batas perangkat itu sendiri.
Pengukuran sebaiknya memakai tujuan yang realistis dan ukuran data yang cukup besar untuk mencapai steady-state. Benchmark yang terlalu kecil sering lebih banyak mengukur setup, fencing, atau overhead timer. Pengujian dengan sinkronisasi terlalu sering juga dapat memaksa buffer terus dikosongkan sehingga tidak lagi mencerminkan workload streaming.
Untuk stream tulis yang sesuai, write combining mengubah banyak store CPU sempit menjadi trafik keluar yang lebih efisien. Keuntungannya datang dengan kontrak yang jelas: write dapat tertunda, readback bisa mahal, dan kode yang sensitif terhadap ordering harus memakai mekanisme yang ditentukan platform.