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
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.
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 :(...
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
Michael Schmidt schrieb: > Ich habe mein ASM Code optimiert. Läuft das nachher unter einem Betriebssystem?
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
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?
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
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.