Multiplikation oder Division: was ist schneller?

Hallo!

Mich interessiert folgendes:
was wird im Allgemeinen von einem gängigen AMD oder
Intel-Prozessoren schneller verarbeitet:
eine Multiplikation
oder
eine Division von 2 32-bit realzahlen?
Ist es letztlich intern egal? wenn nicht kann man
rechenintensive, oft wiederholte berechnungen günstiger
gestalten.

tschuess, raienr

Hallo Reniar,

Mich interessiert folgendes:
was wird im Allgemeinen von einem gängigen AMD oder
Intel-Prozessoren schneller verarbeitet:
eine Multiplikation oder eine Division von 2 32-bit realzahlen?

Ich hab mal double mit float und mul mit div
verglichen (Zeiten in CPU-Zyklen!):

P3/750, gcc 3.3.3
--------------------------
DOUBLE: Array to Array mul/div, size 10000000 (2x sweep)
mul: 621235317 cycles,
div: 680225495 cycles (ratio:0.91)

FLOAT: Array to Array mul/div, size 10000000 (2x sweep)
mul: 634822319 cycles,
div: 688748437 cycles (ratio:0.92)

Athlon-64/3400+, gcc 3.3.3 -O3
--------------------------
DOUBLE: Array to Array mul/div, size 10000000 (2x sweep)
mul: 219601188 cycles,
div: 334698163 cycles (ratio:0.66)

FLOAT: Array to Array mul/div, size 10000000 (2x sweep)
mul: 397249837 cycles,
div: 549078298 cycles (ratio:0.72)

P3/700, MSVC6
-------------
DOUBLE Array to Array mul/div, size 10000000 (double sweep)
mul: 809090998 cycles,
div: 884465019 cycles (ratio:0.91)

Also, float ist nicht unbedingt schneller und
bei div vs. mult kommt es darauf an.

Ist es letztlich intern egal? wenn nicht kann man
rechenintensive, oft wiederholte berechnungen günstiger
gestalten.

Vor Schleifen „double quotient;“ möglichst
„double multiplikant = 1./quotient“ umwandeln :wink:

Grüße

CMБ

PS.:

 #define FTYPE double
 ... // count = int(1.E7)
 ...
 void div\_proc(FTYPE \*in, FTYPE \*out, FTYPE arg, int count)
{
 int i;
 FTYPE \*p, \*q;
 for(i=0,p=in,q=out; i

Vor Schleifen „double quotient;“ möglichst
„double multiplikant = 1./quotient“ umwandeln :wink:

Hallo Semjon,

mach ich auch immer so, und als allgemeine Vermutung ist die Annahme schon brauchbar, dass DIV länger dauert als MULT, besonders bei relativ einfachen Prozessoren (Embedded). Je komplexer die Prozessoren jedoch werden, desto weniger kann man irgendwas vorhersagen:

Neuere Pentiums haben eine eigene DIV-Einheit, die parallel läuft. D.h. solange nur 5 oder 10% DIV-Befehle auszuführen sind, brauchen diese praktisch überhaupt keine Zeit, weil sie nebenher ausgeführt werden, erst wenn die DIV-Dichte ein bestimmtes Mass überschreitet, fängt die Division an, Zeit zu kosten. Beim Pentium 3 dagegen wird die MULT-Einheit mitbenutzt, daher blockieren sich DIV und MULT gegenseitig, was natürlich zu völlig anderen Ergebnissen führt.

Gruss Reinhard