2017-08-24 2 views
-2

Donc, je reçois cette erreur en essayant de compiler Dolphin. J'ai essayé clang-3.7 et 3.8 avec GCC 5.2 et 6.3. Ce qui est bizarre, c'est que toutes les autres fonctions _mm semblent fonctionner, c'est juste celle-ci.erreur: utilisation de l'identificateur non déclaré '_mm_shuffle_epi8' Ubuntu 16.04 Ryzen

+3

Quels autres éléments intrinsèques avez-vous essayé? '_mm_shuffle_epi8' est dans SSSE3; Incluez-vous '' ou ''? Compilez-vous avec '-mssse3'? – nemequ

+0

J'ai ajouté et j'ai essayé ce drapeau et il refuse toujours. J'ai l'impression qu'il me manque quelque chose, ou si GCC/clang n'a pas activé cette fonctionnalité pour l'architecture Zen. – Mitchell

+0

Si vous spécifiez SSSE3 pour une cible x86, cela ne devrait pas vraiment avoir d'importance sur le processeur que vous utilisez; Les compilateurs doivent générer du code même pour des cibles qu'ils ne supportent pas réellement. Assurez-vous que '__SSSE3__' est défini dans le préprocesseur (ce que -mssse3 devrait faire). Aussi, notez que c'est ssse3 pas sse3 ... – nemequ

Répondre

1

SSE2 est de référence pour x86-64, ce qui explique pourquoi d'autres fonctions _mm travail (vous avez probablement seulement essayé fonctions SSE2, aucune autre fonction SSE3/SSSE3/SSE4 comme _mm_abs_epi8 ou _mm_cvtepi16_epi32).

Vous devez -mssse3 (activé par -march=native ou -march=znver1 dans votre cas) d'utiliser SSSE3 intrinsics avec gcc/clang, à la différence MSVC.


Notez que -mssse3 ne définit pas -mtune=, mais -march= ne accordeur, il est donc préférable d'utiliser -march=native que de simplement activer une extension deux ISA avec -mpopcnt -msse4.1 ou quelque chose, surtout si vous ne prévoyez exécuter le binaire sur un processeur cible.

Par exemple, pour permettre AVX2, il est probablement préférable d'utiliser -march=haswell ou -march=znver1, car -mavx2 ne l'emporte pas sur le comportement -mtune=generic de -mavx256-split-unaligned-load, même si aucun CPU AVX2 supportant en bénéficient (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80568). c'est-à-dire -mtune=generic utilise toujours les paramètres de réglage entièrement génériques, plutôt que d'effectuer un réglage pour l'ensemble des processeurs prenant en charge les extensions activées.

Sandybridge bénéficie de -mavx256-split-unaligned-load/...store, mais il ne supporte que AVX, pas AVX2. Et même dans ce cas, uniquement lorsque les données sont mal alignées au moment de l'exécution, vous ne le voudrez peut-être pas si vos données sont alignées 99% du temps.