C++Guns – RoboBlog

06.03.2019

Profiler read/write miss Gedanken

Filed under: Allgemein — Tags: — Thomas @ 16:03

Profiler read/write miss Gedanken

write miss: unterscheiden zwischen permanenten und temporäre Daten:
Permanente Daten: wohl unausweichlich, denn die neuen Daten MÜSSEN ja vom Chache in den Hauptspeicher geschrieben werden.
Temporäre Daten: eventuell vermeidbar, wenn man sie an einer späteren Stelle im Code erstellt. Wann immer Daten in den Cache geschrieben werden, fliegen andere Daten raus die eventuell gerade erst aufwendig geladen wurden.

read miss: Unterscheiden zwischen permanent und temporären Daten:
Permanente Daten: wohl unausweichlich. wenn man über einen Datensatz iteriert der größer als der Cache ist, MÜSSEN die Daten vom Hauptspeicher in den Cache geladen werden.
Temporäre Daten: eventuell vermeidbar. Selbe Argumentation wie bei write miss.

Eine temporäre/local scope Variable wird erstellt und in den Cache geschrieben. Dabei fallen eventuell wichtige Daten aus dem Cache. Nun passieren andere Berechnungen die auch in den Cache geschrieben werden. Dabei kann die temp. Variable in den Hauptspeicher ausgelagert werden. Später muss sie wieder vom Hauptspeicher wieder in den Cache geladen werden.

Cache misses auf temporäre Daten womöglich vermeidbar. Auf permanente Daten wohl unvermeidlich. Sso kann es vorkommen, dass das Laden der Daten mehr Zeit kostet als die eigentlichen arithmetischen Berechnungen damit. Profiler die nur Zeiten anzeigen, können nicht benutzt werden um zu Entscheiden ob etwas optimiert werden kann.
Die Addressberechnung und das Laden der Daten in den Cache ist teuer. Vorallem wenn die Daten nicht hintereinander im RAM liegen.
Wenn 10 Werte aus 10 Container geladen werden, sind 10 Cache Zeilen belegt. Da immer Cachezeilen-Byte viele Daten geladen werden (64byte??)
Wenn ein struct a 10 Member geladen wird, geschieht nur Speicherzugriff an einer Stelle im RAM und es wird auch nur eine (oder wenige) Cache Zeilen belegt.
Cache Zeilen sind wertvoll. es gibt nur wenige davon (CPU abhängig).
Ganz schlimm ist es, wenn in der nächsten Iteration an ganz anderer Stelle im Array zugegriffen wird. Dann sind alle geladenen Cachezeilen ungültig. Auch bei kontinuierlicher RAM Benutzung.
(Das ist DAS Problem bei Dreiecksnetzten)
Faustformel: arithmetische Operation +-*/ kostet 1-40. Main RAM read kostet 100-500

No Comments

No comments yet.

RSS feed for comments on this post.

Sorry, the comment form is closed at this time.

Powered by WordPress