[VC++ 2010 x86] SSE statt FPU erzwingen

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

[VC++ 2010 x86] SSE statt FPU erzwingen

Beitrag von Krishty »

Hi,

Ich arbeite hier gerade auf einem drei Jahre alten Intel Atom an einer gleitkommaintensiven Anwendung. Das Optimization Manual sagt:
Assembly/Compiler Coding Rule 9. (MH impact, H generality)
For Intel Atom processors, prefer SIMD instructions operating on XMM register over X87 instructions using FP stack. Use Packed single-precision instructions where possible.
So. Würde ich ja gern machen, aber mein Atom ist bloß x86. Visual C++ 2010 nutzt in x86 den FP Stack, selbst mit /Arch:SSE2 wandern nur wenige Operationen durch die XMM-Register.

Der Unterschied im Manual ist minimal; 20 % geringere Latenz für einige Befehle. Parallelisierung, die den Durchsatz verdoppeln würde, kriegt Visual C++ nicht hin. Allerdings setze ich an einigen Stellen explizit Intrinsics ein, und die Werte werden dann ständig zwischen XMM-Registern und FP Stack hin- und hergeschoben. Das macht mir Sorgen.

Wie kriege ich jetzt so hübschen schlanken Maschinentext, wie mir x64 auf meinem PC ausspuckt, in mein x86-Kompilat?

Bitte keine Intrinsics. Ja; damit würde ich das alles doppelt und dreimal (so, wie ich mich kenne, wohl auch zehnmal) so schnell kriegen. Dann würde ich aber auch noch 100 Jahre dransitzen. Außerdem habe ich kein Internet und Auflösung 1024×768, also könnte ich garnicht so viel in der MSDN nachschlagen wie ich an Intrinsics brauche.

Gruß, Ky
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: [VC++ 2010 x86] SSE statt FPU erzwingen

Beitrag von dot »

Ich glaub nicht, dass du MSVC zu SSE zwingen kannst. Hast du dir eigentlich schonmal überlegt, dir den ICC zuzulegen? ;)
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

Re: [VC++ 2010 x86] SSE statt FPU erzwingen

Beitrag von kimmi »

Würde ich an der Stelle auch empfehlen. Haben wir in meiner letzten Firma speziell aus solchen Gründen angeschafft.

Gruß Kimmi
Benutzeravatar
Lynxeye
Establishment
Beiträge: 145
Registriert: 27.02.2009, 16:50
Echter Name: Lucas
Wohnort: Hildesheim
Kontaktdaten:

Re: [VC++ 2010 x86] SSE statt FPU erzwingen

Beitrag von Lynxeye »

Ich weiß, dass dich diese Antwort bei deinem konkreten Problem nicht weiter bringt, aber da sowieso gerade mit Compilerempfehlungen um sich geworfen wird: beim GCC lässt sich das wunderbar über Flags einstellen.
GCC Wiki 'Floating Point Math' hat geschrieben:On more modern x86 processors that support SSE2, specifying the compiler options -mfpmath=sse -msse2 ensures all float and double operations are performed in SSE registers and correctly rounded.
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [VC++ 2010 x86] SSE statt FPU erzwingen

Beitrag von Krishty »

Okay, also direkt einen anderen Compiler. Wenn ich eh schon wechsle, dann werde ich auf Clang umsteigen. Ich habe nur im Augenblick noch Vorbehalte, eine andere IDE als Visual Studio einzusetzen …
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Chromanoid
Moderator
Beiträge: 4254
Registriert: 16.10.2002, 19:39
Echter Name: Christian Kulenkampff
Wohnort: Lüneburg

Re: [VC++ 2010 x86] SSE statt FPU erzwingen

Beitrag von Chromanoid »

Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: [VC++ 2010 x86] SSE statt FPU erzwingen

Beitrag von dot »

Du kannst dir auch eine Clang Integration für VS basteln... ;)
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [VC++ 2010 x86] SSE statt FPU erzwingen

Beitrag von Krishty »

@Chromanoid: Danke, im Augenblick nutze ich ihn noch mit Eclipse.

@dot: Bäh, basteln. Ich habe irgendwann vor einem halben Jahr schonmal so ein Plugin für VS runtergeladen und nie zum Laufen gekriegt. Ich will nichts basteln – ich bin Benutzer des Compilers, nicht sein Entwickler. So lange die Open Source-Projekte das nicht kapieren, bleibt MS meine Nummer Eins.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Chromanoid
Moderator
Beiträge: 4254
Registriert: 16.10.2002, 19:39
Echter Name: Christian Kulenkampff
Wohnort: Lüneburg

Re: [VC++ 2010 x86] SSE statt FPU erzwingen

Beitrag von Chromanoid »

Krishty hat geschrieben:Ich will nichts basteln – ich bin Benutzer des Compilers, nicht sein Entwickler. So lange die Open Source-Projekte das nicht kapieren, bleibt MS meine Nummer Eins.
Genau hier unterscheidet sich IMO NetBeans von Eclipse.
Benutzeravatar
Jeason
Beiträge: 41
Registriert: 07.09.2010, 22:58

Re: [VC++ 2010 x86] SSE statt FPU erzwingen

Beitrag von Jeason »

Naja du könntest mal das hier probieren wenn du Clang in Visual Studio haben willst:
https://github.com/ishani/ClangVSx

Ich hoffe jetzt nicht das war das Plugin was du schon mal ausprobiert hast ;)
Ich verkaufe diese feinen Lederjacken.
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [VC++ 2010 x86] SSE statt FPU erzwingen

Beitrag von Krishty »

(Entschuldigt die Leichenschändung)
Jeason hat geschrieben:Naja du könntest mal das hier probieren wenn du Clang in Visual Studio haben willst:
https://github.com/ishani/ClangVSx

Ich hoffe jetzt nicht das war das Plugin was du schon mal ausprobiert hast ;)
Doch, das war es.

Ich einer launischen Verstimmung habe ich gestern den Versuch, auf Clang umzusteigen, wieder aufgegriffen und das Add-In erneut ausprobiert.

Vornweg: Auf dem Papier hört es sich absolut brillant an. Höchst ansehnlich, dass sogar ein fertig gepatchtes Clang 3.2 ausführbar zum Download bereitsteht (was ich erst selber kompilieren muss, probiere ich aus Prinzip nicht aus).

Leider geht es immer noch nicht. Die Toolbars fehlen komplett; ich habe keine Möglichkeit, das Plug-In anzusteuern. Dass es lebt, sehe ich ausschließlich daran, dass mir im Output-Fenster Clang C/C++ angezeigt wird und es mir Visual C++’ Add-In-Manager als aktiviert anzeigt.

Sonst tut sich nichts. Keine Toolbar, kein Button, kein Kontextmenü. Ich kann nichts machen; ergo auch nicht den Clang-Pfad einstellen. Ich habe mehrfach meine Visual C++-Einstellungen zurückgesetzt, habe endlos oft devenv.exe /ResetAddin * probiert und das Add-In eine gefühlte Million Mal zurückgesetzt und neu installiert. Der letzte Ausweg wäre, Visual C++ neu zu installieren, aber darauf habe ich einfach keinen Bock mehr.

Schade. Schon wieder.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: [VC++ 2010 x86] SSE statt FPU erzwingen

Beitrag von CodingCat »

Visual Studio vor/nach/zur Installation als Admin gestartet? Musste ich für ein anderes Add-In mal, muss aber nicht helfen.
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [VC++ 2010 x86] SSE statt FPU erzwingen

Beitrag von Krishty »

Nein. Alles mit Admin-Rechten wiederholt; kein Ergebnis. Clang C/C++ im Output-Fenster bleibt das einzige Lebenszeichen.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [VC++ 2010 x86] SSE statt FPU erzwingen

Beitrag von Krishty »

Fortschritt: Auf meinem Eee PC unter VS 2010 funktioniert das Plugin jetzt. Im Gegensatz zu meiner Produktivmaschine ist das Laden hier mit dem Fehler 80131515 fehlgeschlagen, weswegen ich loadFromRemoteSources in devenv.exe.config eingeschaltet habe. Das Plugin hat dann exakt so weit geladen wie auf meinem x64-System auch: Im Ausgabefenster stand Clang C/C++. Im Gegensatz zum x64-System war das Plugin nach einem Neustart von VS 2010 aber dann vollständig da. Linken geht noch nicht, aber kompilieren tut er es schonmal tun. *freu, hüpf*
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [VC++ 2010 x86] SSE statt FPU erzwingen

Beitrag von Krishty »

Können mir einige der C++-Standard-Gelehrten sagen, wie es um size_t und std::nullptr_t steht? Genauer:

In Visual C++ 2010 sind das built-in-Typen, d.h.: Ich muss nichts #includen, und kann sie trotzdem als Parameter bzw. im Fall von std::nullptr_t als Template-Parameter einsetzen.

Clang hingegen meckert, dass die Typen nicht deklariert seien. Das muss nicht zwingend bei Clang direkt so sein; durch das Plugin läuft er ja im VC++-Kompatibilitätsmodus. Trotzdem:

Wer hat recht? Muss ich die Typen gegebenenfalls tatsächlich selber definieren?


————————

Urks:
COM.cpp(25,3) : error: cannot compile this l-value expression yet
                 __uuidof(::IGlobalOptions),
                 ^~~~~~~~~~~~~~~~~~~~~~~~~~

Jetzt wird COM-Entwicklung eine Qual
Zuletzt geändert von Krishty am 22.09.2012, 19:39, insgesamt 1-mal geändert.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: [VC++ 2010 x86] SSE statt FPU erzwingen

Beitrag von dot »

Clang hat recht, genaugenommen müsstest du <cstddef> inkludieren.
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [VC++ 2010 x86] SSE statt FPU erzwingen

Beitrag von Krishty »

Was ich seit gestern gelernt habe: Ich werde Templates nie nie nie mehr ausschließlich mit Visual C++ kompilieren. Ich kann garnicht so schnell kotzen wie Clangs Fehlermeldungen nachkommen.

Könnt ihr mir erklären, wie ich folgenden Fall zu behandeln habe?

Header:
    template <typename Scalar, size_t dimension> struct Vector; // Vektor beliebiger Dimension und beliebigen Komponententyps

    template <typename Scalar> struct Vector<Scalar, 2> { // 2D-Vektor beliebigen Komponententyps
        Scalar x, y;
        static Vector const zero; // Nullvektor; will ich irgendwo explizit definieren
    };

    // 1. Unterschied Clang / VC: Clang verlangt, dass der Nullvektor vor der ersten Verwendung definiert wird!
    // Ich kann ihn nicht im Header definieren, weil es sonst ein multiply defined symbol wird. Ich versuche eine Vorwärtsdeklaration.
    // 2., unwichtiger Unterschied Clang/VC: Clang verlangt, dass "template <>" davor landet
    template <> Vector<float, 2> const Vector<float, 2>::zero;


Beliebige Übersetzungseinheit:

    template <> Vector<float, 2> const Vector<float, 2>::zero = { 0.0f, 0.0f }; // Visual Studio: error C2086: redefinition; Clang: alles in Ordnung

Lasse ich das template <> vor der Definition weg, schluckt VC es wieder, aber Clang meckert.

Tue ich überhaupt das Richtige? Wie kriege ich das in beiden Compilern zum Laufen? (Lies: Wie sieht die Syntax aus, wenn ich die Spezialisierung eines Template-Klassenattributs in einer Übersetzungseinheit statt im Header definieren will?)
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [VC++ 2010 x86] SSE statt FPU erzwingen

Beitrag von Krishty »

Beim 1. bin ich mir sicher, dass es (vom Ergebnisnamen abgesehen) standardkonform ist; aber wie sieht es beim 2. aus?

    typedef decltype(sizeof(int)) size_t;
    typedef decltype((int *)(nullptr) - (int *)(nullptr)) ptrdiff_t;
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: [VC++ 2010 x86] SSE statt FPU erzwingen

Beitrag von dot »

Sollte imo wohldefiniert sein, ja in dem Fall sollte sogar das Ergebnis definiert sein:
ISO/IEC 14882:2011 hat geschrieben:If the value 0 is added to or subtracted from a pointer value, the result compares equal to the original pointer value. If two pointers point to the same object or both point one past the end of the same array or both are null, and the two pointers are subtracted, the result compares equal to the value 0 converted to the type std::ptrdiff_t.
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [VC++ 2010 x86] SSE statt FPU erzwingen

Beitrag von Krishty »

Perfekt; danke!
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Antworten