Bingung antara lokalitas Temporal dan Spasial dalam kode kehidupan nyata

Saya sedang membaca pertanyaan ini, saya ingin bertanya lebih banyak tentang kode tersebut yang dia tunjukkan yaitu

for(i = 0; i < 20; i++)
    for(j = 0; j < 10; j++)
        a[i] = a[i]*j;

Pertanyaannya adalah,

  1. Saya memahami lokalitas temporal, menurut saya referensi ke i dan j harus berupa lokalitas temporal. Apakah saya benar?
  2. Saya juga memahami lokalitas spasial, karena pertanyaan yang saya kaitkan menjawab bahwa referensi ke a[i] haruslah lokalitas spasial. Apakah saya benar?
  3. #P3#
    #P4#
    #P5#

person Community    schedule 18.10.2011    source sumber


Jawaban (4)


Pertama, referensi ke var bisa lokal sementara atau lokal spasial bukan lokalitas sementara, yang merupakan tata bahasa yang tidak tepat. Poin kecil.

Sekarang, ke pertanyaan Anda.

  1. Prinsip Lokalitas temporal menyatakan bahwa dua instruksi mereferensikan lokasi yang sama dalam jangka waktu yang relatif singkat. Misalnya, dalam kode yang diberikan, a[i] sering direferensikan, dengan instruksi seperti a[i] = a[i] * 2 dan a[i] = a[i] * 3 dieksekusi sangat berdekatan. Jika kita melihat cakupan ini, kita dapat mengatakan bahwa referensi ke j dan a[i] bersifat lokal sementara. Referensi ke i juga bersifat lokal sementara, karena i direferensikan setiap kali a[i] ada. Namun, jika baris terakhir kode yang diberikan berbunyi seperti a[j] = a[j] * j, maka referensi ke i tidak akan bersifat lokal sementara, setidaknya dalam cakupan loop dalam[1].

  2. Prinsip Lokalitas spasial menyatakan bahwa dua instruksi mereferensikan lokasi memori yang berdekatan. Referensi ke a[i] adalah contoh bagus untuk hal ini, karena orang dapat berasumsi (sebagian besar waktu) bahwa a[0] dan a[1] akan bersebelahan dalam memori.

  3. Dua yang pertama pada dasarnya mencakup hal ini, tetapi teks yang dikutip benar, dan kode tersebut juga menunjukkan lokalitas spasial.

[1] - Secara umum, ketika Anda berbicara tentang lokalitas, itu akan berada dalam konteks tingkat tertentu dalam hierarki memori, apakah itu RAM atau cache L1 atau apa pun yang Anda miliki. Dalam semua hal kecuali dalam arti yang paling terbatas, referensi ke i dan j bersifat lokal sementara.

person brc    schedule 18.10.2011
comment
Terima kasih atas jawabannya. Bisakah Anda memperjelas konsep saya tentang variabel dan lokalitas. Variabel j akan bertambah setiap kali loop dalam dijalankan dan akan mendapatkan nilai baru. Mendapatkan nilai baru BUKAN lokalitas spasial (meskipun setiap kali bertambah 1)? - person ; 18.10.2011
comment
@Akito benar, lokalitas spasial hanya dapat terjadi antara dua lokasi berbeda di memori. Karena j merujuk ke lokasi yang sama setiap kali, referensi ke j tidak bersifat lokal secara spasial. - person brc; 18.10.2011
comment
Bisakah Anda menjelaskan juga istilah referensi yang digunakan. Maksudnya itu apa? - person ; 18.10.2011
comment
referensi ke variabel seperti j berarti bahwa nilai j diakses atau diubah. Jadi, a[i] adalah referensi ke nilai i dan apa pun yang disimpan di a[i]. - person brc; 18.10.2011

Menulis jawaban ini karena saya tidak mengerti bahkan setelah membaca jawaban lain pada pertanyaan ini, beberapa pertanyaan lain dan wikipedia (itu lebih membingungkan.)

Saya rasa kami menghabiskan banyak waktu dan energi untuk memahami terminologi yang agak membingungkan/rumit dalam kasus ini. Saya merasa lebih mudah untuk memahaminya ketika saya tidak memperhatikan istilah 'spasial' dan 'temporal'.

Mari kita mulai dengan dasar-dasarnya.

Mari kita coba memahami apa itu cache - tempat yang lebih cepat diakses dibandingkan memori utama. Itu keren. Tapi tempat ini terbatas dan mahal, jadi sebaiknya gunakan dengan bijak. Namun bagaimana Anda (atau OS) memutuskan apa yang akan dimasukkan ke dalam cache dan apa yang tidak akan dimasukkan? Seharusnya ada cara untuk mengetahui apa yang kita butuhkan di masa depan.. ah prediksi masa depan! (Laporan Minoritas! Bunyikan loncengnya?).

Harus ada cara untuk menentukan kebutuhan program di masa depan. Dengan menggunakan akal sehat dan kodenya, kita dapat mengatakan bahwa beberapa bagian kode bersifat berulang - contoh - loop! Jika ada variabel i di dalam satu lingkaran, Anda tahu variabel itu akan diakses berulang kali dalam waktu dekat. Inilah prinsip di balik lokalitas temporal. saya dapat dibawa ke cache karena bersifat lokal sementara.

Di area lain jika kode menggunakan struktur data linier (contoh: Array) dan itu juga dalam satu lingkaran dengan kenaikan indeks, maka mudah untuk melihat bahwa meskipun kebutuhan saat ini hanya lokasi ke-3 (misalnya) dari struktur data ini, lokasi berikutnya juga akan segera diperlukan karena indeks meningkat sebesar 1 untuk struktur data linier tersebut. Jadi alangkah baiknya jika kita membawa datanya di beberapa lokasi berikutnya juga. Inilah prinsip di balik lokalitas spasial. Beberapa lokasi berikutnya dapat dimasukkan ke dalam cache karena bersifat lokal secara spasial.

Konsep lokalitas pada dasarnya adalah mengidentifikasi data dan instruksi untuk memasukkan cache sehingga kita dapat mengurangi kesalahan cache dan memanfaatkan tempat khusus ini secara efektif.

person Saurabh Patil    schedule 21.07.2018
comment
BTW, ada 2 cara untuk memanfaatkan lokalitas spasial: 1) baris cache menampung banyak item, jadi memenuhi 1 permintaan akan menyiapkan cache untuk permintaan terdekat. 2) prefetching: mendeteksi pola akses berurutan dan mulai memuat baris cache yang akan segera dibutuhkan, sebelum menemui permintaan yang terlewat. CPU memiliki logika prefetch perangkat keras untuk cache L1/L2/L3. Cache perangkat lunak (seperti cache disk yang dikelola OS) memerlukan logika pengambilan awal dalam perangkat lunak. - person Peter Cordes; 22.07.2018
comment
@PeterCordes: Terima kasih atas poin tersebut. 1. Tidak mengerti apa yang Anda maksud dengan baris cache yang menampung banyak baris - Saya pasti melewatkan sesuatu yang mendasar, tolong jelaskan, saya gagal dalam kursus Mikroprosesor saat lulus :) 2. Jadi cache L1/L2/L3 bukan OS dikelola? - person Saurabh Patil; 12.12.2018
comment
Beberapa item, mis. ints berukuran 16 kata dalam baris cache 64 byte. Dan tidak, cache CPU tidak dikelola OS. Permintaan cache adalah instruksi memuat atau menyimpan, dan kesalahan cache terlalu sering terjadi untuk menangani kesalahan dalam perangkat lunak bahkan untuk L3 saja. Cache bersama yang koheren penting agar banyak inti dapat berkomunikasi secara efisien, jadi Anda benar-benar memerlukan HW untuk mengimplementasikan koherensi cache MESI. - person Peter Cordes; 12.12.2018
comment
Banyak item (dan instruksinya saya kira?). Mengerti. Kembali ke lokalitas spasial, apakah Anda menyarankan pada poin 1 bahwa pengambilan keputusan terjadi di tingkat lini dan bukan di tingkat item? Dan item berikutnya yang dimuat akan menjadi instruksi default berikutnya tanpa pengambilan keputusan nyata (oleh CPU/HW)? - person Saurabh Patil; 12.12.2018

Lingkaran luar adalah contoh lokalitas spasial. Ini secara berurutan menambah alamat panggilan for-loop bagian dalam.

Lingkaran dalam menunjukkan lokalitas temporal. Alamat memori yang sama diakses sepuluh kali berturut-turut, dan dikalikan dengan j setiap kali.

Adapun dua pertanyaan pertama Anda, i dan j (penghitung loop) adalah contoh yang sangat baik dari lokalitas temporal.

Lokalitas adalah ukuran yang diterapkan oleh cache untuk meminimalkan panggilan ke memori. Jika suatu instruksi perlu mengetahui nilai alamat memori yang belum ada dalam cache, maka instruksi tersebut akan mengakses memori dan menyimpan semua lokasi memori di sekitarnya dalam cache juga.

person Steve Barna    schedule 18.10.2011

Mari kita mulai dengan mendefinisikan Lokalitas Temporal dan Spasial.

Lokalitas Temporal - Lokalitas temporal berarti data atau instruksi terkini yang sedang diambil mungkin diperlukan segera. Jadi kita harus menyimpan data atau instruksi tersebut dalam memori cache sehingga kita dapat menghindari pencarian data yang sama lagi di memori utama dan dengan demikian menghemat waktu.

Lokalitas Spasial - Lokalitas spasial berarti instruksi atau data yang dekat dengan lokasi memori saat ini yang sedang diambil, mungkin diperlukan segera dalam waktu dekat.

sum = 0;
for (i = 0; i < arr.length; i++)
  sum += arr[i];
return sum;

Sekarang lihat contoh ini, Di sini jumlah variabel digunakan berulang kali yang menunjukkan Lokalitas Temporal dan kemudian nilai array arr diakses secara berurutan yaitu arr[0], arr[1], arr [2] ,... dan seterusnya dan yang menampilkan Lokalitas spasial karena array merupakan blok memori Berdekatan(berdekatan) sehingga data yang dekat dengan lokasi memori saat ini diambil.

Sekarang lihat contoh ini

for(i = 0; i < 20; i++)
    for(j = 0; j < 10; j++)
        a[i] = a[i]*j;

Di sini kita melihat lokalitas temporal sebagai a[i] di loop kedua digunakan berulang kali dan kemudian variabel j diakses untuk menunjukkan Lokalitas Spasial.

person Shubham Jain    schedule 15.02.2019
comment
Pada contoh kedua Anda, j adalah skalar, jadi semua j diakses sekaligus. Itu lokalitas temporal untuk a[i] dan j di loop dalam. (Tentu saja, setiap kompiler yang layak akan menyimpannya dalam register untuk loop dalam, bukan menyimpan/memuat ulang kecuali Anda menonaktifkan pengoptimalan. Tapi mungkin yang Anda maksudkan ini sebagai kodesemu untuk asm, bukan C sebenarnya untuk dikompilasi dengan kompiler pengoptimal. Karena bagus kompiler akan membuka gulungan bagian dalam sepenuhnya dan mengubahnya menjadi a[i] *= 0*1*2*3*4*5*6*7*8*9, yaitu mengalikan a[i] dengan konstanta waktu kompilasi.) Sebenarnya hanya a[i] = 0, karena Anda memasukkan 0 sebagai faktor. - person Peter Cordes; 15.02.2019