- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 10 von 22

Thema: Compiler Multiplikation verbieten

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.03.2011
    Beiträge
    1.899
    Zitat Zitat von Siro Beitrag anzeigen
    Er ruft schon bei der ersten Zeile ein Unterprogramm (Multiplier) auf.

    33 Zyklen
    Code:
    volatile unsigned char t,cnt;
    
    void main(void)
    {
       t = cnt + cnt;   // hier ruft er wieder eine Multiplikation auf. 
       cnt = cnt + t;    
    }
    Ist schon lustig, daß der Compiler in cnt + cnt 2*cnt erkennt. Ich hab anderes ähnliches gefunden: für t = 1 erzeugt er clear t und dann inc t.

    so macht er aber besseren Code ohne Multiplikation: 15 Zyklen
    Code:
      t = cnt;
      t = t + cnt;
      cnt = t + cnt;
    Das wäre das, was ich in Assembler schreiben würde, wobei t dann der Akku wäre.

    MfG Klebwax
    Strom fließt auch durch krumme Drähte !

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    05.11.2007
    Beiträge
    1.076
    Die Algorithmen sind teils schon lustig.
    für dein Beispiel t=1 kann er alles direkt in den Registern abarbeiten. Er muss dazu keine Konstante (die 1) aus dem Speicher laden. So ist es bei einigen Prozessoren eventuell schneller.

    Ein echtes "Steuern" für den Code scheint aber nicht direkt möglich zu sein, bzw. nicht sicher nachvollziehbar.
    Am schnellsten geht es in diesem Falle (unsigned multiplikation mit 3) immer noch mit
    cnt = (cnt << 1) + cnt;

    mit signed geht das natürlich dann nicht mehr.

    Siro

  3. #3
    HaWe
    Gast
    moinmoin!
    für cnt=3 geht das ntl mit 1x shiften und 1x addieren, aber für cnt >= 4 brauchst du ja wieder Zähler und/oder eine Fallunterscheidung ob cnt gerade oer ungerade.


    Aber nur interessehalber,
    was macht er per

    for(int i=1; i<cnt;i++) t+=x;

    Geändert von HaWe (02.11.2018 um 06:46 Uhr)

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    05.11.2007
    Beiträge
    1.076
    Guten Morgen,
    hab ich auch mal getestet:

    Code:
    for(i=0; i<3;i++) cnt+=cnt;      // 44 Zyklen, normaler Schleifencode, wenn i ein unsigned char ist
    
    for(int i=0; i<3;i++) cnt+=cnt;  // 76 Zyklen, normaler Schleifencode, weil i ein int ist,
    wobei mir grad auffällt, da kommt ja was anderes raus...

    Siro
    Geändert von Siro (02.11.2018 um 06:19 Uhr)

  5. #5
    HaWe
    Gast
    Hatte mich vertippt
    Ntl
    ... t+=x

    cnt ist bei mir der Multiplikator

    PS
    Welche Compileroptimierungsstufe hast du?
    Offenbar musst den Schleifenzähler wirklich auch global definieren
    Geändert von HaWe (02.11.2018 um 06:47 Uhr)

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    05.11.2007
    Beiträge
    1.076
    Code:
    t=cnt; 
    for(i=0; i<2;i++) cnt+=t;
    hier benötigt er 34 Zyklen.

    The current licence does not permit the selected optimization level, using level -O1
    Geändert von Siro (02.11.2018 um 06:43 Uhr)

  7. #7
    HaWe
    Gast
    Edit
    Stimmt
    Hatte mich vertan

    cnt war bei mir der Multiplikator
    x der Multiplikant
    t das Ergebnis

    Also anstelle
    t=x*cnt
    Alternativ:


    int i, x, cnt;
    t=x;
    for( i=1; i<cnt;i++) t+=x;
    Geändert von HaWe (02.11.2018 um 06:57 Uhr)

Ähnliche Themen

  1. Auch Hybridfahrzeuge betroffen: Großbritannien will Verbrenner ab 2040 verbieten
    Von Roboternetz-News im Forum Neuigkeiten / Technik-News / Nachrichten / Aktuelles
    Antworten: 0
    Letzter Beitrag: 26.07.2017, 09:40
  2. Verkehr: Stadtrat in San Francisco will Lieferroboter verbieten
    Von Roboternetz-News im Forum Neuigkeiten / Technik-News / Nachrichten / Aktuelles
    Antworten: 2
    Letzter Beitrag: 24.05.2017, 09:52
  3. Multiplikation falsch??
    Von fredyxx im Forum Arduino -Plattform
    Antworten: 8
    Letzter Beitrag: 20.05.2016, 09:21
  4. Multiplikation in ass
    Von haus51 im Forum Assembler-Programmierung
    Antworten: 9
    Letzter Beitrag: 20.03.2007, 12:48
  5. Vias unter Bauteilen verbieten (Eagle)
    Von Henrik hessert im Forum Konstruktion/CAD/3D-Druck/Sketchup und Platinenlayout Eagle & Fritzing u.a.
    Antworten: 2
    Letzter Beitrag: 16.12.2006, 17:34

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen