Frage

Ich versuche, aus dem Hauptspeicher mit masm32 Montage und zu lesen, um dies zu tun Ich habe ein Array (wie zuvor in einer Antwort auf ein meine Fragen hier empfohlen), die auf die stark getrennt Speicherplatz (in der Reihenfolge enthalten vermeiden aus dem Cache zu lesen). Ich habe es geschafft, die Array zu erstellen und haben es gelesen, aber ich habe ein Problem. Dieses Array habe ich schon getestet und ist die Arbeit mit Daten Ich habe es (das heißt Zahlen) und alles funktioniert. Aber ich brauche Speicherplatz und ich kann nicht überall eine Karte oder Verweise auf diejenigen finden. Ich meine, ich brauche so etwas wie:

my_arr db 5, 2, 8, 9, 1, 7, 3, 0, 4, 6

, sondern Zahlen der Verwendung sollte ich die entsprechenden Speicherplatz reserviert Wörter werden. Aber ich kann sie nicht finden = (oder sogar eine Vorstellung davon haben, was sonst noch zu achten ist.


Bearbeiten

Lassen Sie mich nur prüfen, ob ich es richtig bekam, Sie dann sagen Sie mir, dass ich (statt eine Reihe von mit den Variablen mit dem ganzen Raum nutzt dazwischen wie aus dem Hauptspeicher zu zwingen, zu lesen oder?

War es hilfreich?

Lösung

Dies ist ein Array von (zusammenhängenden) Bytes, wie Sie gesagt:

my_arr db 5, 2, 8, 9, 1, 7, 3, 0, 4, 6

Dies ist eine Variable, die mit 10 MB (der mit der CPU-Cache ist groß im Verhältnis) belegt:

wasted_space BYTE 10485760 DUP(?)

Hier sind mehrere Variablen mit viel Platz verschwendet zwischendurch:

my_var_1 db 5
spacer_1 BYTE 10485760 DUP(?)
my_var_2 db 2
spacer_2 BYTE 10485760 DUP(?)
my_var_3 db 8
spacer_3 BYTE 10485760 DUP(?)
my_var_4 db 9
spacer_4 BYTE 10485760 DUP(?)
my_var_5 db 1
spacer_5 BYTE 10485760 DUP(?)
my_var_6 db 7
spacer_6 BYTE 10485760 DUP(?)
my_var_7 db 3
spacer_7 BYTE 10485760 DUP(?)
my_var_8 db 0
spacer_8 BYTE 10485760 DUP(?)
my_var_9 db 4
spacer_8 BYTE 10485760 DUP(?)
my_var_10 db 6

Dieses (Variablen in dem Datensegment zu schaffen) ist eine Möglichkeit, einige Datenspeicher-Adressen (die Variablen die Adresse enthalten ... besser gesagt, die Variablen an Adressen) zu erhalten.

Eine weitere Möglichkeit, Speicheradressen zu erhalten, ist O / S-APIs aufrufen, die Speicher aus dem Heap reservieren und geben die Adresse des zugewiesenen Speicher, zum Beispiel vielleicht die HeapAlloc oder VirtualAlloc APIs.


Ich weiß nicht, warum Sie diese in ASM zu tun (außer Montage zu lernen). Wenn es um das Caching zu lernen ist, ich habe gedacht, dass Sie es tun könnten genauso gut (und leichter) unter Verwendung von C.

Wie auch immer, ich habe gespannt Caching: wie viel Platz genug ist, einen Cache-Miss zu verursachen? Wie viele verschiedene Variablen notwendig sind, um zu beginnen Misses zu verursachen (vorausgesetzt, dass der Cache geteilt und so können einige (aber nur wenige) weit auseinanderliegende Speicher-Caches enthalten)?

It (Caching) hat, im Laufe der Jahre zu einem komplizierten Thema, offenbar. http://lwn.net/Articles/252125/ ist ein Artikel aus Wikipedia verlinkt sind. Dieser Artikel enthält einige Grafiken, zum Beispiel Abbildung 3.11:. Sequential Read für verschiedene Größen

Andere Tipps

Indirekte Speicherzugriff in Assembly

Um das Bytes im Array als Speicheradressen zu behandeln, müssen Sie sie in ein Register laden, die als Basisadresse dienen können, und dann die durch das Register wiesen Speicher zugreifen:

MOV AX, [MY_ARR+3]  ; Element 3 in array, that is 9
MOV BX, [AX]        ; Read from that address

Über Caches

Beachten Sie, dass Ihr Cache wahrscheinlich viel größer als die Spanne von Speicheradressen ist durch diese Anordnung bedeckt, so würden alle in den Cache passen.

Bedenken Sie auch, dass Ihr Cache wahrscheinlich assoziativ ist, was bedeutet, dass Adressen sehr weit auseinander zusammen in den Cache passen können, wenn sie nicht passieren auf den gleichen (voll) Cache-Zeilen sein.

So führen Sie aus tatsächlich den Cache und die Garantie, dass Sie direkt auf den Speicher zugreifen müssen, sollten Sie (in einer Schleife) Zugriff auf eine Reihe von aufeinanderfolgenden Speicherplätzen größer als Cache. D. h ein Array so groß wie Ihr Cache erstellen. auch berücksichtigen, dass es wahrscheinlich mehr Schichten von Cache sind (L1, L2, L3 und möglicherweise weiter), so wie groß müssen Sie sein, hängt davon ab, welche Cache Sie wollen überrannt.


Ich schrieb ein Programm in C Zeitspeicher und Cache-Zugriffe wie das einmal, und mit einem gewissen statistischen Berechnung und Kompensation für die Zeitmessung Overhead (die in einem solchen kurzen Zeitskalen nicht zu vernachlässigen ist), habe wirklich genaue Ergebnisse ( die so genau gemacht werden könnte je nach Bedarf durch den Test für längeren Lauf und für die Standardabweichung warten zu gehen).

Mein Programm war jedoch nicht der effizienteste Weg, dies zu tun, und auch viel über die Assoziativität des Cache nicht andeuten (ich würde das separat mit Kenntnis der Farbgebung messen müssen). Allerdings getan beide waren ziemlich effizient in einer relativ architekturunabhängige Weise mit ein paar Gedanken-out Tricks in der SIGMETRICS 2005 Arbeiten von Larry McVoy und Carl Staelin .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top