mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Frage zu R8C (Multiplizierer)


Autor: TheMason (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

ich bins mal wieder, und habe wieder mal eine Frage.
Und zwar :

Weiß jemand wieviele Takte eine 32x32 Bit Multiplikation auf dem
R8C-Prozi des Elektor-Boards benötigt ?
Der Prozi hat ja meines wissens nach einen 16x16Bit
Hardware-Multiplier. Nur wie lange dauert das Multiplizieren eines
32x32 Bit signed wertes ? (und jetzt bitte keine antwort wie "4 mal
solange plus ein paar tote", das weiß ich wohl selbst :-), mir geht es
um einen halbwegs exakten wert)
Ich frage deshalb da ich vorhabe einen kleinen monophonen Synthesizer
mit dem Dingen zu bauen bzw. programmieren und für die Filter (IIR)
benötige ich eine (bzw. 5) solche(r) Multiplikationen. Optional würde
auch eine 16x32Bit Multiplikation gehen.
Hat da jemand Erfahrungswerte, bzw. könnte das mal grob überschlagen,
da ich noch nicht so tief in R8C-Assembler eingetaucht bin.

Vielleicht eine noch weitere Frage : Gibt es unter dem Glyn C Compiler
einen 64Bit Datentypen ? (wenn ich unter C 2 32Bit Werte multipliziere
bekomme ich ja als ergebnis einen 64-Bit wert raus)

Gruß
Rene

Autor: MartinS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Antwort ist ganz einfach - 4 mal solange plus ein paar tote.
Was willst du mehr wissen?

Autor: TheMason (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
war zwar nicht ganz die antwort die ich mir gewünscht hatte, aber egal
...
muß da wohl selber suchen/forschen/experimentieren/rechnen ...

rene

Autor: Bernhard Gebert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Rene,

du möchtest GANZ genaue Antworten aber sagtst nicht einmal, WAS du
multiplizieren möchtest. Unsigned dauert weniger lang als Signed und
eine 32-Bit Float dauert bei 16 MHz knapp eine ms.

Eine Unsigned Integer benötigt laut M16C.de 5 Zyklen.

MfG,
Bernhard

Autor: TheMason (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Bernhard,

ich brauche keine EXAKTE antwort (hab ich ja oben geschrieben :
>>halbwegs exakt<<). Mir geht es um einen groben wert (+/-5 Takte) für
eine 32x32Bit signed (also 2 signed werte) Multiplikation (habe ich
auch oben geschrieben). Alternativ würde mich auch interessieren wie
lange (in etwa, also nicht exakt) eine 16x32 Bit signed (ebenfalls
beide werte signed) Multiplikation dauert.
Von Float habe ich nicht gesprochen (brauche ich zwar auch, aber diese
operation ist nicht zeitkritisch, da diese nicht teil der
audio-berechnung ist)
Weiterhin hatte ich gefragt ob es einen 64-Bit Datentypen unter dem
Glyn C Compiler gibt (um eine solche 32x32 Bit signed Multiplikation
direkt in C zu formulieren).
Welche Infos brauchst du noch um eine HALBWEGS exakte antowrt geben zu
können (sind im prinzip doch alle infos da, oder täusche ich mich da
?!)

Gruß
Rene

Autor: MartinS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich verstehe deine Frage immernoch nicht. Im Datenblatt von Renesas sind
die Takte für jeden Befehl aufgeführt, auch für die 16 Bit
Multiplikation und wie du richtig bemerkt hattest brauchst du mei 32*32
Bit vier 16 Bit Multiplikation und bei 16*32 Bit zwei Multiplikationen.
64 Bit Datentyp kenne ich nicht -> also 2*long oder eine struct
definieren.

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"brauchst du mei 32*32 Bit vier 16 Bit Multiplikation"

Nicht zwingend. Bei 32x32=>32 sind es maximal 3, im Fall von signed
integers in C kommt man sogar mit maximal 2 aus.

Autor: TheMason (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok .. dann hole ich weiter aus ...

Ich habe 2 32-bit signed Werte. Die will ich Multiplizieren. Raus
kommen tun also 64 Bit (die ich auch real brauche, da ein Biquad
durchgerechnet wird). Als alternative könnte ich auch mit einer 16
Bit-Zahl und einer 32 Bit Zahl (beides signed) rechnen, bei der dann 48
Bit auskommen.

Muß ich erst die beiden Zahlen von signed nach unsigned (Konvertierung
= x Takte), dann unsigned multiplizieren (4 * 5 Takte + y), und dann
wieder nach signed rückkonvertieren (z Takte) also x + (4 * 5 Takte +
y) + z Takte ?
Oder gibt es eine schnellere Möglichkeit, beispielsweise
signed/unsigned Multiplikation mischen, wenn der Prozi denn von sich
aus 16Bit - signed Zahlen hardwaremässig multiplizieren kann (wofür ist
denn sonst der Unterschied zwischen MUL und MULU ?!) und nachher wieder
irgendwie verdröseln.
Wieviele Takt-zyklen kostet mich das etwa ?
Ich habe ja gesagt das ich nicht so tief in assembler stecke wie
vielleicht manch anderer hier, aber was an der aussage "2 32 Bit
signed Zahlen multiplizieren" nicht zu verstehen ist weiß ich nicht
..
(will jetzt niemandem auf den schlips treten, aber ich weiß nicht wie
man das sonst interpretieren kann)
Aber mir ging es auch nur um eine ungefähre aussage, damit ich schonmal
überschlagen kann wieviel Rechenleistung ich für den Synthesizer habe
(Samplerate, Features, Audio-Datenbreite usw ...)
Mein ziel ist es einen synthesizer zu programmieren. Und bei den
zeitkritischen dingen (audio-berechnung) muß ich ja evtl auf assembler
zurückgreifen, und damit ich nicht erst probiere probiere probiere und
merke nachher : passt nicht, frage ich lieber jemand der mir zumindest
schonmal sagen kann 32 * 32 Bit signed multiplikation ca 40 takte ...

@a.k. : wie komme ich denn mit 2 multiplikationen in c aus ?! ich
brauche doch im endergebnis 64 bit ?! (also 4 16x16 multiplikationen)

gruß
rene

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die normale C Multiplikation liefert nur ein 32bit Ergebnis, das sind
die untere 32bit des 64bit Produktes. Da eines der 4 Teilprodukte nur
in die oberen 32bit eingeht, bleiben also nur noch 3.

Bei der vorzeichenbehafteten Multiplikation ist in C das Verhalten bei
Überlauf undefiniert (anders als bei vorzeichenloser Multiplikation!).
Wenn also das obige Teilprodukt nicht bloss die Vorzeichenerweiterung
ist, dann tritt dieser Fall ein, und als Ergebnis ist alles zulässig.
Das ist genau dann der Fall, wenn beide mittleren Teilprodukte
signifikant sind. Mithin reicht es aus, nur das erste signifikante
mittlere Teilprodukt zu rechnen, das andere kann man dann weglassen.
Bleiben nur noch 2. Letzters lohnt sich aber nur, wenn die
Multiplikation deutlich teurer ist als der entsprechende Test.

Autor: TheMason (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo A.K.

bei der C-Multiplikation bei der nur die unteren 32 der 64 bit benötigt
werden gebe ich dir recht.
Aber es geht sich ja gerade um 64 Bit.

Mal etwas zum Rechenvorgang :
Ich will ja einen IIR-Biquad durchrechnen. Das heißt ich habe 32 (evtl
sogar nur 16) bit eingangsdaten und 32 bit koeffizienten (eigentlich
nur 24 bit, aber nehmen wir 32 für etwas headroom).
Ich muß 5 32x32 Bit multiplikationen und diese 5 ergebnisse in einem
64-Bit Akku addieren. Ich kann also NICHT auf irgendwelche teilprodukte
verzichten und bin darauf angewiesen die multiplikation vollständig
durchzuführen. Nach der Aufsummation der 5 Produkte muß der Wert
geclippt werden, und anschließend geshiftet werden damit ich wieder auf
meine 32 (resp. 16) Bit Audio-Daten komme.

Für alle die jetzt 32 Bit Audio und 32 Bit Koeffizienten für etwas
übertrieben halten :

Bei 16 Bit Audiodaten habe ich keinen Headroom mehr, der GERADE bei
Synthesizern mit Resonanzfiltern (die ich ja vorhabe zu programmieren)
wichtig ist (Stichwort : Überschwingen). 32 Bit-Koeffizienten müssen
auch sein, da gerade bei tiefen Frequenzen und hohen Güten (Resonanz)
der Filter instabil werden kann (-> weil nicht genau genug, ergo mehr
bits in den Koeffizienten). Als Richtwert nehme ich 24 Bit nachkomma
und 7 Bit vorkomma plus 1 sign-bit.
Ist zwar alles sehr groß dimensioniert, und ich denke das man evtl.
noch sparen kann, aber im Prinzip sollte es so dimensioniert sein.
Trotzdem würde mich halt interessieren wie lange eine Multiplikation so
dauert, damit ich weiß wieviele Biquads ich bei welcher Samplerate
nutzen kann. :-))
Und das das geht, da bin ich mir sicher. Siehe www.acidcode.de. Der
synthesizer besteht nur aus PICs (6 Stück) hat aber effekte und noch
anderen schnickschnack, der erstmal nicht wichtig ist.

Gruß
Rene

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.