86 votes

Pourquoi programmez-vous en montage?

J'ai une question pour tous les inconditionnels de faible niveau de pirates. J'ai couru à travers cette phrase dans un blog. Je ne pense pas vraiment que la source de questions (c'est Haack, si vous vous souciez vraiment) parce qu'il semble être une déclaration commune.

Par exemple, de nombreux moderne de 3-D les Jeux ont leur haute performance du moteur de base écrit en C++ et de l'Assemblée.

Aussi loin que l'assemblée va - est le code écrit en assembleur parce que vous ne voulez pas un compilateur émettant des instructions supplémentaires ou l'utilisation excessive d'octets, ou êtes-vous à l'aide de meilleurs algorithmes que vous ne pouvez pas vous exprimer en C (ou ne peuvent pas s'exprimer sans le compilateur mussing)?

Je suis complètement d'obtenir qu'il est important de comprendre le faible niveau de stuff. Je veux juste comprendre le pourquoi de programme à l'assemblée après vous le faire comprendre.

Edit: Wow! Merci à vous tous pour ce fantastique réponses! C'était bien mieux que ce que j'avais espéré!

170voto

tgamblin Points 25755

Je pense que vous êtes la lecture de cette déclaration:

Par exemple, de nombreux moderne de 3-D les Jeux ont leur haute performance du moteur de base écrit en C++ et de l'Assemblée.

Jeux (et la plupart des programmes ces jours-ci), ne sont pas "écrit à l'assemblée" de la même manière qu'ils sont "écrit en C++". Ce blog n'est pas en disant qu'une fraction importante du jeu est conçu dans une assemblée, ou qu'une équipe de programmeurs de s'asseoir autour et se développer à l'assemblée en tant que première langue.

Ce que ce vraiment signifie que les développeurs de la première écriture, le jeu et le faire fonctionner en C++. Puis ils profil, comprendre ce que les goulets d'étranglement, et si c'est la peine à optimiser le diable hors de leur assemblage. Ou, s'ils sont déjà expérimentés, ils savent quelles parties vont être les goulots d'étranglement, et ils ont optimisé les morceaux assis autour d'autres jeux qu'ils ont construit.

Le point de la programmation en assembleur est le même comme il l'a toujours été: la vitesse. Il serait ridicule d'écrire beaucoup de code en assembleur, mais il y a quelques optimisations du compilateur n'est pas au courant, et pour une assez petite fenêtre de code, un homme va faire mieux.

Par exemple, pour la virgule flottante, les compilateurs ont tendance à être assez conservateur et peuvent ne pas être au courant de certaines des fonctionnalités les plus avancées de votre architecture. Si vous êtes prêt à accepter une certaine erreur, vous pouvez généralement faire mieux que le compilateur, et il vaut la peine de l'écrire un peu de code en assembleur si vous trouvez que beaucoup de temps est passé sur elle.

Voici quelques exemples pertinents:

Exemples de Jeux

  • L'Article d'Intel sur l'optimisation d'un moteur de jeu à l'aide de l'ESS intrinsèques. Le code final utilise intrinsèques (pas d'assembleur en ligne), de sorte que le montant de pur montage est très petite. Mais ils ont l'air à l'assembleur de sortie par le compilateur pour comprendre exactement ce qu'il faut optimiser.

  • Quake rapide inverse de la racine carrée. De nouveau, la routine n'a pas l'assembleur elle, mais vous avez besoin de savoir quelque chose au sujet de l'architecture pour faire ce genre d'optimisation. Les auteurs savent quelles opérations sont rapides (mulitply, maj) et qui sont lents (fracture, sqrt). Afin qu'ils viennent avec un très difficile la mise en œuvre de racine carrée, qui évite la lenteur des opérations entièrement.

Le Calcul De Haute Performance

  • En dehors du domaine des jeux, les gens dans le calcul scientifique fréquemment optimiser la merde hors de choses pour les faire courir plus vite sur le matériel le plus récent. Pensez à ce que les jeux où vous ne pouvez pas tricher sur la physique.

    Un grand exemple récent de cela est de Treillis de la Chromodynamique Quantique (Lattice QCD). Ce document décrit comment le problème assez beaucoup se résume à un très petit noyau de calcul, qui a été fortement optimisé pour l'architecture PowerPC 440 sur un IBM Blue Gene/L. Chaque 440 dispose de deux Unités de police constituées, et qu'ils soutiennent certains ternaire des opérations qui sont difficiles pour les compilateurs d'exploiter. Sans ces optimisations, Lattice QCD serait beaucoup plus lent, ce qui est coûteux, lorsque votre problème nécessite des millions d'heures de calcul sur des machines coûteuses.

    Si vous vous demandez pourquoi c'est important, découvrez l' article dans Science qui est sorti de ce travail. À l'aide de Lattice QCD, ces gars-là calculé la masse d'un proton à partir de principes premiers, et a montré l'an dernier que 90% de la masse provient de la force forte énergie de liaison, et le reste de quarks. C'est E=mc2 en action. Voici un résumé.

Pour l'ensemble de la ci-dessus, les candidatures sont pas conçus ou écrit 100% en assembleur -- n'est même pas proche. Mais quand les gens ont vraiment besoin de vitesse, ils se concentrent sur l'écriture, les éléments-clés de leur code à la volée sur un matériel spécifique.

42voto

Uri Points 50687

Je n'ai pas codé en langage d'assemblage pour de nombreuses années, mais je peux donner plusieurs raisons que j'ai souvent vu:

  • Pas tous les compilateurs peuvent faire usage de certaines optimisations du PROCESSEUR et du jeu d'instructions (par exemple, les nouveaux jeux d'instructions Intel ajoute de temps en temps). D'attente pour les rédacteurs du compilateur pour rattraper les moyens de perdre un avantage concurrentiel.

  • Plus facile pour correspondre à code pour les processeurs de l'architecture et de l'optimisation. Par exemple, des choses que vous connaissez le mécanisme d'extraction, de mise en cache, etc. C'est censé être transparent pour le développeur, mais le fait est qu'il ne l'est pas, c'est pourquoi les rédacteurs de compilateur peut optimiser.

  • Certains matériels de niveau d'accès ne sont possibles/pratique par l'assemblée de la langue (par exemple, lors de la rédaction de pilote de périphérique).

  • Raisonnement formel est parfois plus facile pour l'assemblée de la langue que pour le langage de haut niveau comme vous connaissez déjà la finale ou presque finale de la disposition du code est.

  • La programmation de certaines des cartes graphiques 3D (vers la fin des années 1990) en l'absence d'Api est souvent plus pratique et plus efficace en langage d'assemblage, et parfois pas possible dans d'autres langues. Mais encore une fois, cela participe vraiment au niveau des experts, des jeux basés sur l'accélérateur de l'architecture comme de déplacer manuellement des données dans un certain ordre.

Je doute que beaucoup de gens utilisent le langage assembleur quand un langage de niveau plus élevé, en particulier lorsque cette langue est de Main de C.-l'optimisation de grandes quantités de code n'est pas pratique.

18voto

Ólafur Waage Points 40104

Généralement, l'assemblage d'un profane est plus lent que C (en raison de l'optimisation de C), mais de nombreux jeux (je me souviens distinctement de Doom ) devaient comporter des sections spécifiques du jeu dans Assembly pour que tout se passe bien sur des machines normales.

Voici l'exemple auquel je fais référence.

16voto

DanM Points 1041

J'ai commencé la qualité de sa programmation en langage d'assemblage dans mon tout premier emploi (années 80). Pour les systèmes embarqués les demandes de mémoire - RAM et EPROM - étaient faibles. Vous pouvez écrire le code serré qui est facile sur les ressources.

Par la fin des années 80 j'avais mis pour C. Le code est plus facile à écrire, le débogage et le maintenir. Très petits fragments de code ont été écrites en assembleur pour moi, c'était quand j'ai écrit la commutation de contexte dans un rouleau de-votre-propre système d'exploitation temps réel. (Quelque chose que vous ne devriez pas faire plus, sauf si c'est un "projet scientifique".)

Vous verrez assembler des extraits dans certains code du noyau de Linux. Plus récemment, j'ai parcouru dans spinlocks et autres code de synchronisation. Ces morceaux de code pour accéder au test atomique-et-opérations sur les ensembles, la manipulation des caches, etc.

Je pense que vous auriez du mal à optimiser moderne compilateurs C pour la plupart de la programmation en général.

Je suis d'accord avec @altCognito que votre temps est sans doute mieux passé à réfléchir plus sérieusement le problème et de faire les choses mieux. Pour une raison que les programmeurs ont souvent l'accent sur les micro-efficacité et de la négligence de la macro-efficacité. Langage d'assemblage pour améliorer les performances est un micro-efficacité. Reculer d'un pas, d'un point de vue plus large, le système peut exposer les problèmes de macro dans un système. Résoudre les problèmes de macro peut souvent obtenir de meilleurs gains de performance. Une fois la macro résolu les problèmes de l'effondrement de la micro-niveau.

Je suppose que les micro-problèmes sont sous le contrôle d'un seul programmeur et dans un plus petit domaine. Modifier le comportement au niveau macro-économique nécessite une communication avec d'autres personnes - une chose que certains programmeurs éviter. L'ensemble de cowboy vs l'équipe de chose.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X