mikrocontroller.net

Forum: Compiler & IDEs GCC und MMX-Optimierung


Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

mein GCC denkt nicht daran MMX zu optimieren.

Selbstverständlich hab ich -mmmx aktiviert. Als 64Bit Datentyp verwende 
ich
unsigned long long.

Das scheint er aber nicht zu kapieren, dass er da optimieren soll.

Muss man einen anderen Datentyp dafür verwenden?

Mfg
Gast

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was hat der von dir verwendete 64bit-Datentyp mit MMX zu tun?

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Simon:
Die Links sind ja alle lila bei mir ... hmm ... ich glaub weil ich da 
schon überall war. Trotzdem danke für den dezenten Hinweis google zu 
verwenden.

@Rolf:
Er ist 64Bit. Ich dachte der GCC sollte so klug sein das zu erkennen.

Immerhin bin ich es als Mensch ja auch, dass ich weiß wie ich per Hand 
MMX optimiere wenn ich ein unsigned long long vor mir habe.

Aber du scheinst ja schon zu wissen was man für einen Datentyp verwenden 
muss. Ein kleiner Hinweis würde mir schon reichen.

Mfg
Gast

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Immerhin bin ich es als Mensch ja auch, dass ich weiß wie ich per Hand
> MMX optimiere wenn ich ein unsigned long long vor mir habe.

Ja? Wie denn? Die MMX bietet keine 64bit-Operationen an. Es werden 
vielmehr mehrere kleinere Operationen (2 mit je 32 bit, 4 mit je 16 bit 
oder 8 mit je 8 bit) parallel ausgeführt.

> Aber du scheinst ja schon zu wissen was man für einen Datentyp
> verwenden muss. Ein kleiner Hinweis würde mir schon reichen.

Alle Integers, die kleiner sind als 64 bit und als Array vorliegen, 
würde ich schätzen.
Du kannst die MMX-Befehle im GCC auch explizit nutzen. Siehe:
http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/X86-Bu...

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>> Immerhin bin ich es als Mensch ja auch, dass ich weiß wie ich per Hand
>> MMX optimiere wenn ich ein unsigned long long vor mir habe.

> Ja? Wie denn? Die MMX bietet keine 64bit-Operationen an. Es werden
> vielmehr mehrere kleinere Operationen (2 mit je 32 bit, 4 mit je 16 bit
> oder 8 mit je 8 bit) parallel ausgeführt.

Offenbar hast du noch nicht besonders viel mit MMX gemacht.

Es gibt unter anderem pand, por, pxor, psllq, psrlq usw, und das sind 
sehr wohl 64Bit Operationen.

Aber zumindest hat mich dein Link auf die richtige Spur geführt:
> di __builtin_ia32_pand (di, di)

"di" ist wohl der Datentyp nachdem ich gesucht habe. Die Frage ist halt, 
ob GCC dann auch wirklich MMX Optimierungen verwendet oder ob da nur ein 
typedef unsigned long long dahintersteckt. Aber das seh ich ja dann 
gleich ...

Explizit will ich eigentlich die MMX-Befehle nicht verwenden. Ich hatte 
mir schon die Arbeit gemacht und 500 Zeilen Code nach MMX portiert, der 
dann langsamer war, weil der GCC mit -O3 schon echt gut optimiert und 
ich viele unvorhersehbare Speicherzugriffe auf eine Tabelle hatte, die 
nicht in den Cache gepasst hat. Die Speicherzugriffe hat GCC recht gut 
wegoptimiert.

Weil bei mir aber im Großen und Ganzen nur logische 64Bit-Operationen 
(siehe oben) vorkommen hatte ich gehofft der GCC kapiert das und 
verwendet selber MMX.

Wenn Interesse besteht poste ich dann das Ergebnis wenn ich es 
ausprobiert hab.

Mfg
Gast

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> bla.cc:230: internal compiler error: in perform_integral_promotions, at 
cp/typeck.c:1448
> Please submit a full bug report,
> with preprocessed source if appropriate.

Hmm ... okay das scheint nicht zu funktionieren.

Man muss explizit dann die MMX-Befehlen verwenden. Dann kann ich aber 
gleich den inline Assembler oder noch besser einen externen mit 
vernünftiger Intel-Syntax verwenden.

Mfg
Gast

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Please submit a full bug report,

Dann tu das doch.  Allerdings solltest du u. U. zuvor nochmal gucken,
ob das in der aktuellen Compilerversion (also wenigstens 4.1.x)
auch noch so auftritt.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Jörg:
Ich bin da auf einen Bugreport von '2004 gestoßen, der genau das 
Phänomen beschreibt, wenn man einen Vector-Datentyp in ein unsigned long 
long casten versucht.

Ist offenbar nie behoben worden.

Ich glaub daher nicht, dass es einen Sinn hat den Bug aufzuwärmen.

Mfg
Gast

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.