Chaque nouvelle génération de CPU introduit certains ensembles de nouvelles instructions, c'est-à-dire MMX, 3DNOW, SSE, etc. P>
J'ai quelques questions générales à leur sujet: P>
5 Réponses :
Un exécutable contenant de nouvelles instructions ne peut être exécuté que sur des CPU qui prennent en charge ces nouvelles instructions. Vous pouvez configurer le compilateur pour compiler pour une CPU spécifique. P>
Seulement si ces instructions sont réellement exécutées. S'ils ne sont jamais exécutés (par exemple, car ils sont derrière un saut conditionnel qui vérifie si la CPU actuelle les prend en charge), il n'y a pas de problème. Iow: Le processeur piégera sur un opcode illégal si et seulement s'il essaie d'en exécuter un.
MMX existe depuis 1996, SSE est sorti en 1999 et SSE2 a fait ses débuts avec le Pentium 4 en 2001. Je pense qu'il est prudent de supposer que tout CPU que vous utiliserez a MMX et SSE, et probablement SSE2. 3DNOW Je pense que c'est AMD uniquement, alors ne vous attendez pas à ce que ces instructions soient disponibles. P>
Élaborer sur la réponse de Michael Madsen pour la question 4, GCC par défaut de générer du code pour un processeur I386. Il fournit un drapeau appelé Le drapeau affecte également la façon dont les instructions sont commandées, car différentes processeurs peuvent être relativement plus lentes ou plus rapides d'une pièce de code donnée, en fonction de l'ordre dans lequel les instructions apparaissent. P>
Je ne suis au courant d'aucun compilateur statique qui créera un code de repliement automatique des fonctionnalités. Habituellement, cela doit être fait explicitement par le programmeur. Mais la bonne nouvelle est que ce programmeur n'a pas besoin d'être vous; Par exemple, la bibliothèque code> liboil code> (de boucles intérieures optimisées) sera, au moment de l'exécution, sélectionnez le meilleur code à exécuter en fonction de la machine à exécuter. P> -March code> (également appelé
-mcpu code>) qui détermine quels types d'instructions au compilateur émettront. Microsoft's
CL.EXE CODE> fournit
/ arch: code> et
/ gx code> indicateurs dans le même but. P>
La plupart des distributions configurent GCC de sorte que 32 bits Code-Gen par défaut sur Pentium Pro en tant que ligne de base définie, non i386 ( CMOV code> mais non MMX ou SSE). Vous pouvez également construire GCC afin que le code de code 32 bits par défaut active SSE2. Le mode X86-64 (
-M64 CODE>) utilise First-Gen K8 comme base de référence, SSE2 mais pas CMPXCHG16B (
-MCX16 code>), qui a été l'une des premières extensions après x86-64.
Et btw, vous pouvez définir -mTune = haswell code> séparément de
-march = NEHALEM code>, votre code fonctionnera donc sur NEHALEM ou plus récent, mais le choix de l'instruction et la commande est optimisée pour plus récent Cpus.
- Si un programme utilise par exemple une instruction SSE peut-il être exécuté sur la CPU qui ne prend pas en charge SSE? LI> ol> blockQuote>
non. Mais en général, cela génère souvent un piège ou une exception, et le gestionnaire de piège / interruption peut traiter que si nécessaire. p>
Par exemple, il y a longtemps que les logiciels contiennent souvent du code pour X87. Si le coprocesseur X87 existe, l'instruction fonctionnera normalement dans du matériel, mais si l'ordinateur n'a pas de coprocesseur X87, il générera un piège, après cela, l'instruction sera traitée dans le logiciel et le résultat de retour est normal. Voir quel est le protocole d'émulation à point flottant x87 dans MS-DOS? P>
Les premières versions de Hackintosh utilisent également ceci pour imiter SSE2 sur les processeurs qui ne prennent pas en charge ce jeu d'instructions. Bien sûr, la performance est terrible mais elle sera courante. P>
- Sinon, cela signifie-t-il que l'impact réel des performances de ces nouvelles instructions sera après quelques années lorsque la plupart des CPU soutiendront une telle technologie (il n'y aura donc aucune incompatibilité)? LI> ol> blockQuote>
oui. Mais après quelques années, peut-être que des logiciels ont besoin de mises à jour, non? Pour un logiciel de performance critique, une réécriture à tirer parti du nouvel ensemble d'instructions peut être nécessaire. Pour d'autres, l'augmentation de la performance peut ne pas être perceptible p>
- Lorsque je compile un programme C ++ avec optimisations signifie-t-il que cela utilisera certaines de ces nouvelles instructions? (Je sais que cela dépend de nombreux facteurs, en particulier sur le code, mais je veux une réponse générale) ou sont-ils réservés principalement aux programmes écrits dans ASM? LI> ol> blockQuote>
dépend du compilateur et des options que vous y passerez à l'heure de la compilation. P>
compilateurs modernes prend en charge Vectorisation automatique A> Donc, ils vont détecter les idiomes communs et optimiser le . Vous avez juste besoin de em> recompiler em> pour tirer parti du nouveau jeu d'instructions. Mais pour des cas complexes, vous devez toujours optimiser la main em> à l'aide de SIMD intrinsics p>
Si vous utilisez une bibliothèque externe em>, vous obtiendrez automatiquement une amélioration de la vitesse lorsque la bibliothèque est mise à jour pour prendre en charge le nouveau jeu d'instructions, même si vous ne faites rien avec votre programme p>
Juste pour clarifier, faire une émulation SSE dans un gestionnaire d'interruption ces jours-ci aurait besoin d'un patch de noyau. Le logiciel de l'espace utilisateur ne peut pas comporter les gestionnaires d'interruption de Linux ou de Windows. Ou peut-être i> vous pouvez le faire dans l'espace utilisateur dans un gestionnaire SIGILL? Même plus lent avec des voyages extra-retours à l'espace utilisateur et au dos, bien sûr.
Autant que je sache, tout processeur effectué au cours des 3-4 dernières années, Intel ou AMD, soutient au moins SSE2. Vous pouvez probablement supposer qu'ils sont là, en fonction de votre public cible.
@Blindy: Ce n'est pas une bonne idée en général; Si votre programme n'est pas un porc de ressources massives, l'exécution sur le matériel de dix ans ne devrait pas être un problème. Cela dit, si votre programme ciblait 64 bits OSES, ou ne fonctionne que sous Windows 8 ou plus, vous pouvez utiliser SSE2 et ci-dessous en toute sécurité (tous les processeurs X86-64 incluent au moins la prise en charge de SSE2 et le support SSE2 mandaté de Windows 8 Même pour le Version 32 bits du système d'exploitation).