www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Resourcenabschätzung einer Division


Autor: Stefan R. (stefripp)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit wievielen Rechenschritten muss ich rechnen, wenn ich eine Division 
in einem RISC Prozessor ablaufen lasse.

Ich habe schon gegoogelt und die diversen Algorithmen gesehen. Wie sieht 
es aber nach deren Umsetzung in Maschinencode aus?

(gleich im vorraus: Ich bin Hochsprachenfan und habe zum ersten mal ein 
Problem mit einer so Zeitkritischen Frage)

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan R. schrieb:
> Mit wievielen Rechenschritten muss ich rechnen, wenn ich eine Division
> in einem RISC Prozessor ablaufen lasse.

Das kommt ganz drauf an, was der Prozessor kann.
Wenn er z.B. bereits dividieren kann, muss man es nicht über 
subtrahieren nachbauen.
Also, welchen RISC willst du verwenden?

Autor: Joachim K. (minifloat)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schreib ein Testprojekt für deinen Zielprozessor und lass dir dann dein 
C-Programm als asm-listing ausgeben.
Was muss denn da geteilt werden?
Teilen durch eine Konstante lässt sich meist mit ein bisschen Schieben 
und Addieren/Subtrahieren in wenigen Schritten selber lösen.
Bei Schiebung auf 8bit Prozessoren um mehr als 8 Bit, wenn der Prozessor 
immer nur um 1 Bit Schieben kann, kann man dem Compiler im wahrsten 
Sinne des Wortes auf die Sprünge helfen, indem man die 16- oder 32-Bit 
Variable als Union aufzieht und so einfachst auf die einzelnen Bytes 
zugreifen kann.
mfg mf

Autor: Stefan R. (stefripp)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zielprocessor wären ein NIOSII oder LEON3.

Frage die ich beantworten muss: Kann ich bei einem Takt vom maximal 
100MHz eine bestimmte Rechenoperation in einer vorgegebenen Zeit (20ns) 
durchführen? (8-Bit Variable durch 8-Bit Variable)

Eigentlich ist mir klar, dass es nicht geht. Ich brauche aber eine 
stichhaltige Erklärung für mein Fazit.

Ein Testprogramm wäre zu aufwendig. Die Zeit habe ich leider nicht.

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
LEON3:
- Hardware multiply, divide and MAC units
Bei 100MHz Takt wären 20ns = 2 Takte.
Im Datenblatt schauen, ob der Core die Division in maximal 2 Takten 
packt.

Autor: Stefan R. (stefripp)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Floh schrieb:
> LEON3:
> - Hardware multiply, divide and MAC units

Wenn ich hier nachlese

http://www.lothar-miller.de/s9y/categories/24-Rechnen

frage ich mich, wie Herr Gaisler das hinbekommen hat. Entweder er 
verbrät unglaublich Resourcen oder es ist nur die halbe Wahrheit...


> Bei 100MHz Takt wären 20ns = 2 Takte.
> Im Datenblatt schauen, ob der Core die Division in maximal 2 Takten
> packt.

Ob man so rechnen kann?
Meine uralt Assemblerkenntnisse sagen:

Ich tippe in C++ ein c=a/b;

-Wenn der Programmierer des Compielers sorgfältig gearbeitet hat
-Wenn der Prozessor nicht belastet ist
-Wenn ich den Resourcenbedarf des OS ignoriere
-Die Daten bereits im Cache stehen und nicht aus dem Hauptspeicher 
gelesen werden müssen

kommt mindetstens eine Routine im Stil von

Lade a aus Speicherstelle 1 in Register x
Lade b aus Speicherstelle 2 in Register y
Dividiere Inhalt Register x durch Inhalt Register y
Schreibe den Inhalt der Akku in Speicher 3

Das wären 4 Schritte.
Kann ich so argumentieren?

Autor: ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>wie Herr Gaisler das hinbekommen hat. Entweder er
>verbrät unglaublich Resourcen oder es ist nur die halbe Wahrheit


The GRFPC requires approximately 4,000 LUTs on a Virtex-II FPGA

ersteres...

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan R. schrieb:
> Das wären 4 Schritte.
> Kann ich so argumentieren?

Könnte man, wenn deine Argumentation aber an 2 Takten hängt wird's 
eng... der NIOS-II unterstützt z.B. pipelineing, es könnte also sein, 
das zwar der Initialaufwand 4 Takte bedeutet, danach aber in jedem Takt 
eine Division durchgeführt wird.
Zum NIOS gibt es auch jedenfall aber eine Befehlsreferenz wo steht wie 
lange der für die einzelnen Operationen benötigt (hab ich für meine 
Diplomarbeit benötigt). Zum dem unterstützt der auch Custominstructions, 
wen mal also ganz fies sein will und Platz keine Rolle spielt, hängst du 
da eine Lockuptabelle dran die die beiden 8 bit Werte als index 
verwendet (du kannst dann sogar beide Operanden in eines der 32 bit 
Register liegen lassen) und bist im nächtem Takt fertig wenn alles glatt 
läuft.

Stefan R. schrieb:
> Wenn der Programmierer des Compilers sorgfältig gearbeitet hat
Man kann auch inline ASM für den NIOS verwenden.

Autor: Stefan R. (stefripp)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für den Tipp.

Hier steht es genau beschrieben: Mit meiner Hardware brauche ich 5 
Cycles für eine Division mit dem Nios 2 /f und es steht auch genau 
darin, unter welchen Bedingungen pipelining das ganze Beschleunigen 
kann.

Read the f******g manual ;-)

Autor: Stefan R. (stefripp)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Noch schlimmer siehts beim LEON3 aus: 35 Cycles für SDIV/UDIV

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.