Forum: PC-Programmierung Tool zum Takte zählen


von Michael S. (freak25)


Lesenswert?

Guten Morgen Community,

könnt ihr mir sagen mit welchem Tool ich die Takte meines Programmes 
zählen lassen kann. Ich möchte eine Leistungsberechnung für mein Code, 
welches in ASM(Pentium Architektur) geschrieben ist, dürchführen. Da 
brauche ich die Anzahl der Takte bis mein Programme endet.
Oder gibt es eine Möglichkeit diese Information im Visual Studio 2008 
auszulesen.

Danke im Voraus

MfG

von Hmm (Gast)


Lesenswert?

Das ist aus einer Reihe von Gründen nicht trivial.
Aber es gibt die wesentlich einfacherer Möglichkeit ein Testprogramm zu 
schreiben, das Deinen Code auruft und die Zeit wischen Aufruf und return 
zu stoppen. Was für ein Betriebssysstem läuft?

Falls keines, geht das auch mit einer Stoppuhr. Gegebenfalls, rufst Du 
den Code einach zehn, hundert oder tausendmal auf oder auch öfter, damit 
Du eine Zeit erhälst, die Du von Hand stoppen kannst.

von Michael S. (freak25)


Lesenswert?

Ok verstehe, diese Möglichkeit werde ich mir merken. Im schlimmsten Fall 
muss ich das wohl so machen. Aber ich würde gerne das Ganze rechnerisch 
lössen wollen, weil ich einen durchschnittlichen CPI Wert brauche.
Ich habe mein ASM Code optimiert. Ich würde gerne ziemlich genau die 
Ausführungszeit beider Codes in µs vergleichen wollen. Gibt es da keine 
Tools dafür.

VTune Performance Analyzer ist eigentlich ziemlich das was ich suche, 
aber bei Intel kann man das nicht mehr downloaden :(...

von Arc N. (arc)


Lesenswert?

RDTSC mit div. Einschränkungen
http://en.wikipedia.org/wiki/Time_Stamp_Counter
bzw. QueryPerformanceCounter

Ansonsten mit den Profiling Tools des VS
http://msdn.microsoft.com/en-us/library/bb385770%28v=vs.90%29.aspx

von Sven P. (Gast)


Lesenswert?

Michael Schmidt schrieb:
> Ich habe mein ASM Code optimiert.
Läuft das nachher unter einem Betriebssystem?

von Michael S. (freak25)


Lesenswert?

Arc Net schrieb:
> RDTSC mit div. Einschränkungen

Danke Arc Net...
RDTSC ist ein Zähler für den Prozessortakt, soweit ich das Verstanden 
habe. Ist RDTSC sozusagen ein Unterprogramme für x86 Prozessoren? Wenn 
ich das in mein Assembler einbinde funktioniert das zwar, aber es 
erfolgt keine Ausgabe. Ich habe mir auch Beispielcodes angeschaut, aber 
funktionieren tut das nicht :S...

Sven P. schrieb:
> Läuft das nachher unter einem Betriebssystem?

Nein...Es ist nur eine Berechnung und Ausgabe von Primzahlen

von Arc N. (arc)


Lesenswert?

Michael Schmidt schrieb:
> RDTSC ist ein Zähler für den Prozessortakt, soweit ich das Verstanden
> habe. Ist RDTSC sozusagen ein Unterprogramme für x86 Prozessoren?

Das ist nur ein Befehl zum Auslesen des Zählers, die Frequenz mit der 
der Zähler hochzählt ist dabei u.U. nicht konstant und solange nicht 
alle Interrupts gesperrt sind auch von dem abhängig was sonst noch auf 
dem Prozessor/Kern läuft (unter Windows gäbe es 
SetThreadAffinityMask/SetProcessAffinityMask um festzulegen wo der 
Thread/Prozess läuft).

> Wenn ich das in mein Assembler einbinde funktioniert das zwar, aber es
> erfolgt keine Ausgabe.

?????

> Ich habe mir auch Beispielcodes angeschaut, aber
> funktionieren tut das nicht :S...

Heißt? eax, edx verändern sich nach rdtsc nicht?

> Nein...Es ist nur eine Berechnung und Ausgabe von Primzahlen

Und die Messung?

von Dirk Wolfgang Glomp (Gast)


Lesenswert?

Moin.

"Frank Kotler" war so nett ein kleines Demo zu schreiben, um die 
Ausführungsgeschwindigkeit einiger Befehle zu messen.
Genauer gesagt aus dem nun folgenden Listing können zwei 
unterschiedliche Anwendungen erstellt werden(siehe Kommentar zum 
Assemblieren), die jeweils eine Messung der Ausführungsgeschwindigkeit 
bestimmter Befehle vonehmen.
In diesem Fall geht es darum es zu messen, ob eine Kombination aus Push- 
und POP-Befehle schneller ausgeführt werden, als eine vergleichbare 
Kombination von MOV- und MOV-Befehle. Die beiden Anwendungen sind für 
ein 32 Bit-Linux im Intel-Syntax geschrieben worden und zeigen wie der 
RDTSC-Befehl verwendet werden kann.

[quote]
Best,
Frank Kotler
1
; nasm -f elf pushvsmov.asm -d_MOV (or "-d_PUSH")
2
; ld -o pushvsmov pushvsmov.o
3
4
global _start
5
6
section .bss
7
    eax_sav resd 1
8
    ebx_sav resd 1
9
    ecx_sav resd 1
10
    edx_sav resd 1
11
    esi_sav resd 1
12
    edi_sav resd 1
13
14
section .text
15
_start:
16
    nop
17
    xor eax, eax
18
    cpuid
19
    rdtsc
20
    push edx
21
    push eax
22
%ifdef _MOV
23
    mov [eax_sav], eax
24
    mov [ebx_sav], ebx
25
    mov [ecx_sav], ecx
26
    mov [edx_sav], edx
27
    mov [esi_sav], esi
28
    mov [edi_sav], edi
29
30
    mov edi, [edi_sav]
31
    mov esi, [esi_sav]
32
    mov edx, [edx_sav]
33
    mov ecx, [ecx_sav]
34
    mov ebx, [ebx_sav]
35
    mov eax, [eax_sav]
36
%elifdef _PUSH
37
    push eax
38
    push ebx
39
    push ecx
40
    push edx
41
    push esi
42
    push edi
43
44
    pop edi
45
    pop esi
46
    pop edx
47
    pop ecx
48
    pop ebx
49
    pop eax
50
%else
51
    %error 'must define _MOV or _PUSH'
52
%endif
53
 
54
    xor eax, eax
55
    cpuid
56
    rdtsc
57
    pop ebx
58
    pop ecx
59
    sub eax, ebx
60
    sbb edx, ecx
61
62
    call showeaxd
63
64
    xor ebx, ebx
65
    mov eax, 1
66
    int 80h
67
68
;---------------------------------
69
showeaxd:
70
    push eax
71
    push ebx
72
    push ecx
73
    push edx
74
    push esi
75
76
    sub esp, 10h
77
    lea ecx, [esp + 12]
78
    mov ebx, 10
79
    xor esi, esi
80
    mov byte [ecx], 0
81
.top:
82
    dec ecx
83
    xor edx, edx
84
    div ebx
85
    add dl, '0'
86
    mov [ecx], dl
87
    inc esi
88
    or eax, eax
89
    jnz .top
90
91
    mov edx, esi
92
    mov ebx, 1
93
    mov eax, 4
94
    int 80h
95
96
    add esp, 10h
97
98
    pop esi
99
    pop edx
100
    pop ecx
101
    pop ebx
102
    pop eax
103
104
    ret
105
;---------------------------------
[/quote]

Dirk Wolfgang Glomp

von Peter II (Gast)


Lesenswert?

Die Takte können aber auf jeder CPU unterschiedlich sein, intel & co 
optimieren ihre CPUs ja ständig. Da kann es durchaus sein, das das 
Programm auf der nächsten CPU (Celeron vs I7 ) sich anders verhält.

Man könnte es einfach in einem emulator laufen lassen 
(http://bochs.sourceforge.net/), eventuell gibt es dort die möglichkeit 
die Takte ausgeben zu lassen.

von Dirk Wolfgang Glomp (Gast)


Lesenswert?

Peter II schrieb:
> Die Takte können aber auf jeder CPU unterschiedlich sein, intel & co
> optimieren ihre CPUs ja ständig. Da kann es durchaus sein, das das
> Programm auf der nächsten CPU (Celeron vs I7 ) sich anders verhält.

Ja richtig und so kann man herausfinden bei welchen CPUs bestimmte 
Befehle schneller ausgeführt werden und bei welchen CPUs es langsamer 
wird.

Beispiel: Bis einschliesslich Pentium 3 wird eine Kombination von Mov- 
und Mov-Befehle schneller ausgeführt, als die Kombination von Push- und 
Pop-Befehle. Erst mit dem Pentium 4 änderste sich das. Bei den CPUs von 
AMD verhält sich es vergleichbar.  Beim AMD K6 ist eine Kombination von 
Mov- und Mov-Befehle auch noch schneller.

> Man könnte es einfach in einem emulator laufen lassen
> (http://bochs.sourceforge.net/), eventuell gibt es dort die möglichkeit
> die Takte ausgeben zu lassen.

Damit kann man doch aber nur die Verarbeitungsgeschwindigkeit des 
Emulators bestimmen, für den Fall das wir unsere Anwendung für die 
Umgebung des Emulator optimieren wollen. Ich vemute etwas anderes kann 
man damit nicht testen, als das wie gut eine CPU sich zum Emulieren 
eignet, bzw. wie dort unter einer Emulation unsere Kombination von 
Befehle sich verhalten. Mit der Ausführungsgeschwindigkeit von realen 
und nicht emulierten CPUs läßt sich das vermutlich nicht vergleichen 
bzw. unsere Messergebnisse nicht sinnvoll übertragen.

Dirk

von Rolf Magnus (Gast)


Lesenswert?

Es gibt bei solchen Prozessoren so viele Dinge, die Einfluss auf die 
Ausführungsgeschwindigkeit haben, daß es nicht sinnvoll ist, die 
theoretisch benötigten Taktzyklen einzelner Instruktionen 
zusammenzuzählen.
Man denke nur z.B. an Dinge wie Cache, superskalare Architektur, 
Pipeline Stalls, Branch Prediction, TLBs u.s.w.
Manche von diesen Dingen können die Ausführungsgeschwindigkeit 
situationsabhängig stärker beeinflussen als die reine Ausführungsdauer 
der einzelnen Instruktionen. Und nicht nur der Prozessor, sondern auch 
Chipsatz und Speicher beeinflussen das, ggf. auch noch andere 
Peripherie, wenn sie z.B. per DMA auf den Speicher zugreift. Von einem 
evtl. auf dem System laufenden Betriebssystem fangen wir besser gar 
nicht erst an.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.