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

x86 32-bits / 64-bits Assembleur Discussion :

Division par dix rapide


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #1
    Membre actif

    Inscrit en
    Février 2009
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 200
    Points : 235
    Points
    235
    Par défaut Division par dix rapide
    Voilà un problème récurent et amusant dans ce qu'il révèle.

    Souvent, pour des questions de nombre de doigts, l'humain aime à contempler le domaine numérique en base 10 plutôt qu'en tout autre base plus appropriée (si les jours duraient 32 heures de 64 minutes de 64 secondes, tout serait si paisible dans le bas monde des µp )

    Nous avons déjà utilisé les "débordements" dans edx pour générer des itérations pseudo aléatoires (une liste suffisamment longue et homogène pour faire illusion dans de très nombreux cas), je vous propose de l'utiliser encore et toujours pour aller plus vite qu'une division.

    Plus rapide que la division, nous avons la multiplication (pas idiv mais div). Ce n'est pas encore la panacée mais dans un algo devant traiter un nombre considérable de données, remplacer toutes les divisions par des multiplications fait la différence. Je n'aborde pas ici la version parallélisée SSEx, il faut bien que vous travailliez un peu, voir vous amuser dans "le pire" des cas .

    La solution, simpliste, proposée fonctionne avec des nombres positifs de 0 à 999999999 compris. Au-delà, les nombres sont arrondis à l'excès avant de manifester une sérieuse propension aux effets de repliements (que nous avons utilisés dans la génération aléatoire).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Mov ecx 0_1999_999A ; Initialisé une seule fois
     
    Mov eax 0~999999999 | mul ecx
    ;Là encore, le résultat est dans edx
    Vous pouvez, une fois que vous maîtrisez le principe d'utilisation d'edx, diviser par à peu près tout est n'importe quoi sous certaines conditions.
    Je reconnais que travailler dans plusieurs bases simultanément peu nuire à la santé (des "autres") mais c'est quand-même ce que l'on demande comme minimum à un codeur assembleur.

    Regardez de plus près, toutes les commandes qui utilisent edx comme registre complémentaire avec cette idée derrière la tête et vous risquez à coup sûr de découvrir quelques trésors, propres à l'assembleur, qui le rende unique au niveau stratégique:
    On ne le répétera jamais assez , porter un raisonnement HLL en assembleur est aussi stupide que le contraire ; les stratégies figées des uns et le dynamisme propositionel de l'autre sont totalement incompatibles dans leurs fondements mêmes.

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 370
    Points : 23 625
    Points
    23 625
    Par défaut
    Merci pour ces précisions.

    J'ajoute que le principe du « EDX magique » tel que tu nous le présentes est en réalité celui de la virgule fixe, trop souvent oubliée en ces temps ou les float et surtout les double sont rois chez les programmeurs nouveau venus.

    À bientôt.

  3. #3
    Membre actif

    Inscrit en
    Février 2009
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 200
    Points : 235
    Points
    235
    Par défaut
    Je ne me souviens pas d'avoir utilisé un terme apparentable à "magique" mais les secrets des implicites ne le sont que pour le lecteur, certes .

    Il est effectivement possible de travailler en virgule fixe sur edx:eax (c'est même le but de leur implémentation) mais les mécanismes utilisés ici n'ont néanmoins pas de rapport direct avec elle, que ce soit pour la génération de séries numériques ou d'effets de bord de la multiplication.

    Mais je me réjouis que fait que tu abordes le sujet des MS LS qui sont utilisables, tout à tout à fait raison de le souligner par anticipation, pour des techniques plus proches des DSP.
    La modélisation de fonctions mathématiques complexes est effectivement possible, non seulement avec une précision élevée mais aussi avec des vitesses nettement plus importantes que la FOPU (ce qui n'est pas très compliqué aux vues de sa lenteur due en partie à ses besoins de synchronisations.

    Si quelqu'un se propose pour poster ici les quatre opérations en 64 bits signés il pourra aussi montrer la simplicité avec laquelle il est possible de ne travailler que sur le résultat MSD comme partie entière .

    La limite de tout cela au jour d'aujourd'hui, étant des mécanismes comme CUDA qui utilisent le GPU pour ces calculs:
    La vitesse et la charge étant ramenés alors vers des ordres de grandeurs proches de zéro.

Discussions similaires

  1. Réponses: 0
    Dernier message: 06/04/2010, 10h34
  2. [CR8.5] Problème de division par zéro sur formule
    Par franck.cvitrans dans le forum Formules
    Réponses: 3
    Dernier message: 10/06/2004, 13h41
  3. Division par 16 en C
    Par hermannd dans le forum C
    Réponses: 18
    Dernier message: 13/02/2004, 14h10
  4. [LG]a divise par b
    Par backsync dans le forum Langage
    Réponses: 8
    Dernier message: 22/10/2003, 21h37
  5. probleme avec une division par zéro
    Par jcharleszoxi dans le forum Langage SQL
    Réponses: 2
    Dernier message: 26/03/2003, 18h14

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