Forum: Compiler & IDEs Recycling der Speicheradresse für Cache


von Ano N. (oorim)


Angehängte Dateien:

Lesenswert?

Servus

Ich möchte für meinen Cache die Adresse für den realen Speicher 
wiederverwenden für das Tag und den Index im Cache, ggf. auch das Set 
wenn es ein N-Way-Set ist - siehe Anhang.

So, nun stellt sich mir folgende Frage: Wenn ich den realen Speicher 
voll nutze ist das ja dufte. Aber wenn nicht hab ich ja lücken, dann 
könnte es ja sein das ein Set oder bei Direct Mapped ein Index NIE 
genutzt wird ... Ignorieren oder gibts dafür ne Lösung?

Grüße

von (prx) A. K. (prx)


Lesenswert?

Ano Nym schrieb:

> Ich möchte für meinen Cache die Adresse für den realen Speicher
> wiederverwenden für das Tag und den Index im Cache, ggf. auch das Set
> wenn es ein N-Way-Set ist - siehe Anhang.

Bahnhof.

Ich gehe im Folgenden mal davon aus, dass du normale Caches meinst, und 
nicht irgendwas Exotisches.

> So, nun stellt sich mir folgende Frage: Wenn ich den realen Speicher
> voll nutze ist das ja dufte. Aber wenn nicht hab ich ja lücken

Wenn du wie jeder normal denkende Mensch das RAM am Stück in den 
Adressraum legst, dann gibts ein paar Tags, die nicht vorkommen. Und?

Wenn alles RAM im untersten Viertel des Adressraum liegt, dann kannst du 
beispielsweise die oberen beiden Tag-Bits einsparen und den übrigen 
Adressraum am Cache vorbei führen - so wurde es früher bei externen 
Caches häufig gemacht.

Lücken gibts nur, wenn die Anzahl Bits für Index/Set+Byte grösser sind 
als die Adressbits vom RAM. Aber das passiert nur, wenn der Cache 
grösser ist als das RAM ;-), oder du das RAM sehr bös zerstückelt in den 
Adressraum legst.

von Ano N. (oorim)


Lesenswert?

Ich meine normale Caches ja. Funktioniert halt als Direct Mapped (Direkt 
Adressiert), Fully Associative (Zeuch kann überall stehen) und N-Way-Set 
Associative (Mischung aus beidem).

Was ich meine ist: Ich hab mir aus meinem Speicher Adressen mit einer 
Formel erzeugt (page+block*64). Der Raum wäre dann von 0 bis 
64+2048*64=131.136. Primitiv, vll unsinnig aber tut hier nix zur Sache.

Wenn ich jetzt die Adresse zerstückel und über 50 Elemente die Zahl 5 
für den Index nicht vorkommt wäre der Index im Cache ja für die Füße ... 
Einfach nicht dran stören weil "ist so"?

Achtung: Ich fang jetzt an laut zu denken :)
Ich hab mal das Test-Pattern für die Zugriffe angehängt. Schwer aber es 
ist zu erkennen das gewisse Adressen einfach nicht vorkommen - 510 zum 
Beispiel. Das entspräche 0b00000000 00000000 00000001 11111110 (Adresse 
ist 32bit) ... Das wäre ja recht ungünstig für das Tag ... Blöd Oo

von Ano N. (oorim)


Angehängte Dateien:

Lesenswert?

Bild

von (prx) A. K. (prx)


Lesenswert?

Ano Nym schrieb:

> Ich meine normale Caches ja. Funktioniert halt als Direct Mapped (Direkt
> Adressiert), Fully Associative (Zeuch kann überall stehen) und N-Way-Set
> Associative (Mischung aus beidem).

Fein. Caches sind mir recht gut vertraut.

> Was ich meine ist: Ich hab mir aus meinem Speicher Adressen mit einer
> Formel erzeugt (page+block*64). Der Raum wäre dann von 0 bis
> 64+2048*64=131.136. Primitiv, vll unsinnig aber tut hier nix zur Sache.

Immer noch Bahnhof. Gedankenlesen kann ich nicht. Vielleicht hilft es, 
wenn du dich etwas systematischer und vor allem vollständiger 
ausdrückst.

(page+block*64) ist zwar eine Formel, aber niemand ausser dir weiss, wo 
du page/block herholst und was du mit diesen Begriffen meinst. Wonders 
als in dieser Formel sind nämlich weder page noch block bisher in deinem 
Text aufgekreuzt und beide Begriffe sind in der Nomenklatur von Caches 
nicht universell gebräuchlich. Auch die "64" lässt sich nicht zuordnen.

Bleib anfangs mal beim direct mapped cache.

von (prx) A. K. (prx)


Lesenswert?

PS: Was hat das eigentlich mit dem GCC (=>Forum) zu tun?

von Ano N. (oorim)


Lesenswert?

Problem: Ich kann nicht einfach beim Direct Gemappten sein weil der 
Simulator den ich bau jeden der 3 beinhalten soll - modular natürlich 
sonst wärs ja langweilig ... Hab ich mir übrigens so nicht ausgesucht :)



Nun, der reale Speicher - also da wo das Zeug drin steht das im Cache 
zwischengelagert werden soll - besteht aus Pages und Blöcken. 2048 
Blöcke zu je 64 Pages. Um nun eine Adresse zu bilden die jedes der 
64*2048 Elemente Eineindeutig abbildet addier ich die jeweilige Page mit 
ihrem Block und verpasse Block noch einen Offset (5+3 = 3+5 aber 5+2*3 
!= 3+5*2).

So, nun verwende ich das Feld byte einfach mal nicht, die Info welches 
gebraucht wird übergeb ich anders.
Hab ich also bei 32bit Adresse 32bit nur für den Index/Set und für das 
Tag.

Im Beispiel mit den 512 würde das Bedeuten:
511 = 0b00000000 00000000 00000001 11111111
  Index = 8bit (0-256 Elemente reichen...) = 0b11111111
  Tag = 0b00000000 00000000 00000000 00000001

512 = 0b00000000 00000000 00000001 11111110
  Index =  = 0b11111110
  Tag=32bit-8bit=24bit--> 32bit genommen =0b00000000 00000000 00000000 
00000001

513 = 513 = 0b00000000 00000000 00000010 00000001
  Index = 0b00000001
  Tag = 0b00000000 00000000 00000000 00000010

Wie man sieht haben 511 und 512 das gleiche Tag, aber einen anderen 
Index/Set.

Passt es also doch so?


Ich bin auch etwas verwirrt was das Thema angeht, deshalb auch der etwas 
dämliche Text hier von mir :( Ich geb mir wirklich mühe das Verständlich 
rüber zu bringen was ich als Problem hab :D

Warum GCC? Wo sonst hin ... dachte in GCC gehts um Programmieren auch 
wenn das ne PC Software wird

von (prx) A. K. (prx)


Lesenswert?

Ano Nym schrieb:

> Problem: Ich kann nicht einfach beim Direct Gemappten

Ich meinte es für diese Betrachtung hier, um es sprachlich zu 
vereinfachen.

> Nun, der reale Speicher - also da wo das Zeug drin steht das im Cache
> zwischengelagert werden soll - besteht aus Pages und Blöcken. 2048
> Blöcke zu je 64 Pages.

Ok. Soweit hat das mit dem Aufbau deines Speichers zu tun, aber nicht 
mit dem Cache. Könntest also auch genausgut die Adressen über 0..128K 
wandern lassen, statt die Betrachtung mit 2 Variablen zu 
verkomplizieren.

> ihrem Block und verpasse Block noch einen Offset (5+3 = 3+5 aber 5+2*3
> != 3+5*2).

Was ist für dich ein Offset? Offsets werden gemeinhin addiert, nicht 
multipliziert.

> So, nun verwende ich das Feld byte einfach mal nicht, die Info welches
> gebraucht wird übergeb ich anders.

Nun wirds interessant.

> Hab ich also bei 32bit Adresse 32bit nur für den Index/Set und für das
> Tag.

Das funktioniert nur, wenn der Adressraum nicht 4G Bytes sondern 4G 
Cache-Lines umfasst.

> Im Beispiel mit den 512 würde das Bedeuten:
> 511 = 0b00000000 00000000 00000001 11111111
>   Index = 8bit (0-256 Elemente reichen...) = 0b11111111
>   Tag = 0b00000000 00000000 00000000 00000001

Ich schliesse daraus, dass dein bisher in seinen Parametern streng 
geheim gehaltener Cache als direct mapped verstanden 256 Lines umfasst.

> 512 = 0b00000000 00000000 00000001 11111110

Dein hübsch dargestellter Binärwert entsprich 510. Anderer Index, 
gleiches Tag, ja. Und?

von (prx) A. K. (prx)


Lesenswert?

Ano Nym schrieb:

> Warum GCC? Wo sonst hin ... dachte in GCC gehts um Programmieren auch
> wenn das ne PC Software wird

Die "GCC" Ecke ist für Probleme da, die mit dem GCC Compiler selbst zu 
tun haben, nicht für alle Probleme, die man irgendwie mit Programmierung 
lösen kann.

von (prx) A. K. (prx)


Lesenswert?

Wenn du einen Zähler sequentiell oder zufällig über 0..131071 laufen 
lässt und daraus die statistische Verteilung der Cache-Indizes 
ermittelst, was kommt dann raus? Bei mir: Index ist gleichverteilt und 
ohne Lücken.

Wenn du nun statt dessen zwei verschachtelte oder zufällige Zähler 
verwendest, block=0..2047 und page=0..63, daraus eine Adresse 0..131071 
erzeugst, und nun die Indizes nicht mehr gleichverteilt sind, dann 
stimmt was mit deiner Rechnung nicht.

von Ano N. (oorim)


Lesenswert?

Egal wie es funktioniert ja. Selbst wenn ich 10x das gleiche Tag habe 
habe ich 10 unterschiedliche Indezes oder Sets ;)


Ich lass das Byte Feld weg, dafür übergeb ich im Simulator direkt 
welches Byte ich aus dem Speicher haben möchte. Wird auch im Zielsystem 
nicht benutzt.

Falls Informationen fehlen tut mir das leid, weiß ja nicht was alles 
interessant ist ...

Gehen wir weiter:
Eine Cache Line soll 2kB groß sein. 256Elemente im Cache würden dann 
512kB entsprechen. Mehr ist für den Cache nicht angedacht, daher ist 
"index" auf 8bit begrenzt, reicht ja.
Wenn ich das Bytefeld weglasse und die Adresse 32bit lang ist bleiben 
für das Tag 24bit übrig. So komm ich da drauf ;)

> 512 = 0b00000000 00000000 00000001 11111110
Warum das falsch ist, keine Ahnung. Ich hatte google machen lassen :)

Und zu den Zugriffszahlen:
Page und Block sind jeweils gleichverteilte Zufallszufahlen. Die beiden 
Addiert und Block zusätzlich gewichtet (nicht mit einem Offset versehen, 
stimmt) ergeben die Adresse von 0 bis 131.136.

Egal wie, qed - es ist ja schon bewiesen/gesagt das es funktioniert. 
Denn selbst bei gleichbleibendem Tag ändert sich der Index/das Set.

Danke. Und falls hier alles etwas wirr geschrieben ist tut mir das leid 
- liegt einzig und allein an meinen wirren Gedanken :)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.