2010-11-17 42 views
10

En fait, j'ai 2 questions:Comment tester si votre support Linux SSE2

  1. Est-SSE2 un problème de compatibilité CPU ou problème compilateur?
  2. Comment vérifier si votre CPU ou le support du compilateur SSE2?

J'utilise la version GCC:

gcc (GCC) 4.5.1 

Quand j'ai essayé de compiler un code, il me donne cette erreur:

$ gcc -O3 -msse2 -fno-strict-aliasing -DHAVE_SSE2=1 -DMEXP=19937 -o test-sse2-M19937 test.c 
cc1: error: unrecognized command line option "-msse2" 

Et cpuinfo a montré ceci:

processor : 0 
vendor  : GenuineIntel 
arch  : IA-64 
family  : 32 
model  : 1 
model name : Dual-Core Intel(R) Itanium(R) Processor 9140M 
revision : 1 
archrev : 0 
features : branchlong, 16-byte atomic ops 
cpu number : 0 
cpu regs : 4 
cpu MHz : 1669.000503 
itc MHz : 416.875000 
BogoMIPS : 3325.95 
siblings : 2 
physical id: 0 
core id : 0 
thread id : 0 
+0

Vous utilisez un GCC qui cible IA64 par défaut. Le jeu d'instructions IA64 est radicalement différent du jeu d'instructions x86. Si vous voulez compiler pour x86 vous devez essentiellement compiler votre binaire. – thkala

+7

Vous disposez également d'un processeur Itanium2, qui ne prend pas en charge le jeu d'instructions x86 en mode natif. Même si vous compilez votre binaire pour x86, le tester sur ce système sera difficile, voire impossible. – thkala

+0

Quelle distribution Linux utilisez-vous d'ailleurs? – thkala

Répondre

6
  1. C'est les deux. Le compilateur/assembleur doit être capable d'émettre/gérer des instructions SSE2, puis le CPU doit les supporter. Si votre binaire a des instructions SSE2 sans condition et que vous essayez de l'exécuter sur un Pentium II, vous n'avez pas de chance.

  2. Le meilleur moyen est de vérifier votre manuel GCC. Par exemple, ma page de manuel GCC fait référence à l'option -msse2 qui vous permettra d'activer explicitement les instructions SSE2 dans les binaires. Tout CCG ou CCI relativement récent devrait le soutenir. En ce qui concerne votre CPU, vérifiez la ligne des drapeaux dans/proc/cpuinfo.

Il serait préférable, cependant, d'avoir des contrôles dans votre code à l'aide cpuid etc, de sorte que les sections SSE2 peuvent être désactivées dans les CPU qui ne prennent pas en charge et votre code peut se replier sur un jeu d'instructions plus fréquentes .

EDIT:

Veuillez noter que le compilateur doit être soit un compilateur natif fonctionnant sur un système x86, ou compilateur croisé pour x86. Dans le cas contraire, il n'aura pas les options nécessaires pour compiler des binaires pour les processeurs x86, ce qui inclut tout ce qui concerne SSE2.

Dans votre cas, la CPU ne prend pas en charge x86 du tout. Selon votre distribution Linux, il peut y avoir des paquets avec la couche d'émulation Intel IA32EL pour x86-software-on-IA64, ce qui peut vous permettre d'exécuter le logiciel x86.

Par conséquent, vous disposez des options suivantes:

  • Utilisez un compilateur croisé qui fonctionnera sur IA64 et produire des binaires pour x86. Les chaînes d'outils de compilateur croisé ne sont pas faciles à configurer, car vous avez besoin de bien plus que le compilateur (binutils, bibliothèques, etc.).

  • Utilisez Intel IA32EL pour exécuter un compilateur x86 natif. Je ne sais pas comment vous allez installer une chaîne d'outils x86 native et toutes les bibliothèques dont votre projet a besoin dans vos distributions ne le supportent pas directement. Peut-être une installation chrootée complète d'une distribution x86?

Ensuite, si vous voulez tester votre produit sur ce système que vous avez installer ia32el Intel pour Linux.

EDIT2:

Je suppose que vous pouvez aussi lancer une distribution complète de Linux x86 sur un émulateur comme Bochs ou QEMU (sans virtualisation bien sûr). Vous êtes certainement pas va être ébloui par les vitesses qui en résultent.

+0

merci. Pls voir la mise à jour ci-dessus. Comment vérifiez-vous les drapeaux, mon info cpu ci-dessus ne semble pas le montrer. – neversaint

10

Le processeur doit pouvoir exécuter les instructions SSE2 et le compilateur ds être capable de les générer.

Pour vérifier si votre cpu prend en charge SSE2:

# cat /proc/cpuinfo 

Ce sera quelque part sous « drapeaux » si elle est prise en charge.

Mise à jour: Vous cpu ne le supporte pas.

Pour le compilateur:

# gcc -dumpmachine 
# gcc --version 

cible de votre compilateur doit une sorte de x86 *, puisque seul ce SSE2 soutien CPUs, qui fait partie de l'instruction x86 mis

ET

gcc version doit être> = 3.1 (le plus probable, puisque c'est d'environ 10 ans ou quelque chose) pour soutenir SSE2.

Mise à jour: Votre compilateur ne le supporte pas sur cette cible, il le sera si vous l'utilisez comme compilateur croisé pour x86.

+0

Je pense que le support SSE/SSE2 a été introduit dans GCC-3.1 – thkala

+0

Oui, vous avez raison: http: // gcc.gnu.org/gcc-3.1/changes.html. J'ai mis à jour ma réponse. – hirschhornsalz

+0

'grep -o sse2/proc/cpuinfo' est utile, car il y a beaucoup de drapeaux à regarder de près sur certains processeurs. –

1

Essayez de lancer:

lshw 

et regardez sous la section du processeur.

+0

le fait, vraiment? -1 – osgx

+0

ok, peut-être pas tout, mais une juste part –

3

utilisation asm pour vérifier l'existence de SSE2

enter code here 
static 
bool HaveSSE2() 
{ 
    return false; 
    __asm mov EAX,1    ; 
    __asm cpuid     ; 
    __asm test EDX, 4000000h  ;test whether bit 26 is set 
    __asm jnz yes    ;yes 
    return false; 
yes: 
    return true; 
} 
+0

Cela ressemble à la syntaxe MSVC asm, donc vous ne pouvez pas facilement l'utiliser sur Linux. Il semble également buggé, avec un 'return false;' comme première déclaration. Il serait plus "propre" de mettre le label "yes:" dans une instruction asm; Cela ressemble à sauter à un label C d'une instruction asm, rendant la vie du compilateur plus difficile. Probablement préférable de simplement extraire ce bit dans un booléen true/false au lieu d'utiliser une branche conditionnelle. –

3

Une autre astuce est pas encore mentionné faire:

gcc -march=native -dM -E - </dev/null | grep SSE2 

et obtenez:

#define __SSE2_MATH__ 1 
#define __SSE2__ 1 

Avec -march = vous natif Vérifiez votre compilateur et votre CPU. Si vous donnez une -marche différente pour un CPU spécifique, comme -march = bonnell, vous pouvez vérifier ce processeur.

Consultez vos documents gcc pour la version correcte de gcc:

https://gcc.gnu.org/onlinedocs/gcc-4.9.0/gcc/Submodel-Options.html

+0

comment puis-je désactiver le SSE2? –