Mengapa ada cache L1 terpisah untuk data dan instruksi?

23

Baru saja membahas beberapa slide dan memperhatikan bahwa cache L1 (setidaknya pada Intel CPU) membedakan antara data dan cache instruksi, saya ingin tahu mengapa ini ..

Nils
sumber

Jawaban:

28

Sebenarnya ada beberapa alasan.

Pertama dan mungkin yang paling utama, data yang disimpan dalam cache instruksi umumnya agak berbeda dari apa yang disimpan dalam cache data - bersama dengan instruksi itu sendiri, ada penjelasan untuk hal-hal seperti di mana instruksi berikutnya dimulai, untuk membantu decoder. Beberapa prosesor (Misalnya, Netburst, beberapa SPARC) menggunakan "jejak cache", yang menyimpan hasil penguraian suatu instruksi daripada menyimpan instruksi asli dalam bentuk yang disandikan.

Kedua, ini sedikit menyederhanakan sirkuit - cache data harus berurusan dengan membaca dan menulis, tetapi cache instruksi hanya berurusan dengan membaca. (Ini adalah bagian dari mengapa kode modifikasi sendiri sangat mahal - alih-alih langsung menimpa data dalam cache instruksi, penulisan berjalan melalui cache data ke cache L2, dan kemudian baris dalam cache instruksi dibatalkan dan re -diisi dari L2).

Ketiga, meningkatkan bandwidth: kebanyakan prosesor modern dapat membaca data dari cache instruksi dan cache data secara bersamaan. Sebagian besar juga memiliki antrian di "pintu masuk" ke cache, sehingga mereka benar-benar dapat melakukan dua membaca dan satu menulis dalam siklus tertentu.

Keempat, ini bisa menghemat daya. Meskipun Anda perlu mempertahankan daya ke sel-sel memori sendiri untuk mempertahankan isinya, beberapa prosesor dapat / mematikan daya beberapa sirkuit terkait (decoder dan semacamnya) saat tidak digunakan. Dengan cache terpisah, mereka dapat menyalakan sirkuit ini secara terpisah untuk instruksi dan data, meningkatkan kemungkinan sirkuit tetap tidak bertenaga selama siklus tertentu (Saya tidak yakin prosesor x86 melakukan ini - AFAIK, ini lebih merupakan ARM benda).

Jerry Coffin
sumber
3
Penting juga untuk menyebutkan bahwa kode dan data dapat menunjukkan pola akses yang berbeda; misalnya, instruksi untuk menjumlahkan semua elemen dalam array menunjukkan temporal locality (instruksi yang sama sering digunakan (jika Anda melakukannya dengan loop)) dan data dalam array menunjukkan lokalitas spasial (data berikut digunakan selanjutnya).
gablin
1
@ gablin: sementara benar, perbedaan-perbedaan dalam pola-pola itu sering kali mendukung cache yang disatukan. Dalam loop ketat seperti yang Anda sebutkan, sebagian besar cache instruksi tidak digunakan. Cache terpadu pada dasarnya akan menggandakan ukuran cache data selama durasi loop.
Jerry Coffin
Tidak juga, karena ada lebih banyak kode setelah loop kecil itu dan itu juga kemungkinan akan bekerja dengan array. Itu mencirikan banyak sekali kode (mis., Penanganan string). Sebenarnya, cache pertama di CPU adalah cache terpadu - mereka berada di antara antarmuka memori utama CPU dan bus eksternal, yang merupakan tempat yang sederhana untuk meletakkannya - tetapi kami sekarang menggunakan cache yang dipartisi karena lebih cepat dalam praktiknya .
Donal Fellows
@Donal Fellows: Ya, sungguh. Saya sangat menyadari bagaimana caching awal dilakukan, dan mengapa mereka berubah menjadi cache split.
Jerry Coffin
5

Sama seperti real estat, penggunaan cache didorong oleh tiga hal: lokasi, lokasi, lokasi. Inti dari memiliki cache adalah bahwa sebagian besar program menunjukkan pola lokasi: jika mereka mengakses byte 1111111, maka byte berikutnya yang akan mereka akses mungkin 1111110 atau 1111112, dan tidak begitu banyak byte 9999999. Namun, sebagian besar program akan menunjukkan sangat berbeda pola lokasi untuk instruksi dan data mereka. Ini berarti bahwa tidak mungkin untuk instruksi dan data untuk dapat berbagi cache secara efisien. Karena instruksi dan data tidak harus saling berdekatan dalam memori. Akses data akan menabrak instruksi dari cache, dan memuat instruksi akan menabrak data dari cache.

Charles E. Grant
sumber