Liest eine "Null" aus dem Speicher schneller als das Lesen anderer Werte?

8

Ich führe ein Speicherzugriffsexperiment durch, bei dem eine 2D-Matrix verwendet wurde, wobei jede Zeile die Größe einer Speicherseite hatte. Das Experiment besteht darin, jedes Element unter Verwendung von Zeilen- / Spaltenmajor zu lesen und dann unter Verwendung von Zeilen- / Spaltenmajor auch in jedes Element zu schreiben. Die Matrix, auf die zugegriffen wird, wurde mit einem globalen Geltungsbereich deklariert, um die Programmieranforderungen zu erleichtern.

Der Punkt dieser Frage ist, dass, wenn die Testmatrix statisch deklariert wird, die Werte vom Compiler auf Null initialisiert werden und die Ergebnisse, die ich gefunden habe, ziemlich interessant waren. Wenn ich zuerst Operationen gelesen habe, d. H.

%Vor%

Dann ist mein colMajor_read-Vorgang sehr schnell beendet.

Wenn ich jedoch die Schreiboperationen vor dem Lesen mache, haben wir:

%Vor%

Und die Spalten-Major-Leseoperation ist um fast eine Größenordnung gestiegen.

Ich dachte mir, dass es etwas damit zu tun hat, wie der Compiler den Code optimiert. Da die globale Matrix für jedes Element gleich Null war, löste der Compiler die Leseoperationen vollständig? Oder ist es irgendwie "einfacher", einen Wert aus dem Speicher zu lesen, der gleich Null ist?

Ich gebe keine speziellen Compilerbefehle in Bezug auf Optimierungen, aber ich habe meine Funktionen auf diese Weise deklariert.

%Vor%

Weil ich auf Probleme gestoßen bin, bei denen der Compiler die temp Variable vollständig von der obigen Funktion entfernt hat, da sie nie benutzt wurde. Ich denke, dass sowohl volatile als auch __attribute__((unused)) redundant sind, aber ich habe es trotzdem eingefügt. Ich hatte den Eindruck, dass bei einer volatilen Variablen keine Optimierungen implementiert wurden.

Irgendwelche Ideen?

Ich habe die erzeugte Assembly betrachtet und die Ergebnisse sind für die Funktion colMajor_read identisch. Die nicht inline Version (Assembly): Ссылка

    
sherrellbc 31.10.2014, 17:21
quelle

1 Antwort

7

Überprüfen Sie die Speichernutzung Ihres Prozesses vor und nach dem Schreiben von Werten in die Matrix. Wenn es z. B. unter Linux im Abschnitt .bss gespeichert ist, werden die auf null gesetzten Seiten einer einzelnen schreibgeschützten Seite mit einer Semantik zum Kopieren und Schreiben zugeordnet. Also, obwohl Sie eine Reihe von Adressen lesen, lesen Sie vielleicht immer wieder dieselbe Seite des physischen Speichers.

Diese Seite Ссылка hat eine gute Erklärung.

Wenn das der Fall ist, setze die Matrix danach wieder auf Null und führe deinen Lesetest erneut aus und es sollte nicht mehr so ​​viel schneller sein.

    
FatalError 31.10.2014 17:58
quelle

Tags und Links