Cpu cycles x86
-
hi
Möchte gerne die Cpu cycles eines algorithmus messen. Wie gehe ich da am besten vor in C. Die api Funktionen sind nicht gerade genau !?
lb
-
ich glaube du mußt das comilat decompilieren, und dann zählst du von den asm istructionen die cycles, für intel cpus gibt es eine tabelle wo drin steht wieviele cycles pro befehl benötigt werden, allerdings gibt es auch befehle wie z.b. div die variable cycles haben?
evtl. bietet auch die cpu ein register an welche für dich die cycles mitzählt? dann könntest einfach per inline asm das auslesen?
lass doch einfach den algo öfter laufen und stopp die zeit, dann hast du auch ein relativ gutes ergebnis und hast nebenbei auch noch die effizienz der pipe mit drin.
das waren nur meine spontanten ideen, da kommen sicher noch bessere vorschläge
lg lolo
-
sowas bietet intel ab dem PII
unsigned int d1,d2,d3,d4; asm volatile( "rdtsc" :"=a" (d1), "=d" (d2) ); asm volatile( "addl %eax,%ebx" ); asm volatile( "rdtsc" :"=a" (d3), "=d" (d4) ); printf("%ud:%ud\n",d1,d2); printf("%ud:%ud\n",d3,d4);
ausgabe
1550175454d:5447d 1550175553d:5447d
und sollte normal nur ein takt benötigen, kommt aber auch ein bischen darauf an da sicher noch debug symbole rumgeschwirrt sind und meine entwicklungs umgebung auch noch ein bischen von den cycles abhaben wollte, sollte sich das os aber entscheiden zwischen der 1. und 2. messung einen context-switch zu machen sind die ergebnisse eh hinfällig, also sind die ergebnisse mit vorsicht zu genießen
lg lolo
-
Du kannst dir nur den ASM-Code ansehen und Takte zaehlen. Das ist die untere Grenze. Hinzu kommen noch Chache-Misses Scheduling und Co., die du so nicht abschaetzen kannst.
-
hi
Danke schonmal.
greetz