2016-06-27 33 views
-1

Ich bin ein Benchmarking einer Reihe von Anwendungen auf einem SandyBridge-Prozessor (i7-3820). Der Benchmark besteht aus zwei verschiedenen Versionen. Diese beiden Versionen enthalten den gleichen Code mit dem einzigen Unterschied, dass die erste Version sse/sse2 -Instrinsics und die zweite Version avx -Instrinsics verwendet.sse und avx Leistung auf Sandybridge und IvyBridge

Für die Erstellung der Benchmark I 2015

Kompilieren die Version mit sse instrinsics entweder auf x64 oder x86 dem Visual Studio verwende, ist die Ausführungszeit fast das gleiche. Aber, die Benchmark mit avx Instrinsics für x64 kompilierend, ist die Ausführungszeit am schlechtesten (fast doppelt so lang), verglichen den Benchmark mit Avx Instrinsisc und kompiliert für x86. Darüber hinaus ist die Ausführungszeit des mit x86 kompilierten Avx-Benchmarks nur eine kleine Beschleunigung (x8%), verglichen mit dem Benchmark der sse-Instrinsics.

Schließlich habe ich die oben genannten Konfigurationen auf einem Ivy-Bridge-Prozessor (i7-3770) getestet und die Ausführungszeiten zwischen x64 und x86 für avx intrincis war gleich. Aber die intrinsischen Avx-Eigenschaften zeigten keine Verbesserung gegenüber der SSE.

Gibt es eine Erklärung über die schlechte Leistung von Avx Instrinsics auf Sandy Bridge zum Kompilieren für x64?

Warum zeigen die zwei Architekturen keine Beschleunigung für den Befehl avx gegen die Befehle sse?

Außerdem habe ich versucht, verschiedene Kompilierung Wechsel von Arch: AVX zu/arch: SSE2 und umgekehrt, aber nichts wurde zu Ausführungszeiten geändert. Aber wenn ich recht habe, bewirkt die Eigenschaft Enable Enhanced instruction set in Visual Studio nur die Vektorisierung.

Vielen Dank im Voraus.

+3

Konnten Sie den Code auch bekannt geben? – harold

+3

Es hängt wirklich davon ab, welche AVX-Anweisungen Sie verwenden - einige bieten keinen Vorteil gegenüber ihren SSE-Äquivalenten. Aber ohne Ihren Code zu sehen, können wir nur raten, was nicht sehr konstruktiv ist. Bitte poste den entsprechenden Code, vorzugsweise als [mcve]. –

+0

'/ arch: AVX' Effekte mehr als Vektorisierung, es ermöglicht vex codierte Anweisungen, d. H., Wenn Sie versuchen, AVX intrinsics ohne'/arch: AVX' zu verwenden, wird es nicht funktionieren. –

Antwort

2

die Benchmark mit AVX instrinsics für x64 kompilieren, ist die Ausführungszeit

Mit ziemlicher Sicherheit von AVX < schlimmsten Fall -> SSE Übergang Verzögerungen von mixing legacy SSE with 256bit AVX instructions without a vzeroupper.

Siehe Using AVX CPU instructions: Poor performance without "/arch:AVX"

x64-Binärdateien wahrscheinlich auch Legacy-SSE2 Anweisungen für skalare FP Mathematik verwenden. Wenn Sie den Code mit aktiviertem AVX kompilieren, sollten diese Anweisungen die VEX-Codierung verwenden. Aber Sie brauchen immer noch vzeroupper um Aufrufe an Bibliotheksfunktionen.

Ihre x86 32bit-Binärdatei verwendet wahrscheinlich keine älteren SSE2-Anweisungen zwischen AVX-Funktionen, möglicherweise nicht einmal in Bibliotheksfunktionsaufrufen.


edit: i7-3820 is 32nm SandyBridge-E, nicht Ivybridge, mein Fehler. Siehe Agner Fog's microarch pdf und das Tag-Wiki, wenn Sie neugierig auf den Unterschied zwischen SnB und IvB sind.

Ich denke du sagst, dass AVX war weniger eine Beschleunigung über SSE auf Ihrem IvB. Eine der wichtigsten Neuerungen in IvB ist Mov-Elimination. Es handhabt movdqa xmm,xmm Register-> Register bewegt sich in der Umbenennungsstufe ohne Wartezeit, ohne eine Ausführungseinheit zu benötigen.

Wenn Sie nur AVX-Übergangsverzögerungen auf einem Computer sehen, kompilieren Sie möglicherweise mit verschiedenen Bibliotheken oder Compiler-Versionen.

Wenn Sie mehr von einer Antwort als das wollen, legen Sie einige tatsächliche Zahlen in der Tabelle der Aufzählungsliste, wo wir sie alle leicht sehen können.

+0

Warum beobachten die OP Übergangsverzögerungen mit Sandy Bridge, aber nicht mit Ivy Bridge? Das OP schrieb: "Ich habe die obigen Konfigurationen an einem Ivy-Bridge-Prozessor (i7-3770) getestet und die Ausführungszeiten zwischen x64 und x86 für Avx-Instrincis waren gleich. Aber die Avx-Intrinsics zeigten keine Verbesserung gegenüber der SSE." Daraus folgere ich, dass das OP bei AVX auf Ivy Bridge keine schlechtere x86-64-Performance sieht. –

+0

@Zboson: Oh, ich habe nicht einmal bemerkt, dass er eine seiner i7-3xxx-CPUs eine IvB genannt hat. Ich schaute auf die Zahlen und sah, dass sie beide IvB waren, also nahm ich an, dass sie derselbe Mikroarch waren und verpassten, was er über Perf Differenzen sagte. Einige tatsächliche Zahlen in einem einfach zu betrachtenden Format (wie eine Aufzählungsliste oder eine Tabelle) würden viel dazu beitragen, dies zu einer besseren Frage zu machen. –

+0

Wie auch immer, wenn das OP verschiedene Compiler oder Bibliotheken auf den verschiedenen Computern verwendet, hat vielleicht einer von ihnen vzeroupper automatisch? –