6
votes

Nouveaux instructions dans la CPU

Chaque nouvelle génération de CPU introduit certains ensembles de nouvelles instructions, c'est-à-dire MMX, 3DNOW, SSE, etc.

J'ai quelques questions générales à leur sujet:

  1. Si un programme utilise par exemple une instruction SSE peut-il être exécuté sur la CPU qui ne prend pas en charge SSE?
  2. Si oui, cela signifie-t-il que ces instructions seront changées à un plus grand nombre d'instructions plus simples?
  3. 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é)?
  4. 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?

2 commentaires

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).


5 Réponses :


1
votes

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.


1 commentaires

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.



9
votes
  1. oui et non: la CPU les considérera comme invalides, mais si le programme vérifie si la CPU prend en charge ces instructions, il peut être retombé à une version qui n'utilise pas ces instructions, ce qui permet au programme d'être exécuté de toute façon. .
  2. Le programme devra fournir une mise en œuvre alternative à l'aide des instructions plus "de base", et sachez quand utiliser lequel.
  3. Depuis que le programme peut vérifier la CPU, les avantages peuvent être disponibles actuellement, mais bien sûr, si vos utilisateurs utilisent des processeurs qui ne supportent pas ces instructions, elles ne verront aucun avantage.
  4. Cela dépendra entièrement du compilateur et de l'optimiseur. Certaines des instructions peuvent être considérées comme assez ancienes que le compilateur les utilise toujours à moins que vous ne le disiez pas, alors que d'autres seront le contraire: vous devez dire au compilateur de les utiliser. Que ce soit ou non créera automatiquement des retombées. Cela dépendra également du compilateur.

0 commentaires

1
votes

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.


0 commentaires

2
votes

É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é -March (également appelé -mcpu ) qui détermine quels types d'instructions au compilateur émettront. Microsoft's CL.EXE fournit / arch: et / gx indicateurs dans le même but.

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.

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 liboil (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.


2 commentaires

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 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 ) utilise First-Gen K8 comme base de référence, SSE2 mais pas CMPXCHG16B ( -MCX16 ), qui a été l'une des premières extensions après x86-64.


Et btw, vous pouvez définir -mTune = haswell séparément de -march = NEHALEM , 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.



1
votes
  1. Si un programme utilise par exemple une instruction SSE peut-il être exécuté sur la CPU qui ne prend pas en charge SSE?

    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.

    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?

    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.

    1. 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é)?

      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

      1. 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?

        dépend du compilateur et des options que vous y passerez à l'heure de la compilation.

        compilateurs modernes prend en charge détecter les idiomes communs et optimiser le . Vous avez juste besoin de recompiler pour tirer parti du nouveau jeu d'instructions. Mais pour des cas complexes, vous devez toujours optimiser la main à l'aide de SIMD intrinsics

        Si vous utilisez une bibliothèque externe , 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


1 commentaires

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 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.