Mengapa kecepatan menulis untuk RAM kurang dari kecepatan membaca? Dan bagaimana cache masuk ke dalam gambar?

5

Pertama, ini benar, bukan? Saya merasa bahwa membaca akan selalu lebih cepat dari menulis, juga orang ini di sini melakukan beberapa eksperimen untuk "membuktikan" itu. Dia tidak menjelaskan mengapa, hanya menyebutkan "masalah caching". (dan eksperimennya tampaknya tidak khawatir tentang pengambilan awal)

Tapi saya tidak mengerti kenapa. Jika itu penting, mari kita asumsikan kita sedang berbicara tentang arsitektur Nehalem (seperti i7) yang memiliki cache L1, L2 untuk setiap core dan kemudian cache L3 inklusif bersama.

Mungkin ini karena saya tidak mengerti dengan benar bagaimana membaca dan menulis bekerja, jadi saya akan menulis pemahaman saya. Tolong beritahu saya jika ada sesuatu yang salah.

If I read some memory, following steps should happen: (assume all cache misses)

    1. Check if already in L1 cache, miss
    2. Check if in L2 cache, miss
    3. Check if in L3 cache, miss
    4. Fetch from memory into (L1?) cache

Tidak yakin tentang langkah terakhir. Apakah data meresap ke dalam cache, artinya dalam hal cache miss memory dibaca ke L3 / L2 / L1 terlebih dahulu dan kemudian membaca dari sana? Atau dapatkah "memotong" semua cache dan kemudian cache terjadi secara paralel untuk nanti. (baca = akses semua cache + ambil dari RAM ke cache + baca dari cache?)

Then write:

    1. All caches have to be checked (read) in this case too
    2. If there's a hit, write there and since Nehalem has write through caches, 
write to memory immediately and in parallel
    3. If all caches miss, write to memory directly?

Sekali lagi tidak yakin tentang langkah terakhir. Dapatkah menulis dilakukan "mem-bypass" semua cache atau penulisan melibatkan selalu membaca ke dalam cache terlebih dahulu, memodifikasi salinan yang di-cache dan membiarkan perangkat keras write-through benar-benar menulis ke lokasi memori dalam RAM? (menulis = membaca semua cache + mengambil dari RAM ke cache + menulis ke cache, menulis ke RAM secara paralel ==> menulis hampir merupakan superset dari membaca?)

pengguna2898278
sumber
1
Tolong jangan lintas pos antara situs SE. Tandai salah satu mod untuk meminta dan / atau tunggu mod untuk memigrasi pertanyaan Anda yang lain di sini. Jika Anda menginginkannya di sini dan tidak di sana, karena Anda sudah memposting kedua tempat, silakan pertimbangkan untuk pergi dan menghapusnya dari SO.
Ƭᴇcʜιᴇ007
1
Membaca sesuatu itu pasif, menulis (mengubah) sesuatu itu aktif. Aktivitas hampir selalu lebih sulit daripada kepasifan. ;)
Ƭᴇcʜιᴇ007
@ user2898278 - Apakah Anda memiliki sumber yang mungkin lebih andal daripada blog acak?
Ramhound
Anda memiliki sesuatu yang salah di sini. Setiap bit data diatasi ... tidak ada tingkat cache yang menetes mencari data seolah-olah Anda sedang menebak.
M.Bennett

Jawaban:

4

Memori harus menyimpan bitnya di dua negara yang memiliki penghalang energi besar di antara mereka, atau pengaruh terkecil akan mengubah bit. Tetapi ketika menulis ke memori itu, kita harus secara aktif mengatasi penghalang energi itu.

Untuk mengatasi penghalang energi dalam RAM, Anda harus menunggu sementara energi dipindahkan. Cukup mencari untuk melihat bit yang diatur membutuhkan waktu lebih sedikit.

Untuk lebih detail, lihat MSalters jawaban yang sangat baik untuk pertanyaan yang agak mirip .

Saya tidak cukup yakin tentang detail bagaimana caching berinteraksi dengan RAM untuk menjawab bagian pertanyaan itu dengan otoritas apa pun, jadi saya akan menyerahkannya kepada orang lain.

David
sumber
Terima kasih untuk ini. Saya sekarang lebih mengerti mengapa tulisan "murni" akan lebih lambat daripada tulisan murni. Tetapi seberapa besar perbedaan faktor elektronik yang dihasilkan? Maksud saya, apakah perbedaannya semata-mata karena faktor elektronik sekitar 1,5 kali antara bandwidth baca dan tulis? Ada ide? (murni, maksud saya tidak termasuk cache)
user2898278
3

Tulis Kasus: Jika Anda memiliki sesuatu untuk ditulis ke memori dan Anda memiliki pengontrol memori yang baik, mengabaikan semua caching, yang harus Anda lakukan adalah mengirim transaksi ke pengontrol memori dengan data yang ingin Anda tulis. Karena aturan pemesanan memori, segera setelah transaksi meninggalkan inti, Anda dapat beralih ke instruksi berikutnya karena Anda dapat menganggap perangkat keras menangani penulisan ke memori. Ini berarti menulis hampir tidak memerlukan waktu sama sekali.

Baca Kasus: Di sisi lain, membaca adalah operasi yang sama sekali berbeda dan sangat dibantu oleh caching. Jika Anda perlu membaca dalam data, Anda tidak dapat melanjutkan ke langkah berikutnya dalam program Anda sampai Anda benar-benar memiliki data di tangan. Itu berarti Anda perlu memeriksa cache terlebih dahulu dan kemudian memori untuk melihat di mana data itu. Tergantung di mana data berada, latensi Anda akan berkurang karenanya. Dalam inti non-threading, non-pipelined, sistem non-prefetching, Anda hanya membakar siklus inti yang menunggu data untuk kembali sehingga Anda dapat melanjutkan ke langkah berikutnya. Cache dan memori adalah urutan besarnya lebih lambat dari kecepatan inti / ruang register. Inilah sebabnya mengapa membaca jauh lebih lambat daripada menulis.

Kembali ke transaksi tulis, satu-satunya masalah yang mungkin Anda temui dengan kecepatan adalah jika Anda melakukan pembacaan setelah transaksi penulisan ke alamat yang sama. Dalam hal ini, arsitektur Anda perlu memastikan bahwa bacaan Anda tidak melompati tulisan Anda. Jika ya, Anda akan mendapatkan kembali data yang salah. Jika Anda memiliki arsitektur yang benar-benar cerdas, karena penulisan itu menyebar ke memori, jika membaca ke alamat yang sama datang, perangkat keras dapat mengembalikan data jalan sebelum keluar ke memori. Bahkan dalam kasus baca-setelah-menulis ini, bukan menulis yang butuh waktu dari sudut pandang inti, tetapi membaca.

Dari perspektif RAM:Bahkan jika kita tidak berbicara tentang inti dan kita hanya berbicara tentang RAM / pengontrol memori, menulis ke MC akan mengakibatkan MC menyimpannya dalam buffer dan mengirim respons kembali yang menyatakan bahwa transaksi selesai ( meskipun tidak). Menggunakan buffer, kita tidak perlu khawatir tentang kecepatan menulis DIMM / RAM yang sebenarnya karena MC akan membereskannya. Satu-satunya pengecualian untuk kasus ini adalah ketika Anda melakukan blok penulisan yang besar dan melampaui kemampuan buffer MC. Dalam hal ini, Anda harus mulai khawatir tentang kecepatan tulis RAM. Dan itulah yang dimaksud dengan artikel tertaut. Maka Anda harus mulai khawatir tentang keterbatasan fisik kecepatan membaca dan menulis yang disentuh jawaban David. Biasanya itu adalah hal yang bodoh untuk dilakukan inti; itu sebabnya DMA diciptakan.

horta
sumber