Ist Speicher überall gleich schnell?



  • Also wenn man Speicher reserviert weiß man ja nie genau welche Adresse man als nächstes kriegt - kann man sagen das kleine Adressen besser sind oder bestimmte andere Bereiche besser als andere?? 😕
    Ich denke mal im allgemeinen sollte man doch die Adressen möglichst nah bei einander halten damit der Schreib/Lesezeiger ➡ nicht so weit wandern muss?

    Achja gibt es eigentlihc die Möglichkeit dem Betriebssystem zu sagen das man gern eine bestimmte Speicheradresse rseverieren will? z.B. 0xDEADBABE 😃

    Thx



  • A. Monk schrieb:

    Ich denke mal im allgemeinen sollte man doch die Adressen möglichst nah bei einander halten damit der Schreib/Lesezeiger ➡ nicht so weit wandern muss?

    Du verwechselst hier Festplatten und RAM! Während bei Festplatten ein Lesekopf über die Platten fährt, auf denen physikalisch Daten gespeichert sind, und diese ausließt, erfolgt sowohl Speicherung als auch Zugriff beim RAM elektronisch (deshalb ist der auch resettet, wenn einmal der Strom weg ist, wie es z.B. beim Neustart des PCs der Fall sein sollte). 😉



  • A. Monk schrieb:

    Achja gibt es eigentlihc die Möglichkeit dem Betriebssystem zu sagen das man gern eine bestimmte Speicheradresse rseverieren will? z.B. 0xDEADBABE 😃

    unter win gibts z.b. 'VirtualAlloc', da kannst du die adresse angeben.
    das geht aber nur in vielfachen der grösse einer page, also alle 0x1000 bytes oder so...
    🙂



  • A. Monk schrieb:

    Also wenn man Speicher reserviert weiß man ja nie genau welche Adresse man als nächstes kriegt - kann man sagen das kleine Adressen besser sind oder bestimmte andere Bereiche besser als andere?? 😕
    Ich denke mal im allgemeinen sollte man doch die Adressen möglichst nah bei einander halten damit der Schreib/Lesezeiger ➡ nicht so weit wandern muss?

    Im Speicher gibt es keinen Schreiblesekopf. Der Zugriff auf den Speicherblock ist immer gleichschnell.

    Dennoch kann es verschiedene Speicherblöcke geben, die unterschiedlich schnell ausgelegt sind. Beim Amiga gab es zwei Speicherblöcke, das Chip-RAM und das Fast-RAM.
    Während das ChipRAM für alle Prozessoren im Amiga zugänglich war, war das Fast-RAM nur für den Hauptprozessor reserviert. So konnte die CPU die volle Bandbreite nutzen, auf den Chip-RAM musste er sich die Bandbreite mit allen anderen Prozessoren teilen - der Zugriff war entsprechend langsamer.
    Fordert man Speicher an, bekommt man normalerweise FastRAM. Möchte man jedoch Daten für einen anderen Prozessor verfügbar haben, muss man zusätzlich angeben, dass man Chip-RAM benötigt.



  • Das wichtigste, worauf es beim RAM-Zugriff heute ankommt ist die Speicherlokalität. Der Speicherzugriff wird gecached (siehe Speicherhierarchie) und du profitierst am meisten davon, wenn deine Zugriffe so organisiert werden, dass du nacheinander auf nebeneinander liegende Adressen zugreifst.

    Welche Adressen das genau sind ist nicht so wichtig, da die Adressen sowieso komplett virtualisiert werden.



  • AFAIK ist Speicher am PC immer gleich schnell angebungen. Wenn man Module mit unterschiedlichen Geschwindigkeiten verwendet wird immer die Geschwindigkeit des langsamsten Moduls verwendet. Und wenn man z.B. 2x 512 MB dual channel hat und dann ein 3. MB Modul dazusteckt ... theoretisch könnte der Controller dann die ersten beiden Module immer noch dual channel anfahren und das 3. Modul eben single channel - würde mich aber wundern wenn ein Controller das könnte. Und selbst wenn: das ist eine Sache um die sich das OS zu kümmern hat. Weil das Beispiel AMIGA erwähnt wurde: am AMIGA gibt es aus genau dem Grund RAM Prioritäten, und FAST-RAM hat eine höhere Priorität als CHIP-RAM. Solange noch genügend FAST-RAM frei ist bekommt man also auch FAST-RAM, es sei denn man fordert ausdrücklich CHIP-RAM an. (lokales RAM auf Turbokarten kommt als erstes, dann ZORRO-3 FAST-RAM, dann ZORRO-2 FAST-RAM und dann irgendwann CHIP-RAM.)

    Eine bestimmten Adressbereich (virtuelle Adressen!) kann man normalerweise anfordern, nur ist nicht gesagt dass dieser frei ist. Im Allgemeinen sollte man das aber dem OS überlassen.

    Ansonsten: wirklich viel bringt es nur wenn man dafür sorgt dass Zugriffe direkt hintereinander erfolgen, also nicht nur nahe zusammen sondern quasi "ohne ein Byte auszulassen". (OK, real kann man ein paar Bytes auslassen, aber man sollte keine ganze Cacheline auslassen.)
    Und genau das kann man eigentlich nur sicherstellen wenn man den Speicher gleich als einen einzigen Block anfordert (Arrays etc.). Von daher ist es dann aber wieder egal wo der Speicher genau liegt - er liegt "am Stück", und das ist das einzige was wichtig ist.
    Um den Rest soll sich der Allocator kümmern, also dass Speicheranforderungen eines Threads so nahe wie möglich beieinander bleiben.


Anmelden zum Antworten