2017-08-24 15 views
-2

So bekomme ich diesen Fehler beim Versuch, Dolphin zu kompilieren. Ich habe clang-3.7 und 3.8 zusammen mit GCC 5.2 und 6.3 versucht. Was komisch ist, ist dass alle anderen _mm Funktionen zu funktionieren scheinen, es ist nur dieser.Fehler: Verwendung von undeclared Kennung '_mm_shuffle_epi8' Ubuntu 16.04 Ryzen

+3

Welche anderen intrinsic haben Sie versucht? '_mm_shuffle_epi8' ist in SSSE3; nimmst du '' oder '' '? Kompilierst du mit "-mssse3"? – nemequ

+0

Ich habe hinzugefügt und ich habe diese Flagge ausprobiert und sie weigert sich immer noch. Ich habe das Gefühl, dass mir etwas fehlt, oder wenn GCC/clang diese Funktion für die Zen-Architektur nicht aktiviert hat. – Mitchell

+0

Wenn Sie SSSE3 für ein x86-Ziel angeben, sollte es nicht wichtig sein, welche CPU Sie verwenden. Compiler müssen Code selbst für Ziele generieren, die sie nicht wirklich unterstützen. Stellen Sie sicher, dass '__SSSE3__' im Präprozessor definiert ist (was -mssse3 tun sollte). Beachten Sie auch, dass es ssse3 nicht sse3 ist ... – nemequ

Antwort

1

SSE2 ist Grundlage für x86-64, weshalb andere _mm Funktionen arbeiten (Sie wahrscheinlich versucht, nur SSE2-Funktionen, keine anderen SSE3/SSSE3/SSE4 Funktionen wie _mm_abs_epi8 oder _mm_cvtepi16_epi32).

Sie müssen -mssse3 (aktiviert durch -march=native oder -march=znver1 in Ihrem Fall) SSSE3 intrinsics mit gcc/Klirren, im Gegensatz zu MSVC verwenden.


Beachten Sie, dass -mssse3 stellt nicht -mtune=, aber -march= Tuning nicht gesetzt ist, so ist es besser, -march=native als zu verwenden, um nur ein paar ISA-Erweiterungen mit -mpopcnt -msse4.1 oder etwas zu ermöglichen, vor allem, wenn Sie planen zu laufen die binäre auf einer Ziel-CPU.

Zum Beispiel AVX2 zu ermöglichen, ist es wahrscheinlich besser -march=haswell oder -march=znver1 zu verwenden, da -mavx2 nicht das -mtune=generic Verhalten von -mavx256-split-unaligned-load außer Kraft setzen, auch wenn keine AVX2 tragende CPUs davon profitieren (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80568). d. h., -mtune=generic verwendet immer die vollständig generischen Abstimmungseinstellungen, anstatt zu tun, welche CPUs die aktivierten Erweiterungen unterstützen.

Sandybridge profitiert von -mavx256-split-unaligned-load/...store, aber es unterstützt nur AVX, nicht AVX2. Und selbst dann, wenn die Daten zur Laufzeit tatsächlich falsch ausgerichtet sind, möchten Sie das vielleicht nicht, wenn Ihre Daten zu 99% der Zeit ausgerichtet sind.

Verwandte Themen