Multiplication plus RAPIDE avec SHL, mais BUG ?!!! [Résolu]

Messages postés
130
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
28 janvier 2013
- - Dernière réponse : rebixav
Messages postés
130
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
28 janvier 2013
- 24 janv. 2013 à 09:49
voilà j'ai remarquer il y a peut de temps l'utilité des fonction de décalage de bits
- SHL(left)
et
- SHR(right)

et que l'on peut muliplier eax par 4 avec
SHL eax,2 ! ! ! (soit bien plus RAPIDEMENT que mul !

problème, malgrés que cela fonctionne bien en l'utilisant comme cela !
dans une de mes procédure cela plante la dll :

voilà là ou cela plante si j'enlève mul contre shl !
"
;pixel=4 et lx_saut=1666 et lx_reste=?
mov eax,[esi] : mov [edi],eax
mov eax,lx_saut : add eax,lx_reste
div ch_1000 : mov lx_reste,edx
;<<< le chiffre eax varrie entre 7 et 9 !!!
mul pixel ;> egal 8 par exemple (j'ai vérifié)
;SHL eax,2
;SHL ax,2 ;> egal 8 par exemple (j'ai vérifié)
;jmp fin
add esi,eax : add edi,pixel
"
je ne comprend pas, y a t'il un truc une astuce a savoir avant de bien utiliser shl ou shr !

merci de me répondre !
Afficher la suite 

5 réponses

Meilleure réponse
Messages postés
130
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
28 janvier 2013
3
Merci
(je préfère péciser on ne sait jamais, j'ai un cpu athlon 4000+ sous xp)
...

cela y est j'ai trouvé au boute de 2 heures, j’étaie entrain de devenir fou
et d'écrire tout et n'importe quoi jus qu’a que je remarque cela :
si eax=2800 et edx=400 et que je divise avec div 1000 j'obtient
eax=1717986921 edt edx=200 <<== si j'utilise SHL eax,2

ou

eax=2 edt edx=800 <<== si j'utilise edx=0 : SHL eax,2

donc je doit juste mettre remettre edx à 0 (pourquoi ???!)
je comprend pas pourquoi mais cela marche ???!
...
PS : pour continuer la dinglerie si j'utilise xor edx,edx je suis moins
rapide d'environ 2% que mov edx,0 (j'avais lue que cela valais le coup )

et pour conclure j'ai perdue beaucoup de temps car tout le monde
ecrit que mul et plus lent que SHL ( et bien j'ai gagner 5% seulement !)
lol quoi !

Non j'avoue que SHL est 15x fois rapide, je l'ai essayer seul !
qu'il y est 1 déplacement de bit ou plusieurs !
et même avec le mov edx,0 il est 13 fois plus rapide que mul !
a mon avis il faut plutot j'obtimise div !!!! haaaa haaaaaa!

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 211 internautes nous ont dit merci ce mois-ci

Commenter la réponse de rebixav
Messages postés
130
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
28 janvier 2013
0
Merci
cela y est je suis entrain de gagner beaucoup plus de puissance dans ma procédure !

c'est bien div qui me prenais le plus de puissance, d'ailleur j'ai calculais à part la fonction div et si mul et 13fois plus lent que SHL, div et 25 fois plus lent que SHR
...
donc il n'y a pas photos il faut le plus possible laissé tombé div et mul
contre shl et shr ! ! ! ! c'est trop bien !
...
là je suis déjà 6 fois plus rapide (la procédure entière et cela continue !!!!
c'est trop de la bombe cette fonctione x86
Commenter la réponse de rebixav
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
13
0
Merci
DIV est UNSIGNED division.
Ce qui est divisé est la paire 64 bits contenue en EDX:EAX.
Aller directement à la source des informations, les manuels Intel, évite de perdre du temps.
Fais une recherche google avec "Software Developer’s Manual" et tu auras les liens de telechargement.
Commence par prendre et surtout lire:
"Combined Volumes: 1, 2A, 2B, 2C, 3A, 3B and 3C".

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
Messages postés
130
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
28 janvier 2013
0
Merci
ho lalala ! ça à l'air conton !
mais je vais essayer de le lire !
...
sinon j'ai une idée pour accélérer la div
une macro : "div2 var1,var2"
ou je pourais diviser plus rapidement au moins jusqu'a 256 !
...
bref je vais voir tout cela !
merci
Commenter la réponse de rebixav
Messages postés
130
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
28 janvier 2013
0
Merci
...
je reviens sur les divisons rapide :
nous savons que officiellement :
multiplication 2x plus lent que addition ou shr
division 60x plus lent que addition ou shr

et bien j'ai trouvé un principe mathématique sur internet :

et voilà ce que donne le cœur de la division par 3 :
;----------------
mov edx,21845
mul edx
shr var1,16
;---------------

en faite c'est simple si on veut diviser par 3 en prenant en compte pour une précision asse élevé que l'on est prêt à multiplier par 65536 et l'as on fait un produit en croix :
pour /3=> (1/3)*65536 = 21845
donc 100/3 = (100*21845)/65536
ou
pour /5=> (1/5)*65536 = 13107
donc 500/5 = (500*13107)/65536
etc...

vous verrez par contre que le chiffre est précis au millième prêt, pour 500/5 je n’ai pas 100, mais plutôt 99,999 !
pour remédier définitivement ce problème il faut faire attention au dernier décalage de bits et donc faire un shr 15 au lieu de shr 16
en faite je récupère le dernier RESTE !
cela donne définitivement :

prenons exemple que mon chiffre à diviser par 5 soit dans eax :
mov eax,500
push edx
mov edx,21845
mul edx
shr var1,15
mov edx,var1
and edx,1
xor edx,0
shr var1,1
add var1,edx
pop edx

donc cette ensemble de fonction est 11xplus lent qu'une addition mais alors 6xplus rapide qu'une division !!!

voici comment on fait pour avoir une division très rapide !!!
à vos programmes
Commenter la réponse de rebixav