Taktzyklen ...



  • Folgende Programm-Zeilen sind gleichwertig:
    if ( IntZahl % 4096 == 0 ) ... //und
    if ( IntZahl & 0x00000FFF == 0 ) ... // stimmt doch ?
    Nun die Frage: Wieviel Taktzyklen braucht ein moderner Prozessor, für die Addition, Multiplikation, Division und Modulo jeweils für Ganzzahl und Fliespunktzahl ?



  • War das die Anrufung der Gottmaschine? Die Frage ist so unbeantwortbar, weil es Prozessoren mit und ohne FPU gibt in 8, 16, 32 und 64- Bit- Ausfertigung und die sind alle noch modern.
    In der Regel sind Intergerberechnungen schneller. Aber das kannste bei den üblichen Benchsuites sowieso alles nachlesen.


  • Mod

    Google: software optimization guide for AMD Such dir deine Lieblingsprozessorfamilie aus. Dann findest du im anhang ganz genau aufgeschlüsselt, welche Anweisung wie lange braucht. Und eine genaue Erklärung, was die Zahlen überhaupt bedeuten. Denn ein "moderner" Prozessor ist ein bisschen komplizierter als das was Laien sich darunter vorstellen.



  • GeorgC++ schrieb:

    Folgende Programm-Zeilen sind gleichwertig:
    if ( IntZahl % 4096 == 0 ) ... //und
    if ( IntZahl & 0x00000FFF == 0 ) ... // stimmt doch ?
    Nun die Frage: Wieviel Taktzyklen braucht ein moderner Prozessor, für die Addition, Multiplikation, Division und Modulo jeweils für Ganzzahl und Fliespunktzahl ?

    Theoretisch lassen sich alle diese Aufgaben in rein kombinatorischer Logik lösen, sind daher in einem synchronen Schaltwerk innerhalb eines Taktzyklus berechenbar. Wie gesagt, sind aber "moderne Prozessoren" recht kompliziert und natürlich auch unterschiedlich, daher bringt diese Aussage nicht viel für jemanden der nicht an Internas interessiert ist. Durch Parallelisierung können auch mehrere dieser Operationen innerhalb eines Taktzyklus durchgeführt werden, durch Pipelining wird aber tatsächlich keine dieser Operationen innerhalb eines Taktzyklus durchgeführt. Auch müssen die Daten zur Berechnung erstmal beschafft werden. Es gibt noch viele weitere Dinge, die eine Rolle spielen.



  • Es ist noch anzumerken, dass dein Compiler x%4096 automatisch in eine and-Operation o.ä. übersetzen wird, wenn das auf der Ziel-CPU schneller ist (theorethisch natürlich auch umgekehrt).
    Deshalb solltest du immer die Variante bevorzugen, die dein Vorhaben besser beschreibt. Die erste, wenn du wissen willst, ob die Zahl durch 4096 teilbar ist und die zweite, wenn du explizit wissen willst, ob die letzten zwölf Bits nicht gesetzt sind.

    == bindet übrigens stärker als &, es müsste also if ( (IntZahl & 0x00000FFF) == 0 ) lauten.



  • if ((IntZahl % 4096) == 0 ) ... //und
    if ((IntZahl & 0x00000FFF) == 0 ) ... // stimmt doch ?

    Schau dir mal dieses Tutorial an, da findest Du, wie man selbst so etwas angehen kann: http://www.henkessoft.de/C/C-Programming Under The Hood.htm


Log in to reply