2011-10-18 11 views
9

czytałem ten question, chciałem zapytać się więcej o kodzie że pokazał tjPOMYLENIA czasowych i przestrzennych miejscowości w kodzie prawdziwym życiu

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

pytania są

  1. Rozumiem tymczasowa lokalność, myślę, że odniesienia do i i j powinny być tymczasową lokalnością. Czy mam rację?
  2. Rozumiem także położenie przestrzenne, ponieważ pytanie, które łączyłem, odpowiedzi, które odnoszą się do [i] powinny być przestrzenne. Czy mam rację?
  3. Osoba powiedział

    „Wewnętrzna pętla zadzwoni sam adres pamięci przy dostępie do [I] dziesięć razy więc to przykład dla miejscowości skroniowej chyba. Ale jest tam lokalizację przestrzenną także w powyższa pętla? "

    Nie zgadzam się z jego domysłem. Ponieważ referencje wygenerowane przez [i] powinny być lokalną przestrzenią (będą odnosić się do następnego elementu w bloku). Czy mam rację?

Odpowiedz

18

pierwsze, odniesienia do var może być czasowo lokalny lub przestrzennie lokalny nie czasowa lokalizacja, co jest niewłaściwe gramatyki. Drobny punkt.

Teraz, na twoje pytania.

  1. Zasada Temporal miejscowości stwierdza, że ​​dwie instrukcje odwołać tę samą lokalizację w stosunkowo krótkim czasie. Na przykład w podanym kodzie często występuje odniesienie a[i], przy czym instrukcje takie jak a[i] = a[i] * 2 i a[i] = a[i] * 3 są wykonywane bardzo blisko siebie. Jeśli przyjrzymy się temu zakresowi, możemy powiedzieć, że odniesienia do j i a[i] są czasowo lokalne. Odnośniki do i są również tymczasowo lokalne, ponieważ i jest przywoływany za każdym razem, gdy jest a[i]. Jeśli jednak ostatnia linia danego kodu brzmi jak a[j] = a[j] * j, odniesienia do i nie będą tymczasowo lokalne, przynajmniej w zakresie wewnętrznej pętli [1].

  2. Zasada działania Miejsce przestrzenne stwierdza, że ​​dwie instrukcje odnoszą się do sąsiednich lokalizacji pamięci. Odniesienia do a[i] są tego dobrym przykładem, ponieważ można założyć (przez większość czasu), że a[0] i a[1] będą obok siebie w pamięci.

  3. Dwa pierwsze w zasadzie obejmują to, ale cytowany tekst jest poprawny, a kod demonstruje również położenie przestrzenne.

[1] - Ogólnie rzecz biorąc, gdy mówimy o miejscowości, to będzie w kontekście danego poziomu w hierarchii pamięci, czy to RAM lub pamięci podręcznej L1 lub co ty. We wszystkich, ale w ograniczonym sensie, odniesienia do i i j są tymczasowo lokalne.

+0

Dzięki za odpowiedź. Czy możesz wyjaśnić moje pojęcia dotyczące zmiennych i lokalizacji. Zmienna j zostanie zwiększona za każdym razem, gdy wykonywana jest pętla wewnętrzna i otrzyma nową wartość. Uzyskanie nowej wartości NIE jest przestrzenną lokalizacją (nawet jeśli wzrasta o 1 za każdym razem)? –

+0

@Akito prawidłowa, przestrzenna lokalizacja może wystąpić tylko pomiędzy dwoma * różnymi * lokalizacjami w pamięci. Ponieważ 'j' odnosi się do tej samej lokalizacji za każdym razem, odniesienia do' j' nie są przestrzennie lokalne. – brc

+0

Czy możesz również rozwinąć termin używane referencje. Co to znaczy? –

2

Zewnętrzna pętla jest przykładem lokalizacji przestrzennej. Kolejno zwiększa adres wewnętrznych połączeń w pętli.

Wewnętrzna pętla demonstruje tymczasową lokalizację. Dokładny adres pamięci jest dostępny dziesięć razy z rzędu i mnożony przez j za każdym razem.

Jeśli chodzi o pierwsze dwa pytania, zarówno i, jak i j (liczniki pętli) są bardzo dobrymi przykładami lokalizacji czasowej.

Lokalizacja jest miarą stosowaną przez pamięć podręczną w celu zminimalizowania liczby wywołań w pamięci. Jeśli instrukcja musi znać wartość adresu pamięci, który nie znajduje się jeszcze w pamięci podręcznej, uzyska dostęp do pamięci i zapisze również wszystkie lokalizacje pamięci w pamięci podręcznej.

Powiązane problemy