Ich experimentiere mit einem Programm, um zu sehen, ob sein Caching-Verhalten mit meinem konzeptionellen Verständnis übereinstimmt.
Dazu benutze ich den Perf Befehl:
%Vor%um das Cache-Miss-Verhältnis des folgenden einfachen C -Programms aufzuzeichnen:
%Vor%Ich erhalte ein Cache-Miss-Verhältnis von 50.212%. Wenn ich das Array-Zugriffsmuster wie folgt ändere:
%Vor%Ich bekomme, dass das Cache-Miss-Verhältnis 22.206% ist.
Diese Ergebnisse sind überraschend für mich.
Die Antwort ist ziemlich einfach: Compiler optimieren Ihre Aufgaben. So sieht die Disassemblierung für Ihren Code aus:
%Vor% Wie Sie sehen können, wurden für die Zeile arr[i * N + j] = 10.0;
keine Assembler-Anweisungen generiert, so dass diese Cache-Misses, die Sie mit perf beobachten, nicht zusammenhängen.
Die Lösung ist ziemlich einfach. Fügen Sie einfach volatile
zur Zeigerdeklaration hinzu und erzwingen Sie, dass der Compiler die Zuweisungen generiert, d. H .:
Die Demontage jetzt:
%Vor%Und es gibt noch viel mehr Cache-Fehler.
Wenn Sie Ihren Test nur einmal ausführen, erhalten Sie möglicherweise sehr laute Ergebnisse. Sie sollten Ihre Messungen einige Male durchführen und einen Median nehmen. Es gibt Benchmark-Frameworks wie Google Benchmark. Sehen Sie sich das bitte an.
Und der letzte. Beide Ihrer Muster, wie i * N + j
und j * N + i
, sind vom CPU-Prefetcher leicht zu erkennen, daher sollte das Cache-Miss-Verhältnis in beiden Fällen ziemlich ähnlich sein ...
Tags und Links c memory performance caching perf