Forum: Mikrocontroller und Digitale Elektronik Resourcenabschätzung einer Division


von Stefan R. (stefripp)


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)

von Floh (Gast)


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?

von Achim M. (minifloat)


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

von Stefan R. (stefripp)


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.

von Floh (Gast)


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.

von Stefan R. (stefripp)


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?

von ich (Gast)


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...

von Läubi .. (laeubi) Benutzerseite


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.

von Stefan R. (stefripp)


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 ;-)

von Stefan R. (stefripp)


Lesenswert?

Noch schlimmer siehts beim LEON3 aus: 35 Cycles für SDIV/UDIV

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.