Forum: Compiler & IDEs GCC und MMX-Optimierung


von Gast (Gast)


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

von Simon K. (simon) Benutzerseite


Lesenswert?


von Rolf Magnus (Gast)


Lesenswert?

Was hat der von dir verwendete 64bit-Datentyp mit MMX zu tun?

von Gast (Gast)


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

von Rolf Magnus (Gast)


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-Built_002din-Functions.html#X86-Built_002din-Functions

von Gast (Gast)


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

von Gast (Gast)


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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

von Gast (Gast)


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

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.