Multiplication plus RAPIDE avec SHL, mais BUG ?!!!

Résolu
rebixav Messages postés 130 Date d'inscription dimanche 16 décembre 2007 Statut Membre Dernière intervention 28 janvier 2013 - 4 mai 2012 à 22:26
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 !

5 réponses

rebixav Messages postés 130 Date d'inscription dimanche 16 décembre 2007 Statut Membre Dernière intervention 28 janvier 2013
5 mai 2012 à 16:24
(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!
3
rebixav Messages postés 130 Date d'inscription dimanche 16 décembre 2007 Statut Membre Dernière intervention 28 janvier 2013
5 mai 2012 à 16:46
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
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
8 mai 2012 à 22:30
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++
0
rebixav Messages postés 130 Date d'inscription dimanche 16 décembre 2007 Statut Membre Dernière intervention 28 janvier 2013
10 mai 2012 à 21:57
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
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
...
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
0
Rejoignez-nous