IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement 2D, 3D et Jeux Discussion :

Recherche de cours d'assembleur


Sujet :

Développement 2D, 3D et Jeux

  1. #21
    Membre confirmé

    Inscrit en
    Août 2007
    Messages
    300
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 300
    Points : 527
    Points
    527
    Par défaut
    J'ai bien peur que beaucoup de ceux qui s'expriment sur cette discussion n'aient peut-être pas suffisamment connaissance de ce que fait réellement un optimiseur. Vous êtes vous déjà vraiement battu contre un goulet d'étranglement détecté par VTune? C'est rarissime que le problème se situe au niveau des séquences d'instructions... Je trouve myope de se concentrer sur cet aspect minuscule de l'optimisation, pourtant le seul que l'assembleur permette d'attaquer.

    Mais même pour en revenir a ce strict sujet, bien évidemment les instructions SSE sont mises en oeuvre automatiquement par les optimiseurs, y compris les dernières évolutions absconses comme SSE4 ou SSSE3, et ce avec un niveau d'optimalité parfait car basé sur un examen exhaustif de toutes les combinaisons possibles accomplissant la séquence de mouvements/calculs demandés. Les optimiseurs déroulent les boucles avec bien plus de subtilité qu'un humain, car ils ont accès à une bien meilleure vue de ce qui se passe en coulisse qui va bien au delà des instructions elles-mêmes (pre-fecth, cache, calcul simultané des deux branchements, prise en compte de l'historique). La création de code dynamique, technique popularisée sur le cas ultra simple de copie mémoire, est totalement anecdotique en termes d'application (même si je me suis bien amusé avec du temps du 68000), va à l'encontre de la sécurisation du code en mémoire, s'expose à l'activation du mode Data Execution Prevention, et en ignorant complètement la gestion des caches et des bus que l'optimiseur prend lui parfaitement en compte, n'a aucune garantie d'être "imbattable" sur un processeur récent.
    Quant au fait que le C++ se désoptimise avec le temps, c'est précisément l'inverse qui se passe: tout code assembleur miraculeux capable de battre tel optimiseur sur tel processeur en 2003 s'expose à devenir obsolète si on change quoi que ce soit dans l'environnement, ne serait-ce que la vitesse ou la taille du cache. Les optimiseurs suivent l'évolution de la technologie au plus près, et peuvent modifier le code compilé sur le même source C++ plus tard sur une architecture totalement ou même légèrement différente, alors qu'ils n'ont par définition pas le droit d'améliorer un code assembleur.

    Quelques faits de l'assembleur:
    - utiliser l'assembleur est exactement équivalent à dire au compilateur de ne pas modifier ce qui est demandé (mode impératif)
    - l'assembleur (Windows non x64) ne dispose que du modèle de programmation historique. En particulier, les raffinements des processeurs récents en termes de registre et de niveaux de cache ou de bus à vitesses différentes ne sont tout simplement pas descriptibles.
    - dans les processeurs récents, les instructions elles-mêmes et leur séquence ont beaucoup moins d'importance sur la performance que la disposition en mémoire, les bus concernés, et ce qui se trouve dans les différents tubes de pré-calculs.
    - donc l'humain est fortement désavantagé par rapport à l'optimiseur

    La meilleure façon de résoudre ce problème est de s'exprimer en termes déclaratifs, ce qui convient parfaitement au C++, contrairement à, disons, un langage interpreté ou de très haut niveau. Le mode impératif de l'assembleur est devenu contre-productif du point de vue de la performance, car tout contre-exemple dans le passé s'est trouvé activement chassé puis intégré par les concepteurs d'optimiseurs. Je n'ai vu aucun contre exemple significatif cette année, alors que c'était encore courant à l'époque Pentium, et pléthorique sur 286 ou 68000. Au fait, l'asm en ligne est carrément retiré de certains compilos 64 bits...

    Il faut se faire à l'idée que l'assembleur en 2007, c'est le C++. Le bon vieux copro 87, c'est le Shader 4.0. La jonglerie entre registres, c'est la gestion des collisions sur PCIe. Etc.
    "Maybe C++0x will inspire people to write tutorials emphasizing simple use, rather than just papers showing off cleverness." - Bjarne Stroustrup
    "Modern C++11 is not your daddy’s C++" - Herb Sutter

  2. #22
    Membre expérimenté

    Profil pro
    Programmeur
    Inscrit en
    Août 2002
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Programmeur

    Informations forums :
    Inscription : Août 2002
    Messages : 1 091
    Points : 1 679
    Points
    1 679
    Par défaut
    Il y a juste des cas où la compilation n'est pas pratique (real time). Si vous vous demandez quels sont ces pauses d'une seconde ou plus (hitches) que vous voyez dans vos jeux quand vous sortez votre arme pour la première fois.. Et bien c'est le compilateur qui prend son temps (je ne citerai pas de noms de jeux..).

    Compiler de manière optimale c'est un problème NP-hard. Par ailleurs les dernières versions des compilateurs intègrent de plus en plus de hints, parce qu'ils se sont rendu compte qu'ils généraient du code horrible. On n'y peut rien c'est comme ça. Et la complexité des machines augmente aussi la difficulté pour le compilateur à evaluer "statiquement" la meilleure marche à suivre (d'où l'utilité de vtune, de code analyst, des profile guided optimization... et parfois de l'assembleur inline (ou dans un fichier séparé pour les 64bits machines)).

    Bref apprendre l'assembleur ce n'est pas forcément nécessaire pour écrire du code (sauf si on écrit un compilateur par exemple), ça ne touche pas les programmeurs d'UI qui représentent une grosse partir de la population des programmeurs (à l'exception de Michael Herf) mais ça peut-etre utile ne serait-ce que pour avoir une idée de ce que génère le compilateur et voir quand il ne fait pas ce qu'on veut.

    Et puis d'expérience il est plus facile de générer dynamiquement du code avec un assembleur qu'un compilateur (cf swiftasm)
    Et non ça ne pose pas forcément plus de problème de sécurité (par rapport à quelle alternative ?).

    LeGreg

    Mon site web | Mon blog | Mes photos | Groupe USA
    > BONJOUR, JE SUIS NOUVEAU SUR CE FORUM
    > presse la touche caps lock, stp
    > OH.. MERCI C EST BEAUCOUP PLUS FACILE COMME CA

  3. #23
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 58
    Points : 66
    Points
    66
    Par défaut
    Citation Envoyé par LeGreg Voir le message
    Il y a juste des cas où la compilation n'est pas pratique (real time). Si vous vous demandez quels sont ces pauses d'une seconde ou plus (hitches) que vous voyez dans vos jeux quand vous sortez votre arme pour la première fois.. Et bien c'est le compilateur qui prend son temps (je ne citerai pas de noms de jeux..).
    C'est indépendant de la compilation: les "crampes" dans les jeux, c'est la plupart du temps des accès disques.

  4. #24
    Membre expérimenté

    Profil pro
    Programmeur
    Inscrit en
    Août 2002
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Programmeur

    Informations forums :
    Inscription : Août 2002
    Messages : 1 091
    Points : 1 679
    Points
    1 679
    Par défaut
    Citation Envoyé par PierroElMito Voir le message
    C'est indépendant de la compilation: les "crampes" dans les jeux, c'est la plupart du temps des accès disques.
    [off topic]
    Il y a plusieurs types de hitches. L'une des raisons de ces hitches (en plus de ceux causés par les accès disques) est la compilation de shaders. De plus en plus fréquents (shaders de centaines d'instructions, plusieurs milliers de shaders par jeu). L'une des solutions proposées est de créer (et utiliser dans une opération de tracé !) les shaders dès le chargement du jeu, plutôt qu'en cours de niveau.. Un exemple pathologique qui pouvait prendre plusieurs secondes sur certaines machines était celui d'un jeu où l'utilisation d'une certaine arme causait un flash de lumière. Ce flash de lumière causait une différence dans le modèle d'éclairage utilisé et quasiment tous les matériaux du niveau devaient être recalculés. Bien entendu, il n'était pas possible de précompiler toutes les combinaisons possibles pour tous les shaders, le système était conçu pour avoir un très grand nombre de combinaisons possibles. On aurait pu utiliser des constantes booléennes pour avoir un shader configurable, mais ce n'est pas toujours supporté de manière optimale donc solution peu performante (un shader entièrement configurable rend l'optimisation du compilateur plus difficile et les instructions de branchement supplémentaire font qu'il s'executera à une fraction de la vitesse du shader simple sans branchement), de plus le driver peut décider dans le dos de l'application de recompiler au changement du booléen pour les raisons ci-avant donc retour à la case départ. On peut mettre ça sur le dos d'une erreur de design du moteur mais cela parce que les programmeurs avaient sous-estimé l'importance du temps de recompilation des shaders.

    Mais on digresse.
    [/off topic]

    LeGreg

    Mon site web | Mon blog | Mes photos | Groupe USA
    > BONJOUR, JE SUIS NOUVEAU SUR CE FORUM
    > presse la touche caps lock, stp
    > OH.. MERCI C EST BEAUCOUP PLUS FACILE COMME CA

  5. #25
    Expert confirmé
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 524
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 524
    Points : 5 184
    Points
    5 184
    Par défaut
    comparer un compilateur de shaders (GPU) et un compilateur CPU
    ou comment comparer l'incomparable

    autant on peut programmer en assembleur GPU, l'inconvénient étant l'incompatibilité entre les 2 principaux rivaux sur le marché

    autant on peux programmer en assembleur CPU avec des milliers d'instructions standardisées (x86-x87-sse) pour les CPU
    et ce sans réel inconvénient autre que ses propres capacités à faire mieux que des compilateurs eux même créés par l'homme pour lui faciliter le travail
    compilateurs qui utilisent des schémas créés par l'homme
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  6. #26
    Membre expérimenté

    Profil pro
    Programmeur
    Inscrit en
    Août 2002
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Programmeur

    Informations forums :
    Inscription : Août 2002
    Messages : 1 091
    Points : 1 679
    Points
    1 679
    Par défaut
    Désolé, je réouvre cette vieille discussion puisque je suis tombé sur la dernière présentation de Valve au GDC 2008 sur le developpement crossplateforme et que le developpeur de Valve résume très bien ce que j'avais en tête :

    http://www.valvesoftware.com/publica...evelopment.pdf

    Rapide traduction (tiré des notes de la page "LEARN ASSEMBLY"):

    Apprenez l'assembleur !

    Oui désolé nous sommes encore toujours des programmeurs de jeu, donc vous allez devoir apprendre comment la puce fonctionne.
    Non, vous n'aurez pas à écrire votre jeu en assembleur.
    Vous allez utiliser les intrinsics, qui sont des fonctions qui sont directement traduites en opcode natif du processeur. Mais de manière à pouvoir utiliser ces intrinsiques, vous devrez comprendre ce qu'elles font et comment elles fonctionnent.
    Aussi, inévitablement vous aurez à deboguer un plantage qui apparait dans un build "release", où le débogueur ne pourra pas peupler la fenetre "watch" avec le contenu de toutes vos variables. Dans ce cas la manière la plus facile de déboguer est d'ouvrir le désassembleur et de suivre vos données à travers les registres.
    Bien entendu, la plupart du temps lorsque vous avez un build release qui plante, c'est à une heure du matin alors que le master est censé passer Gold et donc ce n'est pas à ce moment que vous devez penser à apprendre à faire ça.
    Donc assurez vous d'apprendre à le faire bien en avance dans le projet.
    Enfin connaitre l'assembleur vous permet de vérifier le code que le compilateur émet. Parfois le compilateur fait des "optimisations" qui ont l'effet inverse et parfois il y a des bugs de génération de code
    À cela s'ajoute la considération que j'avais cité plus haut (que parfois l'assemblage dynamique, ou la compilation par "blocs" peut-etre utile, en tout cas on l'utilise dans ma boîte, your mileage may vary).

    Mon site web | Mon blog | Mes photos | Groupe USA
    > BONJOUR, JE SUIS NOUVEAU SUR CE FORUM
    > presse la touche caps lock, stp
    > OH.. MERCI C EST BEAUCOUP PLUS FACILE COMME CA

  7. #27
    Rédacteur
    Avatar de bafman
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    2 574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    Points : 5 323
    Points
    5 323
    Par défaut
    merci pour cette super référence avec laquelle je suis 100% d'accord pour le pratiquer quasi quotidiennement... surtout les erreurs de génération de code du compilo qu'on ne peut souvent détecter qu'en allant regarder l'ASM
    * Il est infiniment plus simple de faire rapidement un code qui marche que de faire un code rapide qui marche
    * pour faciliter les recherches, n'oubliez pas de voter pour les réponses pertinentes
    Mes articles

Discussions similaires

  1. Recherche des cours complets en Merise et Informix
    Par GBAGO dans le forum Informix
    Réponses: 6
    Dernier message: 20/06/2006, 22h59
  2. [PC] Recherche de cours
    Par pascalou54fr dans le forum Cobol
    Réponses: 4
    Dernier message: 13/01/2006, 00h20
  3. En recherche de cours de C en seine et marne
    Par petdelascar dans le forum C
    Réponses: 5
    Dernier message: 17/12/2005, 15h03
  4. recherches des cours ou des explications sur les algorithmes
    Par Marcus2211 dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 19/05/2002, 22h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo