Frage

Also ich Versammlung lehrt Bin, und wir haben einen Auftrag, den die Zeitdifferenz zwischen dem Lesen aus dem Speicher zu finden ist und aus dem Cache zu lesen. Wir müssen dies tun, indem zwei Schleifen zu schaffen und Timing ihnen. (Eines aus dem Hauptspeicher liest und die andere aus dem Cache). Die Sache ist, ich weiß es nicht und kann nichts finden, das mir sagt, wie aus entweder Cache oder Hauptspeicher = / zu lesen. Können Sie Kerle mir helfen? Ich tue dies in MASM32. Ich verstehe, wie Schleifen zu machen und auch die meisten der Sprache Montage, aber ich kann es einfach nicht lesen machen = /


Edit:

Ich habe eine Frage, ich habe dies getan ...

mov ecx, 100 ;loop 100 times
xor eax, eax ;set eax to 0
_label:
mov eax, eax ;according to me this is read memory is that good?
dec ecx ;dec loop
jnz _label ;if still not equal to 0 goes again to _label

... wäre das in Ordnung sein?


Edit 2:

gut, dann habe ich nicht die Absicht, hebeln und ich schätze Ihre Hilfe, ich habe nur noch eine Frage, da diese zwei Schleifen ich zu tun habe. Ich brauche sie irgendwie zu vergleichen, ich habe für eine Timer-Anweisung aus, aber ich habe nicht ich habe nur gefunden: timeGetTime , GetTickCount und Performance Counter , aber soweit ich verstehe diese Anweisungen kehrt die Systemzeit nicht die Zeit, die für die Schleife zu beenden. Gibt es einen Weg, um tatsächlich das tun, was ich will? oder ich muss einen anderen Weg denken?

, auch aus verschiedenen Registern in der zweiten Schleife zu lesen (die man nicht aus dem Cache zu lesen) ist es in Ordnung, wenn ich verschiedene „mov“ Anweisungen geben? oder bin ich völlig weg Basis hier?

Sorry für all diese Fragen aber nochmals vielen Dank für Ihre Hilfe.

War es hilfreich?

Lösung

aus dem Cache zu lesen. eine Schleife, die aus der gleichen (oder sehr ähnlichen) Speicheradresse lautet:

  • Sie zum ersten Mal von dieser Adresse zu lesen, die Werte aus dieser Speicheradresse (und von anderen, in der Nähe Speicheradresse) wird in dem Cache verschoben wird
  • Die Weiter Zeit, die Sie von diesem lesen gleiche Adresse, werden die Werte bereits zwischengespeichert und so sind Sie aus dem Cache zu lesen.

uncached Speicher zu lesen, eine Schleife, die aus vielen lesen, sehr verschieden (d.h. weiter voneinander entfernt als die Cache-Größe) Speicheradressen.


Ihre zweite Frage zu beantworten:

  • Die Dinge, die Sie mit ECX tun und jnz OK aussehen (ich weiß nicht, wie genau / empfindlich Ihre Timer sind, aber Sie könnten mehr als 100 Mal in einer Schleife wollen)

  • Die mov eax, eax nicht "Lese-Speicher" ... es ist ein no-op, die EAX in EAX bewegt. Stattdessen denke ich, dass die MASM Syntax für Lesen aus dem Speicher ist etwas mehr wie mov eax,[esi] ( „lesen die aus der Speicherstelle, deren Adresse in esi enthalten“)

  • Je nachdem, welche O / S Sie verwenden, die Sie von einer Speicheradresse lesen muss, die tatsächlich existiert und lesbar ist. Unter Windows würde zum Beispiel eine Anwendung nicht zu tun mov esi, 0 von mov eax, [esi] gefolgt erlaubt sein, da eine Anwendung nicht erlaubt ist, den Speicher, deren Adresse zu lesen / Lage Null ist.


Ihre dritte Frage zu beantworten:

  

timeGetTime, GetTickCount und Performance Counter

Ihre Erwähnung timeGetTime, GetTickCount und Performance Counter bedeutet, dass Sie unter Windows ausführen.

Ja, das die aktuelle Zeit, um verschiedene Auflösungen / Genauigkeiten zurück: zum Beispiel GetTickCount eine Auflösung von etwa 50 ms hat, so dass es nicht zu Zeit Ereignissen, die weniger als 50 ms dauern, ist ungenau, wenn Ereignisse Timing, das nur dauern 50 bis 100 ms. Deshalb sagte ich, dass 100 in Ihrem ecx wahrscheinlich nicht groß genug ist.

Die QueryPerformanceCounter Funktion ist wahrscheinlich das genaueste Timer, die Sie haben.

Um eine dieser Timer als Intervall-Timer zu verwenden:

  • die Zeit bekommen, bevor Sie eine Schleife
  • starten
  • Get wieder die Zeit, nachdem Sie fertig sind Looping
  • subtrahieren diese beiden Zeiten: Der Unterschied ist das Zeitintervall
  

ist es in Ordnung, wenn ich verschiedene "mov" Anweisungen geben?

Ja, ich denke schon. Ich denke, dass Sie es so machen können (Vorsicht Ich bin nicht sicher / weiß nicht mehr, ob dies die richtige MASM Syntax von einem Namen Speicherplatz zu lesen) ...

mov eax,[memory1]
mov eax,[memory2]
mov eax,[memory3]
mov eax,[memory4]
mov eax,[memory5]

... wo memory1 durch memory5 sind Adressen von weit auseinanderliegende globalen Variablen in dem Datensegment.

Oder Sie tun können ...

mov eax,[esi]
add esi,edx
mov eax,[esi]
add esi,edx
mov eax,[esi]
add esi,edx
mov eax,[esi]
add esi,edx
mov eax,[esi]

... wo esi auf den Boden eines langen Teils des Speichers zeigt, und edx ist einiger Zuwachs, die etwa ein Fünftel der Länge des Blockes gleich ist.

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