2010-05-17 6 views
7

Ich bin neugierig, verwenden neue Compiler einige zusätzliche Funktionen in neue CPUs wie MMX SSE, 3DNow! und so?C/C++ Verwendung von speziellen CPU-Funktionen

Ich meine, in Original 8086 gab es sogar keine FPU, so Compiler, dass alte nicht einmal verwenden kann, aber neue Compiler können, da FPU ist Teil jeder neuen CPU. Verwenden neue Compiler neue CPU-Funktionen?

Oder sollte es besser zu fragen, verwendet neue C/C++ Standart-Bibliothek Funktionen neue Funktionen?

Danke für die Antwort.

EDIT:

OK, also, wenn ich euch alle richtig, sogar einige standart Operationen, vor allem mit Float-Zahlen durchgeführt werden kann unter Verwendung von SSE schneller.

Um es zu verwenden, muss ich diese Funktion in meinem Compiler aktivieren, wenn es dies unterstützt. Wenn dies der Fall ist, muss ich sicher sein, dass die Zielplattform diese Funktionen unterstützt.

Bei einigen Systembibliotheken, die eine hohe Leistung erfordern, z. B. OpenGL, DirectX usw., wird diese Unterstützung möglicherweise im System unterstützt.

Aus Kompatibilitätsgründen unterstützt der Compiler diese Funktion standardmäßig nicht. Sie können diese Unterstützung jedoch mit speziellen C-Funktionen von z. B. Intel hinzufügen. Dies sollte der beste Weg sein, da Sie direkt steuern können, ob und wann Sie spezielle Funktionen der gewünschten Plattform verwenden, um Multi-CPU-Support-Anwendungen zu schreiben.

+1

In Ihrem nächsten Stack Overflow-Beitrag fügen Sie bitte Leerzeilen zwischen Ihren Fragen hinzu, da dies die Identifizierung der Fragen erleichtert (insbesondere bei der Entwicklung von Antworten für Sie). –

+0

OK, danke für den Rat. –

+0

Berücksichtigen Sie, dass sogar ein grundlegendes 'add' auf verschiedenen Prozessorfamilien anders implementiert wird. Der Compiler durchläuft die gleichen grundlegenden Bewegungen, wenn er zwischen PPC-Ausgabe und Intel-Ausgabe wählt, wenn er zwischen SSE-Ausgabe und Nicht-SSE-Ausgabe wählt. –

Antwort

4

gcc unterstützt neuere Anweisungen über Befehlszeilenargumente. Weitere Informationen finden Sie unter here. Zu zitieren:

GCC Vorteil der zusätzlichen Anweisungen in der MMX nehmen, SSE, SSE2, SSE3 und 3dnow Erweiterungen der jüngsten Intel und AMD-Prozessoren. Die Optionen -mmmx, -msse, -msse2, -mssse3 und -m3dnow ermöglichen die Verwendung dieser zusätzlichen Anweisungen, so dass mehrere Datenwörter gleichzeitig verarbeitet werden können. Die resultierenden ausführbaren wird nur auf Prozessoren laufen die entsprechenden Erweiterungen unterstützen - auf anderen Systemen werden sie mit einem Illegal Befehlsfehler abstürzen (oder ähnlich)

1

Compiler zum Erzeugen von Code für einen minimalen Satz Ziel Funktionen in einem Prozessor. Sie bieten auch Kompilierungsschalter, mit denen Sie bestimmte Prozessoren gezielt ansprechen können. Auf diese Weise können sie mehr Compiler verkaufen (an Leute mit alten Prozessoren ebenso wie an trendige Leute mit neuen).

Sie müssen die Dokumentation lesen, die mit Ihrem Compiler geliefert wurde.

0

Unterschiedliche Compiler verwenden unterschiedliche neue Funktionen. Visual Studio wird SSE/2 verwenden, und ich glaube, dass der Intel-Compiler die neuesten CPU-Funktionen unterstützt. Sie sollten natürlich vorsichtig sein über die Marktdurchdringung Ihrer Lieblingsfunktion.
Was Ihre Lieblings-Standardbibliothek verwendet, hängt davon ab, mit was sie kompiliert wurde. Die C++ - Standardbibliothek wird jedoch in der Regel vor Ort kompiliert, da sie sehr stark auf Vorlagen basiert. Wenn Sie also SSE2 aktivieren, sollten die C++ - Standardbibliotheken sie verwenden. Wie für die CRT, hängt davon ab, mit was sie kompiliert wurden.

0

Generell gibt es zwei Möglichkeiten, wie ein Compiler kann Code generieren, die spezielle Eigenschaften wie diese verwendet:

  1. Wenn der Compiler selbst kompiliert wird, konfigurieren Sie es Code für eine bestimmte Architektur zu erzeugen, und es können die Vorteile nehmen von irgendwelchen Eigenschaften, die es weiß, dass Architektur haben wird. Beispiel: Wenn gcc für einen Intel-Prozessor konfiguriert ist, der neu genug ist (oder "nicht alt genug" ist), um eine integrierte FPU zu enthalten, generiert er Fließkommaanweisungen.
  2. Wenn der Compiler aufgerufen wird, können Flags oder Parameter den Typ der Funktionen angeben, die dem Prozessor zur Verfügung stehen, der das Programm ausführt, und dann weiß der Compiler, dass diese Funktionen sicher verwendet werden können. Wenn die Flags nicht vorhanden sind, wird es äquivalenten Code generieren, ohne die speziellen Anweisungen zu verwenden, die von diesen Features bereitgestellt werden.
+0

* "Wenn der Compiler selbst kompiliert wird" * Uhm, warum muss das schon beim Kompilieren des Compilers geschehen? –

+0

@Viktor es nicht. Mein Punkt ist, dass wenn Sie den Compiler erstellen, er automatisch einige grundlegende Dinge über seine Zielplattform weiß, basierend darauf, ob Sie es konfigurieren, um ausführbare Dateien für 8086, Pentium, PowerPC, SPARC, was auch immer zu generieren. Wenn Sie einen Compiler zum Generieren von Pentium-kompatiblen ausführbaren Dateien erstellen, kann er spezielle Funktionen verwenden, die zuvor in die x86-Architektur eingeführt wurden, die nicht in der 386 enthalten waren, obwohl sie sich zum Beispiel in derselben Familie befinden. –

1

Manchmal enthält die Laufzeitbibliothek mehrere Implementierungen eines Features, und die Bibliothek wählt beim Ausführen des Programms dynamisch zwischen Implementierungen. Der Overhead könnte die Kosten eines Funktionszeigeranrufs anstelle eines direkten Funktionsaufrufs sein, aber der Nutzen könnte viel größer sein, wenn eine CPU-spezifische optimierte Funktion verwendet wird.

JIT-Compiler (für VM-Sprachen wie Java und C#) gehen einen Schritt weiter und kompilieren den Bytecode für die spezifische CPU, auf der sie läuft. Dies gibt Ihrem eigenen Code den Vorteil einer spezifischen CPU-Optimierung. Dies ist ein Grund, warum Java-Code tatsächlich schneller als kompilierter C-Code sein kann, da der Java JIT-Compiler seine Optimierungsentscheidungen verzögern kann, bis das Programm auf dem tatsächlichen Zielcomputer ausgeführt wird. Ein C-Compiler muss diese Entscheidungen treffen, ohne immer zu wissen, was die Ziel-CPU ist. Darüber hinaus entwickeln sich JIT-Compiler und können Ihr Programm im Laufe der Zeit schneller machen, ohne dass Sie etwas tun müssen.

0

Wenn Sie über in C/C++ geschriebenen Code sprechen, werden die neuen Features explodiert, wenn Sie dies Ihrem Compiler mitteilen. Standardmäßig zielt Ihr Compiler wahrscheinlich auf "plain x86" (natürlich mit FPU :)), normalerweise optimiert für die derzeit am weitesten verbreitete Prozessorgeneration, aber immer noch in der Lage, auf älteren Prozessoren zu laufen.

Wenn der Compiler Code auch unter Berücksichtigung der neuen Befehlssätze generieren soll, sollten Sie ihn mit der entsprechenden Befehlszeilenoption/Projekteinstellung angeben, z. B. für Visual C++ die Option zur Generierung von SSE/SSE2-Befehlen ist /arch.

Beachten Sie, dass viele Features neuer Befehlssätze nicht direkt in "normalem" Code ausgenutzt werden können. Daher werden Ihnen normalerweise Compiler-Intrinsics zur Verfügung gestellt, um die speziellen Datentypen der neuen Befehlssätze zu verarbeiten.

1

Wenn Sie den Intel C-Compiler verwenden und ausreichend hohe Optimierungsoptionen einstellen, werden Sie feststellen, dass einige Ihrer Schleifen "vektorisiert" werden, was bedeutet, dass der Compiler sie neu geschrieben hat, um Anweisungen im SSE-Stil zu verwenden.

Wenn Sie SSE-Operationen direkt verwenden möchten, verwenden Sie die in der Header-Datei 'xmmintrin.h' definierten Eigenschaftswerte; sagen

#include <xmmintrin.h>

__m128 U, V, W; Schwimmer ww [4];

V = _mm_set1_ps (1.5);

U = _mm_set_ps (0,1,2,3);

W = _mm_add_ps (U, V);

_mm_storeu_ps (ww, W);

0

Intel stellt jedes Mal, wenn sie eine neue CPU veröffentlichen, einen aktualisierten CPUID-Beispielcode bereit, damit Sie nach den neuen Funktionen suchen können und so lange ich mich erinnern kann. Zumindest habe ich das erste Mal gefunden, als ich über diese Frage nachdachte.

Using CPUID to Detect the presence of SSE 4.1 and SSE 4.2 Instruction Sets

Als neuer Compiler freigegeben werden sie die neuen Funktionen direkt wie VS2010 zum Beispiel hinzufügen. Visual C++ Code Generation in Visual Studio 2010