Ist eine Multiplikation rechenaufwendiger als eine Addition?
-
Ich erinnere mich noch dunkel, dass eine Multiplikation im Grunde nichts anderes sei als eine Additionskette, also:
10*8 besteht dann nicht aus einer Rechenoperation sondern aus acht: 10+10+10+10+10+10+10+10.
Gilt das noch für die heutigen Prozessoren? Oder gibt es da mittlerweilen keinen Unterschied mehr (ich meine: wenn man eben diese Operation ein paar Millionen mal ausführt...
)?
-
Alexander Rahm schrieb:
Gilt das noch für die heutigen Prozessoren? Oder gibt es da mittlerweilen keinen Unterschied mehr (ich meine: wenn man eben diese Operation ein paar Millionen mal ausführt...
)?
PCs kennen mindestens seit dem 8086er den Befehl "MUL" für Multiplizieren. Und zwar wird ein Operand mit einem 8 oder 16 Bit-Register multipliziert und das benötigt 75 bzw 125 Takte. Eine einfache Addition benötigt dagegen von 3 (ADD reg,reg) bis zu 16 Takten (ADD mem,reg). Also hier bitte, hast du deinen Unterschied.
Die Werte sind für den 8086er, die Taktzahlen werden bei deiner CPU also kaum noch die selben sein. Zumal deine sicherlich auch 32, vielleicht sogar 64 Bit beherrscht. Der Punkt ist, sie ist auf jeden Fall 100%ig abwärtskompatibel zum 8086. Allerdings schätze ich mal, dass eine Multiplikation noch immer teurer als eine Addition ist. Auf jeden Fall wurde bei der PC-Programmierung die Multiplikation noch nie auf die Addition zurückgeführt.
-
Das hatten wir letzes Jahr an der Uni in Technische Informatik 1.
Da ist man so richtig in die Tiefen der Schaltgatter eingetaucht.http://www12.informatik.uni-erlangen.de/edu/ti1/script/
http://www12.informatik.uni-erlangen.de/edu/ti1/script/25_2x4.pdf
Such dort mal die Folien ein bisschen ab.
Dann siehste, dass ein Addierer echt pillepalle ist - ein Multiplizierer hingegen nicht so sehr.
-
Ich denke nicht, dass es heute noch erforderlich ist Performance an Multiplikationsaufgaben zu sparen. Bei 175 Takten pro Multiplikation wären das bei einem 3GHZ Prozessor etwa 24 Millionen Miltiplikationen pro sekunde.
Was mich aber noch interessiert ist, wie es bei divisionen aussieht. Jeder weiß, das z.b. x*0,5 das selbe wie x/2 oder x*0,333 das selbe wie x/3 ist.
Ist es nun schneller wenn ich x/2 oder x*0,5 mache? Theoretisch ist es ja das Selbe, nur anders aufgeschrieben!?
-
Naja das eine ist ne Flieskommazahl!
Wär aber mal schön zu sehen ob der Prozessor das merkt und die Variante mit ganzen Zahlen nimmt.Im übrigen könnte man das Anfangsbeispiel 10*8 auch mit einer Linksseitigen Bitverschiebung lösen, das wäre bestimmt die schnellste Lösung. Muss das der Programmierer dann selbst implementieren oder optimiert das der Compiler? Oder bleibt das ganze trotzdem als 10*8 stehn?
-
Jeder heutige C++-Compiler macht dir aus 10*8 ein 10<<3 bzw., wenn die Zahlen schon so da stehen, eine 80.
-
Und zwar wird ein Operand mit einem 8 oder 16 Bit-Register multipliziert und das benötigt 75 bzw 125 Takte
das sind aber fakten aus den fruehen 80ern!
sowohl floating-point als auch integer-multiplikationen verbraucht heutzutage circa 3 taktzyklen, wobei durch superskalare architektur nur die multiplikationseinheit belegt ist und parallel noch andere operationen ausgefuehrt werden koennen.
-
Nein sag bloß
Was genau hast du denn an "Die Werte sind für den 8086er, die Taktzahlen werden bei deiner CPU also kaum noch die selben sein." nicht verstanden?
-
Zumal heute durchaus noch 8-Bitter eingesetzt werden, teilweise auch ohne Hardwaremultiplizierer.
-
Additionen beschrenken sich immer auf das aktuelle Cacheregister.
-
Was genau hast du denn an "[...]" nicht verstanden?
darum ging's mir gar nicht, sondern dass es resourcenverschwendung ist, multiplikationen zu vermeiden und dadurch teile des rechenwerks brach liegen zu lassen.
Additionen beschrenken sich immer auf das aktuelle Cacheregister
1. "beschrenken" kommt von schranke.
2. "cache" und "register" sind unterschiedliche dinge.