Was kostet der Speicherzugriff?

8

Wir denken gerne, dass ein Speicherzugriff schnell und konstant ist, aber auf modernen Architekturen / Betriebssystemen stimmt das nicht unbedingt.

Betrachten Sie den folgenden C-Code:

%Vor%

Was sind die geschätzten Kosten dieser letzten Zuweisung in CPU-Anweisungen, wenn

  • i ist im L1-Cache,
  • i ist im L2-Cache,
  • i befindet sich im L3-Cache,
  • i ist im richtigen RAM,
  • i wird auf eine SSD-Platte ausgelagert,
  • i wird auf eine herkömmliche Festplatte ausgelagert?

Wo sonst kann i sein?

Natürlich sind die Zahlen nicht absolut, aber ich bin nur an Größenordnungen interessiert. Ich habe versucht, die Netze zu durchsuchen, aber Google segnete mich dieses Mal nicht.

    
György Andrasek 14.06.2010, 16:33
quelle

6 Antworten

13

Hier einige Zahlen, die zeigen, dass die genauen Zeiten von CPU-Familie und Version zu Version variieren: Ссылка

Diese Zahlen sind eine gute Anleitung:

%Vor%

Und als Infograph, um Ihnen die Größenordnungen zu geben:

(src < a href="http://news.ycombinator.com/item?id=702713"> Ссылка )

    
Will 14.06.2010, 16:42
quelle
3

Norvig hat einige Werte von 2001. Die Dinge haben sich seither verändert, aber ich denke, die relativen Geschwindigkeiten sind immer noch grob korrigieren.

    
Ken 14.06.2010 17:16
quelle
1

Es könnte auch in einem CPU-Register sein. Das C / C ++ - Schlüsselwort "register" weist die CPU an, die Variable in einem Register zu belassen, aber Sie können nicht garantieren, dass sie dort bleibt oder überhaupt eintritt.

    
dmarth 14.06.2010 16:46
quelle
1

Solange der Cache / RAM / Harddisk / SSD nicht damit beschäftigt ist, andere Zugriffe zu bedienen (zB DMA-Anfragen) und die Hardware einigermaßen zuverlässig ist, sind die Kosten immer noch konstant (obwohl sie eine große Konstante sein können) / p>

Wenn Sie einen Cache-Fehler bekommen, und Sie müssen auf Festplatte lesen, um die Variable zu lesen, dann ist es nur eine einfache Leseanforderung, diese Kosten sind riesig, da die CPU: Interrupt zum Lesen der Festplatte an den Kernel senden muss Anfrage, sende eine Anfrage an die Festplatte, warte auf die Festplatte, um die Daten in den RAM zu schreiben, lese dann die Daten aus dem RAM in den Cache und in ein Register. Diese Kosten sind jedoch immer noch Kosten.

Die tatsächlichen Zahlen und Proportionen hängen von Ihrer Hardware und der Kompatibilität Ihrer Hardware ab (z. B. wenn Ihre CPU mit 2000 MHz arbeitet und Ihr RAM Daten mit 333 MHz sendet, dann werden sie nicht gut synchronisiert). Der einzige Weg, wie Sie das herausfinden können, besteht darin, es in Ihrem Programm zu testen.

Und das ist keine vorzeitige Optimierung, das ist Mikrooptimierung. Lassen Sie den Compiler sich um diese Art von Details kümmern.

    
Lie Ryan 14.06.2010 16:46
quelle
1

Diese Zahlen ändern sich ständig. Aber für grobe Schätzungen für 2010, Kathryn McKinley hat schöne Folien im Internet , die ich hier nicht kopieren muss.

Der gewünschte Suchbegriff ist "Speicherhierarchie" oder "Speicherhierarchiekosten".

    
Norman Ramsey 14.06.2010 17:17
quelle
0
  
    

Wo kann ich sonst sein?

  

i und *i sind unterschiedliche Dinge. Beide können sich an einem beliebigen Ort in Ihrer Liste befinden. Die Zeigeradresse kann bei der Zuweisung zusätzlich noch in einem CPU-Register gespeichert werden, so dass sie nicht aus dem RAM / Cache / ... abgerufen werden muss.

Hinsichtlich der Leistung: Dies ist hoch CPU-abhängig. In Größenordnungen zu denken, ist der Zugriff auf RAM schlechter als der Zugriff auf Cache-Einträge und der Zugriff auf ausgelagerte Seiten ist am schlimmsten. Alle sind ein wenig unvorhersehbar, weil sie auch von anderen Faktoren abhängen (d. H. Anderen Prozessoren, abhängig von der Systemarchitektur).

    
Alexander Gessler 14.06.2010 16:46
quelle