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
Die Antwort ist ganz einfach - 4 mal solange plus ein paar tote. Was willst du mehr wissen?
war zwar nicht ganz die antwort die ich mir gewünscht hatte, aber egal ... muß da wohl selber suchen/forschen/experimentieren/rechnen ... rene
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
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
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.
"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.
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
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.