- Akku Tests und Balkonkraftwerk Speicher         
Seite 3 von 4 ErsteErste 1234 LetzteLetzte
Ergebnis 21 bis 30 von 40

Thema: Schnelle Multiplikation von Bytes

  1. #21
    Erfahrener Benutzer Roboter Experte Avatar von Rage_Empire
    Registriert seit
    10.03.2005
    Ort
    Pforzheim
    Beiträge
    710
    Anzeige

    LiFePo4 Akku selber bauen - Video
    also, die MHz-Zahl kannste mal ganz schnell vergessen, weil die sagt über die schnelligkeit von rechenoperationen am wenigsten aus. Ich weiß ja nicht um welchen faktor du es schneller benötigst. in Bascom kann man auch asm-routinen ohne probleme einfügen. ich weiß ja nicht, ob 4Mips, die ich oben genannt habe vollkommen ausreichen. immerhin sind 4Mips 4milionen Befehle pro sekunde (bei avrs).
    Vieleicht sind deine Multipliziergeschichten auch einfach nur umständlich, aber ich weiß ja nicht worum es geht.

    Oftmals liegt das Problem nicht in der Leistung sondern in der Logik des Programmierers(keine Kritik, nur eine feststellung die ich auch schon bei mir manchmal machen musste)

    Ach ja, deine FPGA-Geschichte solltest du dir ganz aus dem Kopf schlagen.....das ist zu viel aufwand und benötigt vieles an wissen und erfahrung(glaub mir). Wenn alles nichts bringt, nimm dein PC oder eine Slot-CPU.

  2. #22
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    30.07.2005
    Beiträge
    569
    Zitat Zitat von SprinterSB
    ***EDIT***

    BTW: AT 89C51ED2 ist kein AVR, sondern ein 8051-Derivat, vermutlich mit interner Taktteilung durch 12...
    Wählbar zwischen 6 und 12 ... wenn ich das richtig aus dem Datenblatt heraus interpretiere.

    Hmm .. und bei den 4,7 sek für 1 Mio Multiplikationen wäre wirklich mal der Takt interessant ... normalerweise würde ich bei der "Performance" von 1 oder 2 MHz ausgehen ... es sei denn es ist wirklich etwas umsändlich gecodet.


    Grüße,

    da Hanni.

  3. #23
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    13.03.2004
    Ort
    Bremen
    Alter
    35
    Beiträge
    308
    Ne 16MhZ, ist nur ne For Next schleife und dadrin eine Zahl die mit einer anderen Multipliziert wird, und in einer Variable gespeichert wird.
    Vielleicht liegt es am Timerinterrupt mit dem ich die Zeit messe.
    Gruß,
    Rasmus
    www.rrothe.de
    Blog, Projekte, Sonstiges

  4. #24
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    28.03.2004
    Beiträge
    185
    Nimm mal in diesem Fall WinAVR zum proggen.
    Bascom beherscht kein Registerrechnen, d.h. alle Variablen werden ständig aus dem RAM nachgeladen.
    Ist total irre. Schau die mal das Mathe-Beispiel auf der Seite https://www.roboternetz.de/wissen/in...h_AVR-Compiler an. Ich kann das aus eigener Erfahrung bestätigen.

  5. #25
    Erfahrener Benutzer Roboter Experte Avatar von Rage_Empire
    Registriert seit
    10.03.2005
    Ort
    Pforzheim
    Beiträge
    710
    timerinterrupt? hoffentlich weißt du, das Bascom erst alle Register vor der ISR sichert, was viel Zeit kostet. Abhilfe schafft der Befehl NOSAVE, aber man sollte schon wissen, wie und was.
    Ich finde es jedenfalls falsch gleich von Bascom abzuraten....
    Jedenfalls sollte man schon wissen, wie Bascom vorgeht!

  6. #26
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    13.03.2004
    Ort
    Bremen
    Alter
    35
    Beiträge
    308
    So! Ich habe jetzt mal mit Stopuhr gestoppt(AVR Resetet und gleichzeitig Uhr gestartet)

    Für 10 Millionen Multiplikationen hat er 41,31 Sekunden gebraucht.
    Mein Code:

    Code:
    $regfile = "m32def.dat"
    $crystal = 16000000
    $baud = 38400
    
    Dim A As Byte
    Dim N As Integer
    Do
    For N = 0 To 10000000
    A = 5 * 2
    Next
    Print "Fertig"
    Loop
    Da ich noch nie was mit WinAVR gemacht habe würde ich mich freuen wenn jemand auch mit dem Mega32 und 16MhZ im Prinzip den gleichen Code ausführen lässt und mal die Zeit postet. Dann würde man sehen welche Sprache nun schneller ist , bzw. für so welche Aufgaben besser geeignet ist.

    Gruß,
    Rasmus
    www.rrothe.de
    Blog, Projekte, Sonstiges

  7. #27
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.11.2004
    Beiträge
    1.693
    also, die MHz-Zahl kannste mal ganz schnell vergessen, weil die sagt über die schnelligkeit von rechenoperationen am wenigsten aus.
    Aber die MHz geben ja die Taktzeiten vor. Und jede Operation benötigt mind. einen Takt. Also, je mehr MHz, desto kürzer die Taktzeiten, desto schneller die Operation!

    Und 4MIPS mehr bei 4MHz mehr bekräftigt ja meine Aussage.

    Allerdings wären es nicht 4MIPS mehr wenn eine Multipliaktion 2 Takte benötigt, sondern nur 2MIPS mehr im vergleich zu 16MHz.

    Bei 16MHz und 2 Takten pro Multiplikation wären also theoretisch 8.000.000 Multiplikationen pro Sekunde möglich. (und somit auch 8MIPS!)
    Was deine Rechnung aus dem Beispiel ausbremst ist schonmal die Schleife. Zum einen braucht sie selber auch Zeit zum ausführen. Zum anderen läuft sie bei 10.000.000 was schon um einiges mehr ist als die 8 Bit die der AVR auf einmal verarbeitet. Damit werden schonmal mehr Takte für die Schleife benötigt, als wenn sie nur bis 255 durchlaufen würde. Du kannst N ja mal als Byte deklarieren und den Zeitunschied messen.
    Später im Programm wirst du das Problem haben, das du ja nicht nur jedesmal 5*2 rechnen willst. Die Zahlen müssen ja auch erstmal irgendwo herkommen.

    WinAVR mag eine Lösung sein. Der Syntax ist ähnlich. Du kannst es dir ja mal runterladen und den Code so eingeben.
    Aber wenn du wirklich noch das letzte rausholen willst/musst, wäre es sicherlich besser wenn du dich mehr mit Assembler beschäftigst.

    Du kannst ja im Simulator nachvollziehen, welcher Programmschritt wieviele Takte benötigt. Da siehst du dann in Bascom die Schwachstelle und kannst dir überlegen, nur bestimmte Teile in Assembler zu schreiben.

    Nach dem ersten Start kurz bevor die Schleife anfängt zu zählen, sind schon 12300 Takte und 0,76875mS vorbei. Die kann man aber kaum beeinflussen. Aber ich denke beim Start kann man mit denen Leben.

    Wenn die Schleife erstmal zählt, werden pro Durchgang 53 Takte benötigt. Nur die Multiplikation zeigt bei mir 3 Takte an. Ich denke, das ist annehmbar.
    Die restlichen 50 Benötigt also die Schleife.

    Wenn N "nur" ein Byte ist, sind es nur noch 19 Takte pro Durchgang. Ein Simples DO - LOOP braucht nur 6 Takte!

    So, jetzt hab ich doch deine Arbeit gemacht. Wollte ich eigentlich garnicht

    Aber hier sieht man ganz gut, das es nicht drauf ankommt, wie schnell gerechnet wird, sonder der restliche dazugehörige Code auch mit beachtet werden muss.

    Dim A As Byte
    Dim N As Integer
    Do
    A = 5 * 2
    Incr N
    Loop Until N = 10000000

    Braucht nur 52 Takte und ist schonmal ein Takt schneller.

    Ich gebe zu, ich habe nicht dazu beigetragen, dein Problem zu lösen, aber ich habe es hoffentlich geschafft, klar zu machen, das in diesem Fall nicht die Multiplikation das Problem ist/war.

  8. #28
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    09.08.2004
    Ort
    Potsdam
    Beiträge
    190
    hmmm...
    Der Integer frisst, wenn ich mich nicht täusche, ziemlich viel Recourcen was letztendlich extrem Zeitraubend sein wird. Haste schonmal ausgetestet wie Du den umschiffen könntest?
    Also die Werte zum Beispiel in in einen 16 Bit Counter und ein Byte reinschreiben lassen => Overflow Flag vom Counter für das Byte zum Zählen nutzen oder anstatt dessen zwei Counter miteinander verketten?!?
    Is nur so ne Idee weil ich mich noch nicht weiter damit beschäftigt hab.

  9. #29
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    28.03.2004
    Beiträge
    185
    Das Beispiel A = 5 * 2 ist viel zu theoretisch, da hier keine Register bemüht werden.
    Bascom macht daraus:

    Code:
    5E:   E08A        LDI     R24,0x0A         Load immediate
    5F:   93800060    STS     0x0060,R24       Store direct to data space
    oder auf deutsch A=10

    Zitat Zitat von Marco78
    Nur die Multiplikation zeigt bei mir 3 Takte an.
    genau 1 Takt für LDI und 2 Takte für STS = 3 Takte

    Zitat Zitat von robotxy
    Achso sry, es geht um eine Verschlüsselung.
    Zeig mal etwas Code. Verschlüsselung erfordert wohl etwas mehr, als eine Byte-Multiplikation mit einem Integer-Inkrement.

  10. #30
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    53
    Beiträge
    2.236
    Das Beispiel A = 5 * 2 ist viel zu theoretisch, da hier keine Register bemüht werden.
    Eben, das wird sowas von wegoptimiert...

    Es hat mich wirklich interessiert, wie lange das mit GCC etwa dauern könnte, hier ein Pseudocode mit Mega8 und 16 MHz:
    Code:
    uint8_t zahlen[] = { 1,2,3,4,5,6,7,8,9,0 };
      uint32_t loop = 10000000;
      uint8_t resultat;
      uint8_t a = 0;
      uint8_t b = 9;
      uart_init();
      while(loop){
        resultat = zahlen[a] * zahlen[b];
        a++;
        b--;
        if (a == 10) a=0;
        if (b == 0 ) b=9; 
        loop--;
      }
    Naja, sinnlos...
    Nach etwa 14 Sekunden war er damit fertig...

    Gruß Sebastian
    Software is like s e x: its better when its free.
    Linus Torvald

Seite 3 von 4 ErsteErste 1234 LetzteLetzte

Berechtigungen

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

12V Akku bauen