Uczę się logiki pamięci podręcznej. Zastanawiam się, czy możesz sprawdzić, czy dobrze zrozumiałem. Jeśli pamięć podręczna w polu tagu ma 16 bitów, ustawione pole ma 10 bitów, a bajt w polu bloku to 6 bitów, wtedy mogę wywnioskować tylko z tych informacji że pojemność wynosi 128 kB i jest 2-kierunkowo ustawiana asocjacyjnie z rozmiarem bloku 64 bajty, ponieważ 2⁶ = 64 bajty z bajtu w polu bloku. 2¹ but = 1024, ale czy inna pojemność z innym numerem skojarzenia może spełnić wymagania?
Dowiedziałem się, że formuły to
liczba bloków = pojemność / rozmiar bloku
liczba zestawów = liczba bloków / # skojarzenie
Dlatego Mógłbym podwoić zarówno asocjatywność do 4-way, ale nie mogłem spełnić wymagań z 4-way cache, ponieważ to wo uld wymagają innej liczby bitów w ustawionym polu.
Czy dobrze zrozumiałem?
Odpowiedź
Czy to zdjęcie pomoże ci zrozumieć, jak działają asocjacyjne pamięci podręczne strukturalnie?
wypożyczonego z tutaj
Krótko mówiąc, bity przesunięcia bloku określają rozmiar twojego bloku (ile bajtów znajduje się w wierszu pamięci podręcznej, ile kolumn, jeśli chcesz). Bity indeksu określają, ile wierszy znajduje się w każdym zestawie. Pojemność pamięci podręcznej wynosi zatem 2 ^ (bity przesunięcia bloku + bity indeksu) * #sets. W tym przypadku jest to 2 ^ (4 + 4) * 4 = 256 * 4 = 1 kilobajt.
Dla tej samej wielkości pamięci podręcznej (pojemności), gdybyś miał przejść z 4 do sposób zestaw asocjacyjny, to dwukierunkowy asocjacyjny, możesz to zrobić, podwajając wiersze w każdym zestawie lub podwajając kolumny w każdym zestawie, co oznacza podwojenie liczby wierszy pamięci podręcznej lub podwojenie rozmiaru bloku.
Jeśli zdecydujesz się podwoić liczbę wierszy, Twój 12-bitowy adres zostanie podzielony na 5-bitowy indeks i 4-bitowe przesunięcie bloku, pozostawiając 3-bitowy znacznik.
Gdybyś zdecydował się podwoić rozmiar bloku, skończyłbyś z rozbiciem 12-bitowego adresu na 4-bitowy indeks, 5-bitowe przesunięcie bloku, pozostawiając 3-bitowy znacznik.
Aby powtórzyć, myślę, że formuły rządzące dla asocjacyjnych pamięci podręcznych są następujące:
Cache Capacity = (Block Size in Bytes) * (Blocks per Set) * (Number of Sets) Index Bits = LOG2(Blocks per Set) Block Offset Bits = LOG2(Block Size in Bytes) Tag Bits = (Address Bits) - (Index Bits) - (Block Offset Bits)
W twoim pierwotnie podanym przykładzie nie ” myślę, że możesz wydedukować rozmiar pamięci podręcznej na podstawie rozmiaru odpowiednich pól bitowych adresu bez robienia założeń ut asocjatywności. Jeśli jest skojarzony dwukierunkowo, możesz powiedzieć:
Pojemność pamięci podręcznej = (2 ^ 6) * (2 ^ 10) * (2) = 2 ^ 18 = 2 ^ 8 kilobajtów = 256 kilobajtów. Nie jestem pewien, skąd wzięło się 128 kilobajtów. Byłoby tak, gdyby była to jednokierunkowa asocjacja (bezpośrednie mapowanie).
W przypadku 128kB (2 ^ 17 bajtów) pamięci podręcznej mógłby utworzyć czterokierunkową asocjacyjną pamięć podręczną o rozmiarze bloku 64 bajtów, mówiąc:
2^17 = 2^6 * (Blocks per Set) * 4 Blocks per Set = 2^17 / 2^6 / 2^2 = 2^9 = 512
… a zatem przydzielając 9 bitów indeksu, 4 bity przesunięcia bloku a pozostałe (19) bity znaczników.