Question

Chaque nouvelle génération de CPU présente des ensembles de nouvelles instructions, à savoir MMX, 3DNOW, SSE et ainsi de suite.

J'ai quelques questions d'ordre général à leur sujet:

  1. Si un programme utilise par exemple l'instruction SSE peut-il être exécuté sur le processeur qui ne prend pas en charge SSE?
  2. Si oui, cela signifie que les instructions sera changé pour un certain nombre d'instructions plus simples?
  3. Dans le cas contraire, cela signifie que l'impact réel de la performance de ces nouvelles instructions sera après quelques années alors que la plupart CPU soutiendra cette technologie (donc il n'y aura pas d'éventuelles incompatibilités)?
  4. Lorsque je compile un programme C ++ avec des optimisations que cela signifie qu'il va utiliser une partie 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 pour des programmes écrits en asm?
Était-ce utile?

La solution

1) Oui et non: Le CPU les considère comme invalide, mais si le programme vérifie si le CPU prend en charge ces instructions, il peut fallback à une version qui n'utilise pas ces instructions, ce qui permet au programme d'être exécuter de toute façon.

2) Le programme devra fournir une implémentation alternative avec plus d'instructions « de base », et savoir quand utiliser lequel.

3) Étant donné que le programme peut vérifier l'unité centrale de traitement, les avantages peuvent être disponibles en ce moment, mais bien sûr, si vos utilisateurs utilisent les processeurs qui ne prennent pas en charge ces instructions, ils ne voient aucun avantage.

4) Cela dépend entièrement du compilateur et l'optimiseur. Certaines des instructions ensembles peuvent être considérés comme assez vieux que le compilateur toujours les utiliser à moins que vous le dire de ne pas, tandis que d'autres sera le contraire: vous devez dire au compilateur de les utiliser. Si oui ou non il crée automatiquement en va des solutions de repli aussi bien dépendre du compilateur.

Autres conseils

Pour des précisions sur la réponse de Michael Madsen pour la question 4, par défaut GCC pour générer du code pour un processeur i386. Il fournit un indicateur appelé -march (également connu sous le nom -mcpu) qui détermine les types d'instructions du compilateur émettront. Le cl.exe de Microsoft fournit des indicateurs de /arch: et /Gx dans le même but.

Le drapeau affecte également la façon dont les instructions sont ordonnées, parce que les différents processeurs peuvent être exécuter relativement plus lent ou plus rapide d'un morceau de code donné, en fonction de l'ordre dans lequel les instructions apparaissent.

Je ne suis pas au courant d'aucun compilateur statique qui va créer un code de repli ensemble de fonctionnalités automatique. Habituellement, cela doit être fait explicitement par le programmeur. Mais les bonnes nouvelles est que ce programmeur n'a pas besoin d'être vous; par exemple, la bibliothèque liboil (de boucles internes Optimized) sera, lors de l'exécution, sélectionnez le meilleur code à exécuter en fonction de la machine, il est en cours d'exécution sur.

Un exécutable qui contient de nouvelles instructions ne peut être exécuté sur CPU qui prennent en charge ces nouvelles instructions. Vous pouvez configurer le compilateur pour compiler pour une CPU spécifique.

MMX a été autour 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 raisonnable de supposer que tout CPU que vous allez utiliser a MMX et SSE, SSE2 et probablement. Je pense 3DNOW est AMD que, donc ne vous attendez pas à ces instructions soient disponibles.

  
      
  1. Si un programme utilise par exemple l'instruction SSE peut-il être exécuté sur le processeur qui ne prend pas en charge SSE?
  2.   

Non. Mais en général, cela génère souvent un piège ou une exception, et le piège / gestionnaire d'interruption peut traiter que si nécessaire.

Par exemple il y a longtemps softwares contiennent souvent du code pour x87. Si le coprocesseur x87 existe, l'instruction se déroulera normalement dans le matériel, mais si l'ordinateur ne dispose pas d'un coprocesseur x87 alors il va générer un piège, après que l'instruction sera traitée dans le logiciel et le retour résultat normal. Voir Quel est le protocole pour x87 flottante émulation point dans MS-DOS?

Les premières versions de Hackintosh utilisent également ce pour imiter SSE2 sur les processeurs qui ne prennent pas en charge ce jeu d'instructions. Bien sûr, la performance est terrible, mais il fonctionnera.

  
      
  1. Dans le cas contraire, cela signifie que l'impact réel de la performance de ces nouvelles instructions sera après quelques années alors que la plupart CPU soutiendra cette technologie (donc il n'y aura pas d'éventuelles incompatibilités)?
  2.   

Oui. Mais après quelques années, peut-être des logiciels ont besoin des mises à jour, non? Pour un logiciel de performance critique, une ré-écriture pour tirer parti du nouveau jeu d'instructions peut être nécessaire. Pour d'autres, l'augmentation des performances ne peut être perceptible

  
      
  1. Lorsque je compile un programme C ++ avec des optimisations que cela signifie qu'il va utiliser une partie 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 pour des programmes écrits en asm?
  2.   

Dépend du compilateur et les options que vous passez à elle au moment de la compilation.

Les compilateurs modernes prennent en charge pour qu'ils détecter idiomes et l'optimiser . Vous avez juste besoin de recompilation pour profiter du nouveau jeu d'instructions. Mais pour les cas complexes, vous avez encore besoin main optimize en utilisant intrinsics SIMD

Si vous utilisez un bibliothèque externe , vous obtiendrez automatiquement une amélioration de la vitesse lorsque la bibliothèque est mise à jour pour soutenir le nouveau jeu d'instructions, même si vous ne faites rien avec votre programme

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top