Wie lege ich meine Strukturvariable in CPU-Caches, um die Zugriffszeit auf die Hauptspeicherseite zu eliminieren? Optionen

8

Es ist klar, dass es keinen expliziten Weg oder bestimmte Systemaufrufe gibt helfen Programmierern, eine Variable in den CPU-Cache zu legen.

Aber ich denke, dass ein bestimmter Programmierstil oder gut gestaltet ist Algorithmus kann es ermöglichen, die Möglichkeiten zu erhöhen, die die Variable kann in die CPU-Caches zwischengespeichert werden.

Hier ist mein Beispiel:

Ich möchte eine 8-Byte-Struktur am Ende eines Array, bestehend aus, anfügen des gleichen Typs von Strukturen, die im globalen Hauptspeicher deklariert sind Region.

Dieser Prozess wird kontinuierlich für 4 Millionen Operationen wiederholt. Dieser Vorgang dauert 6 Sekunden, 1,5 us für jede Operation. Ich denke, dass dieses Ergebnis sagt, dass die zwei Speicherbereiche nicht zwischengespeichert worden sind.

Ich habe ein paar Hinweise von einem Cache-Vergessen-Algorithmus bekommen, also habe ich mehrere ausprobiert Möglichkeiten, dies zu verbessern. Bis jetzt keine Verbesserung.

Ich denke, einige clevere Codes können die verstrichene Zeit um bis zu 10 bis 100 reduzieren mal. Bitte zeig mir den Weg.

%Vor%

Angehangen (2011-04-01)

Damon ~ danke für deinen Kommentar!

Nachdem ich Ihren Kommentar gelesen hatte, habe ich meinen Code erneut analysiert und mehrere Dinge gefunden das habe ich vermisst. Der folgende Code, den ich anbrachte, ist die abgekürzte Version meines ursprünglichen Codes.

Um die Ausführungszeit jeder Operation genau zu messen (im ursprünglichen Code gibt es mehrere verschiedene Arten von Operationen), habe ich den Zeitmesscode mit clock_gettime() function eingefügt. Ich dachte, wenn ich die Ausführungszeit jeder Operation messe und sie akkumuliere, können die zusätzlichen Kosten durch die Hauptschleife vermieden werden.

Im ursprünglichen Code wurde der Zeitmesscode durch eine Makrofunktion verdeckt, also habe ich es total vergessen.

Die Laufzeit dieses Codes beträgt fast 6 Sekunden. Aber wenn ich die Zeitmessfunktion in der Hauptschleife los werde, wird es 0,1 Sekunden.

Da die Funktion clock_gettime() eine sehr hohe Genauigkeit (bis zu 1 Nanosekunde) unterstützt, die auf der Grundlage eines unabhängigen Threads ausgeführt wird, und auch eine sehr große Struktur erfordert, Ich denke, die Funktion verursachte das Auslagern des Hauptspeicherbereichs, in dem die aufeinanderfolgenden Einfügungen ausgeführt werden.

Nochmals vielen Dank für Ihren Kommentar. Zur weiteren Verbesserung wird jeder Vorschlag sehr hilfreich sein, um meinen Code zu optimieren.

Ich denke, die hierarchisch definierte Strukturvariable könnte unnötige Zeitkosten verursachen, aber zuerst möchte ich wissen, wie viel es sein würde, bevor ich es in den C-style-Code ändere.

%Vor%     
Nate 31.03.2011, 13:48
quelle

2 Antworten

3

Sie fügen die Struktur nicht in einen Cache ein. Die CPU erledigt das automatisch für Sie. Die CPU ist noch cleverer als das; Wenn Sie auf sequentiellen Speicher zugreifen, wird es anfangen, Dinge aus dem Speicher in den Cache zu legen bevor Sie sie lesen.

Und es sollte wirklich vernünftig sein, dass für einen einfachen Code wie dieser die Zeit, die Sie für das Messen ausgeben, zehnmal mehr ist als die Zeit, um den Code auszuführen (anscheinend 60 Mal in Ihrem Fall).

Da du so viel Vertrauen in clock_gettime () hast: Ich schlage vor, du nennst es fünfmal hintereinander und speicherst die Ergebnisse, dann druckst du die Unterschiede aus. Es gibt Auflösung, Präzision, und es dauert, wie lange es dauert, die aktuelle Zeit zurückzugeben, die verdammt lang ist.

    
gnasher729 04.04.2014 17:24
quelle
2

Ich konnte das Caching nicht erzwingen, aber Sie können Speicher erzwingen, der nicht zwischengespeichert werden kann. Wenn Sie große Datenstrukturen haben, schließen Sie diese möglicherweise aus, damit sie Ihre Caches nicht verschmutzen. Dies kann durch Angabe von PAGE_NOCACHE für die Windows VirutalAllocXXX-Funktionen erfolgen.

Ссылка

    
IvoTops 28.06.2012 10:07
quelle

Tags und Links