/arch (Minimale CPU-Architektur)
Aktualisiert: November 2007
Gibt die Architektur für die Codegenerierung unter Verwendung von SSE-Anweisungen (Streaming-SIMD-Erweiterungen) und SSE2-Anweisungen (Streaming-SIMD-Erweiterungen 2) an.
/arch:[SSE|SSE2]
Hinweise
Hinweis: |
---|
/arch ist nur verfügbar, wenn für die x86-Plattform kompiliert wird. Diese Compileroption ist nicht verfügbar, wenn für x64 oder Itanium kompiliert wird. |
Die SSE-Anweisungen werden in verschiedenen Pentium- und AMD Athlon-Prozessoren verwendet. SSE2-Anweisungen sind derzeit lediglich im Pentium 4-Prozessor vorhanden.
/arch:SSE ermöglicht dem Compiler, die SSE-Anweisungen zu verwenden, und /arch:SSE2 ermöglicht dem Compiler die Verwendung der SSE2-Anweisungen.
_M_IX86_FP gibt an, welche /arch-Compileroption verwendet wurde. Weitere Informationen finden Sie unter Predefined Macros.
Der Optimierer legt fest, wann und wie die SSE- und SSE2-Anweisungen bei Angabe von /arch genutzt werden. SSE- und SSE2-Anweisungen werden derzeit für einige skalare Gleitkommaberechnungen verwendet, und zwar in Fällen, in denen die Verwendung der SSE/SSE2-Anweisungen und -Register Leistungsvorteile gegenüber dem x87-Gleitkomma-Registerstapel bietet. Dies bedeutet, dass im Code für Gleitkommaberechnungen tatsächlich eine Kombination aus x87 und SSE/SSE2 verwendet wird. Darüber hinaus können mit /arch:SSE2 SSE2-Anweisungen für einige 64-Bit-Ganzzahloperationen verwendet werden.
Neben den SSE- und SSE2-Anweisungen verwendet der Compiler weitere Anweisungen, die in den jeweiligen Prozessorrevisionen mit SSE- und SSE2-Unterstützung verfügbar sind. Die CMOV-Anweisung, die zuerst in der PentiumPro-Revision der Intel-Prozessoren verwendet wurde, ist ein Beispiel hierfür.
Bei der Kompilierung mit /clr (Common Language Runtime-Kompilierung) hat /arch keinen Einfluss auf die Codegenerierung für verwaltete Funktionen, da /arch lediglich Auswirkungen auf die Codegenerierung für systemeigene Funktionen hat.
/arch und /QIfist (_ftol unterdrücken) dürfen nicht in derselben Kompiliereinheit verwendet werden.
Insbesondere wird, wenn der Benutzer das FP-Steuerwort nicht mit _controlfp ändert, das Genauigkeitskontrollfeld des x87-FPU-Steuerworts durch den Laufzeit-Startcode auf 53 Bits festgelegt, sodass alle Operationen mit dem Typ float und double innerhalb eines Ausdrucks mit einem 53-Bit-Signifikanden und einem 15-Bit-Exponenten ausgeführt werden. Alle SSE-Operationen mit einfacher Genauigkeit verwenden jedoch 24-Bit-Signifikanden/8-Bit-Exponenten, und SSE2-Operationen mit doppelter Genauigkeit verwenden 53-Bit-Signifikanden/11-Bit-Exponenten. Weitere Informationen finden Sie unter _control87, _controlfp, __control87_2.
Zur Veranschaulichung: Diese Unterschiede können in einer einzigen Ausdrucksbaumstruktur auftreten. Dies gilt nicht, wenn nach jedem untergeordneten Ausdruck eine Benutzerzuordnung stattfindet:
r = f1 * f2 + d; // Different results are possible on SSE/SSE2.
Gegenüber:
t = f1 * f2; // Do f1 * f2, round to the type of t.
r = t + d; // This should produce the same overall result
// regardless whether x87 stack or SSE/SSE2 is used.
Da die MXCSR-Steuerbits durch controlfp nicht geändert werden, werden Funktionen, die die Verwendung von controlfp voraussetzen, durch /arch:SSE2 außer Kraft gesetzt.
So legen Sie diese Compileroption in der Visual Studio-Entwicklungsumgebung fest
Öffnen Sie das Dialogfeld Eigenschaftenseiten des Projekts. Ausführliche Informationen finden Sie unter Gewusst wie: Öffnen von Projekteigenschaftenseiten.
Klicken Sie auf den Ordner C/C++.
Klicken Sie auf die Eigenschaftenseite Codegenerierung.
Ändern Sie die Eigenschaft Erweitertes Anweisungsset aktivieren.
So legen Sie diese Compileroption programmgesteuert fest
- Siehe EnableEnhancedInstructionSet.