2012-05-21 9 views
16

Für die GCC CFLAGS Optionen: -msse, -msse2, -mssse3, -msse4, -msse4.1, -msse4.2. Sind sie exklusiv in ihrer Verwendung oder können sie zusammen verwendet werden?Was ist der Unterschied zwischen den Optionen cflgs, -msse, -msse2, -mssse3, -msse4 rtc ..? und wie zu bestimmen?

Mein Verständnis ist, dass die Auswahl, die festgelegt wird, davon abhängt, ob der Zielbogen, auf dem das Programm ausgeführt wird, es unterstützt oder nicht, ist das korrekt?

Wenn ja, woher weiß ich, was mein Zielbogen unterstützt? In Linux cat/proc/cpuinfo, aber was ist, wenn Mac oder Windows?

Danke!

+0

SSE-Anweisungen wurden über verschiedene Generationen von CPUs verbessert/modifiziert. Das Kompilieren für ein 4.2-Ziel schließt die Verwendung des generierten Codes bei älteren Generationen aus. –

+0

danke für die erste Antwort. Also, was soll ich wählen? nur die neueste (ist es-msse4.2)? – yaya

+0

Wenn Sie keine spezielle SIMD-Anforderung haben, kompilieren Sie nur für den kleinsten gemeinsamen Nenner, d. H. Lassen Sie die Schalter -msse aus. –

Antwort

27

Die -m Switched können parallel verwendet werden, darüber hinaus sind einige von ihnen durch die Architektur oder andere Schalter impliziert. Wenn Sie beispielsweise Code für x86_64 erstellen, ist -msse -msse2 immer aktiviert.

Für Code, der auf Ihrem System ausgeführt werden soll, sollten Sie -march=native auswählen, wodurch ausgewählt wird, was auf Ihrem Prozessor verfügbar ist. Zum Beispiel, wenn Sie eine Sandy Bridge haben, aktiviert dies -msse -msse2 -msse3 -mssse3 -msse4 -msse4.1 -msse4.2 -mavx.

Wenn Sie im Detail angeben möchten, welcher Befehlssatz verwendet werden soll, sollten Sie nur das verwenden, was verfügbar ist, nicht immer das "neueste". Die "neueste" ist derzeit -mavx2, die ich nicht empfehlen: Der erste Prozessor, der es unterstützt, wird im Jahr 2013 verfügbar sein.

+0

Was ist der Sinn von 'msse4'? Soweit ich das beurteilen kann, ist es das gleiche wie 'msse4.2'. Vielleicht schafft es ein Makro '__SSE4__'? Es scheint nur Verwirrung zu stiften. –

+0

@Zboson Ich weiß nicht, was der Punkt ist. Du solltest fragen, dass es auf der gcc-Mailingliste überhaupt keinen Unterschied gibt (noch?). Sie können das mit etwas wie 'gcc -dM -E-msse4.2 - 1; gcc-dM -E-msse4 - 2; diff 1 2' überprüfen – hirschhornsalz