Question

Je suis curieux, faire de nouveaux compilateurs utilisent quelques fonctionnalités supplémentaires intégrées dans les nouveaux processeurs tels que MMX SSE, 3DNow! et donc?

Je veux dire, dans l'original 8086 il n'y avait même pas FPU, donc compilateur que le vieux ne peut même pas l'utiliser, mais de nouveaux compilateurs, car FPU fait partie de chaque nouvelle CPU. Alors, ne nouveaux compilateurs utilisent de nouvelles fonctionnalités de CPU?

Ou, il devrait être plus droit de demander, ne nouvelle C / C ++ standart fonctions de bibliothèque utilisent de nouvelles fonctionnalités?

Merci pour la réponse.

EDIT:

OK, donc, si je vous tous à droite, même certaines opérations standart, en particulier avec les numéros de flotteur peut être fait en utilisant plus rapidement SSE.

Pour l'utiliser, je dois activer cette fonctionnalité dans mon compilateur, si elle le supporte. Dans le cas contraire, je dois être sûr que le soutien de la plate-forme ciblée que les caractéristiques.

Dans le cas de certaines bibliothèques système qui nécessitent des performances optimales, telles que OpenGL, DirectX et donc, ce support peut être pris en charge dans le système.

Par défaut, pour des raisons de compatibilité, le soutien doesen't du compilateur, mais vous pouvez ajouter ce support à l'aide des fonctions spéciales C délivrées par, par exemple Intel. Cela devrait être la meilleure façon, puisque vous pouvez contrôler directement wheather et lorsque vous utilisez des fonctions spéciales de plate-forme souhaitée, pour écrire des applications de soutien multi-CPU.

Était-ce utile?

La solution

gcc soutiendra des instructions plus récentes via des arguments de ligne de commande. Voir pour plus d'informations. Pour citer:

  

GCC peut tirer profit de la   instructions supplémentaires dans le MMX,   SSE, SSE2, SSE3 et extensions 3DNow   des récents processeurs Intel et AMD.   Les options -mmmx, -msse, -msse2,   -msse3 et -m3dnow permettre l'utilisation de ces instructions supplémentaires, ce qui permet   de multiples mots de données à traiter   en parallèle. Les executables résultant   ne fonctionnera que sur les processeurs de soutien   les extensions appropriées - sur d'autres   systèmes, ils se plantera avec une   erreur d'instruction illégale (ou similaire)

Autres conseils

Ces instructions ne font pas partie des normes / ISO C C ++. Ils sont disponibles dans compilateur intrinsics , selon le compilateur utilisé.

Pour MSVC, voir http: // msdn. microsoft.com/en-us/library/26td21ds(VS.80).aspx

Pour GCC, vous pouvez regarder http://developer.apple.com/ hardwaredrivers / ve / sse.html

afaik, intrinsics SSE sont identiques entre GCC et MSVC.

compilateurs aura pour objectif de production de code d'un ensemble minimal de fonctions dans un processeur. Ils fournissent également des commutateurs de compilation qui vous permettent de cibler des processeurs spécifiques. De cette manière, ils peuvent vendre plus compilateurs (à ces personnes avec les anciens processeurs ainsi que les gens à la mode avec de nouvelles).

Vous aurez besoin d'étudier la documentation fournie avec votre compilateur.

Parfois, la bibliothèque d'exécution contiendra plusieurs implémentations d'une fonction, et la bibliothèque choisira dynamiquement entre les implémentations lorsque le programme est exécuté. Les frais généraux pourrait être le coût d'un appel de pointeur de fonction au lieu d'un appel de fonction directe, mais l'avantage pourrait être beaucoup plus lors de l'utilisation d'une fonction optimisée spécifique à la CPU.

compilateurs JIT (pour les langages VM tels que Java et C #) prennent un peu plus loin et compilez le bytecode pour la spécifique CPU qu'il fonctionne sur. Cela donne à votre propre code au profit de l'optimisation du processeur spécifique. C'est une raison pour laquelle le code Java peut effectivement être plus rapide que le code C compilé, car le compilateur JIT Java peut retarder ses décisions d'optimisation jusqu'à ce que le programme est exécuté sur la machine cible réelle. Un compilateur C doit prendre ces décisions sans toujours savoir ce que la CPU cible. De plus, les compilateurs JIT évoluent et peuvent rendre votre programme plus rapidement au fil du temps sans que vous ayez à faire quoi que ce soit.

Si vous utilisez le compilateur Intel C, et définir les options d'optimisation suffisamment élevée, vous trouverez que certains de vos boucles sont « vectorisée », ce qui signifie que le compilateur les a réécrits d'utiliser des instructions de style SSE.

Si vous souhaitez utiliser directement les opérations SSE, vous utilisez les intrinsics définis dans le fichier d'en-tête « de xmmintrin.h »; dire

#include

__ M128 U, V, W; ww flotteur [4];

V = _mm_set1_ps (1,5);

U = _mm_set_ps (0,1,2,3);

W = _mm_add_ps (U, V);

_mm_storeu_ps (ww, W);

compilateurs utiliseront ou moins différentes nouvelles fonctionnalités. Visual Studio utilisera SSE / 2, et je crois que le compilateur Intel soutiendra le dernier cri en fonctions du processeur. Vous devriez, bien sûr, méfiez-vous de la pénétration du marché de votre fonctionnalité préférée.
Quant à ce que votre utilisation préférée bibliothèque standard, cela dépend de ce qu'il a été compilé avec. Cependant, la bibliothèque standard C est généralement de compilation sur place, car il est très fortement templated, donc si vous activez SSE2, le C ++ std libs devraient l'utiliser. En ce qui concerne le CRT, dépend de ce qu'ils ont été compilés avec.

Il y a généralement deux façons un compilateur peut générer du code qui utilise des fonctionnalités spéciales comme celles-ci:

  1. Lorsque le compilateur lui-même est compilé, vous le configurez pour générer du code pour une architecture particulière, et il peut profiter de toutes les fonctionnalités qu'il sait que l'architecture aura. Par exemple, si elle gcc est configuré pour un processeur Intel assez nouveau (ou est-ce « pas assez vieux »?) Pour contenir un FPU intégré, il va générer des instructions à virgule flottante.
  2. Lorsque le compilateur est invoqué, des drapeaux ou des paramètres peuvent spécifier le type de fonctionnalités disponibles pour le processeur qui va exécuter le programme, puis le compilateur savoir qu'il est sûr d'utiliser ces fonctionnalités. Si les drapeaux ne sont pas présents, il génère un code équivalent sans utiliser les instructions spéciales fournies par ces caractéristiques.

Si vous parlez du code écrit en C / C ++, les nouvelles fonctionnalités sont explited si vous dites à votre compilateur de le faire. Par défaut, votre compilateur cible probablement « x86 plaine » (naturellement avec FPU :)), généralement optimisé pour la génération la plus répandue du processeur au moment, mais toujours capable de fonctionner sur des processeurs plus anciens.

Si vous voulez que le compilateur de générer du code envisage également les nouveaux jeux d'instructions, vous devez lui dire de le faire avec le commutateur / réglage du projet de ligne de commande appropriée, par exemple pour Visual C ++ l'option pour activer les instructions SSE / SSE2 génération est / arc .

Notez que de nombreuses fonctionnalités de nouveaux jeux d'instructions ne peut pas être exploitée directement dans le code « normal », de sorte que vous êtes généralement fourni avec intrinsics du compilateur pour fonctionner sur les types de données particuliers natifs des nouveaux jeux d'instructions.

Intel fournit un exemple de code CPUID mis à jour chaque fois qu'ils libèrent un nouveau cpu afin que vous puissiez vérifier les nouvelles fonctionnalités et a été aussi longtemps que je me souvienne. Au moins ce que j'ai trouvé la première fois que je pensais à cette même question moi-même.

Utilisation CPUID pour détecter la présence de l'ESS 4.1 et SSE 4.2 jeux d'instructions

Alors que de nouveaux compilateurs sont libérés, ils ajoutent les nouvelles fonctionnalités directement comme VS2010 par exemple. code de Visual C ++ génération dans Visual studio 2010

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