Programmieren - alles kontrollieren 4.946 Themen, 20.742 Beiträge

Zeit für Integer/Floatrechnungen

RyoOhki / 28 Antworten / Flachansicht Nickles

Eine Frage zur Berechnung von Integer und Float werten unter C++:

sollte ein Programm länger brauchen, zwei Float zu addieren (z.B. via Add = 0,1 + 0,1) als zwei integerwerte (Add2 = 1 + 1 ) zu addieren, da es sich um Flieskommberechnungen handel?

ich habe ein Programm geschrieben das beide opperationen 40000000000mal ausführt und die zeit dafür stoppt, erhalte aber bei beiden beinahe identische Werte.

Ich meine, sollte ein PC Flieskommazahlen nicht langsammer berechnen können als Integerzahlen?

Grüße,
Ryo

bei Antwort benachrichtigen
label RyoOhki „Cache /Pipelineing /Register“
Optionen

Du kannst es Dir selber ausrechnen. Die "Programming Manuals" von Intel bzw. AMD ziehen. Dort stehen die pro Befehl benötigten Taktzyklen drin.

Auch wenn Du nicht Assembler kannst, ist es relativ einfach:
1. Mache ein Assembleroutput (im Handbuch deines Compilers steht drin, wie man es macht, z.B. bei gcc: "gcc -S test.c" erzeugt ein Assembleroutput mit dem Namen "test.s")

2. Berechne die Schleifendauer: Addiere dazu die Anzahl der Taktzyklen (pro Befehl, aus dem Manual rauskramen) zusammen und teile es durch die Taktfrequenz. Die Zahl, die dabei herauskommt, ist in Sekunden.

Der 2. Punkt ist ein wenig mühsam und wenn man es genau machen will ziemlich zeitaufwändig, da je nach Prozessortyp die Angabe der Taktzyklen schwankt. Das hängt dabei von verschiedenen Faktoren wie etwa Adressierungsart, verwendete Register, Boundaries etc. Erschwerend wird es denn noch, wenn man Effekte wie Memory-Zugriff berücksichtigen muß, da der Hauptspeicher im Verhältnis zu den Registern unglaublich langsam ist (100MHz ergeben ca. 800 MB/s übetragungsrate vom RAM zur CPU). Naja, und dann gibt es noch den L1/L2-Cache, der die Geschichte absolut verkompliziert :-)

Wenn Du experimentell den Unterschied zwischen Floating-Point und Integer-Addition am besten messen willst, dann schreib ein Programm, daß ein großen Array mit Zufallswerten füllt (jeweils int bzw. double, am besten > 100.000 Werte, damit es keinen Cache-Effekt gibt) und addiere die Werte einmal zufällig und einmal sequentiell (der Reihe nach). So hast Du ein gutes Tool zur Messung der wahren FP bzw. Integerperfomance unabhängig von dem Caches.

Ansonsten kannst Du auch Dir mal Linpack anschauen, dass ist ein Realworld-Benchmark, der je nach Konfig 500x500 bzw. 1000x1000 Matrizen berechnet.

Bis denne,
label.

bei Antwort benachrichtigen