Optimizer version: 1.2

Sujets variés concernant le développement en PureBasic
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Optimizer version: 1.2

Message par comtois »

Quelqu'un a déjà utilisé la chose ?

Optimizer
How does this program work:
The new FAsm.exe represents the optimizer. The PB compiler calls it with the FAsm parameters. Now, it optimizes the PureBasic.asm and then calls the real FAsm (FAsm2.exe).

Results (for an unrealistic, good example (you can find it in the German forums)):
without Opt.: 5078ms (PB) versus 2453ms (Asm)
with Opt.: 2542ms versus 2532
bon , je vais me lancer :)

ok je viens de dézipper la chose , ça semble intéressant
#####################################################################
########################### Optimizations ###########################
#####################################################################
© Copyright by Remi Meier
02.07.2005
Website: http://www.remimeier.ch.vu
#####################################################################

#### Cutting out unused procedures
Not all, but a lot of unused procedures will be removed from the ASM
source.

#### CDQ
Replaced by
MOV Edx, Eax
SAR Edx, 31
cause it is pipeable (chance for parallel processing of commands)

#### Remove CALLs of some PB procedures
The listed PB-Functions are replaced by their equivalent ASM code:
- PokeF()
- PeekF()
- PokeL()
- PeekL()
- PokeW()
- PeekW()
- PokeB()
- PeekB()
- CallFunctionFast()
- Red()
- Green()
- Blue()
- RGB()

#### IMUL replaced by faster code
A lot of multiplications will be replaced by faster code like:
Mul0011:
LEA ebx,[eax+eax*8]
ADD eax,eax
ADD eax,ebx

#### Subtracting of -Values
Ex:
MOV Edi,dword [v_n]
NEG Edi
SUB Ebx,Edi
->
ADD Ebx, Edi

#### Unneeded MOVs and PUSHs
MOV Ebx,dword [v_i2]
PUSH dword [v_e]
MOV Eax,Ebx
POP Ebx
->
MOV Eax,dword [v_i2]
MOV Ebx,dword [v_e]

#### Exchanging values of variables with use of a third
PUSH dword [v_a]
POP dword [v_c]
PUSH dword [v_b]
POP dword [v_a]
PUSH dword [v_c]
POP dword [v_b]
->
MOV eax,dword [v_a]
MOV ebx,dword [v_b]
MOV dword [v_b],eax
MOV dword [v_a],ebx
MOV dword [v_c],eax

#### Modulo with 2^n values like VAR % 64
MOV Ebx,dword [v_a]
MOV Eax,Ebx
MOV Ebx,2
CDQ
IDIV Ebx
MOV Ebx,Edx
MOV dword [v_b],Ebx
->
MOV eax,dword [v_a]
AND eax,1
MOV dword [v_b],eax





© Copyright by Remi Meier
02.07.2005
Website: http://www.remimeier.ch.vu
KarLKoX
Messages : 1191
Inscription : jeu. 26/févr./2004 15:36
Localisation : France
Contact :

Message par KarLKoX »

Effectivement, c'est plutôt interessant, c'est une sorte de compilateur fonctionnant en 2 passes.
Programme à suivre :)
"Qui baise trop bouffe un poil." P. Desproges
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Traduction : QQun pourrait m'expliquer à quoi ca sert ?
KarLKoX
Messages : 1191
Inscription : jeu. 26/févr./2004 15:36
Localisation : France
Contact :

Message par KarLKoX »

Bah c'est le même interêt qu'un compilateur en 2 passes : ce n'est pas indispensable mais ca peut servir dans certains cas, pour optimiser quelques blocs d'instructions ça et la, enlever des redondances, épurer le code, gagner quelques cycles ça et la, c'est toujours ça de pris :)
"Qui baise trop bouffe un poil." P. Desproges
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

J'ai vu El Chroni dans les crédits .
et ça me fait penser , mais alors avec cet optimizer , Tailbite va utiliser quel fichier asm ? celui généré par l'optimiseur ?
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Ca semble interessant

Ca donne quoi tes tests Comtois ?
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

j'ai pas fait de chono encore :)

déjà mes progs ne plantent pas cet optimizer ,c'est une bonne chose .
Donc à suivre ...
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

Je vais essayer ça avec les fonctions de ma librairie effect pour les rotations d'images, on verra de suite la différence (juste la procedure copié dans un nouveau code, sans passer par TailBite).
Le code de la lib ayant été optimisé de manière assez poussé (avec inclusion d'asm), on verra bien le gain entre ce qu'on arrive à faire et ce qu'ajoute cet optimizer. Je pense que ce sera un bon test.

Ca marche également aveec TailBite ?
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

avec TailBite c'est la question que je me pose.

Si tailbite fonctionne avec l'optimizer , je vais refaire ma lib matrix , il n'y a que des peek et des poke dedans:)


Sinon ce serait intéressant de connaitre le résultat de tes tests :)
gansta93
Messages : 1448
Inscription : jeu. 26/févr./2004 11:17
Localisation : Le Village
Contact :

Message par gansta93 »

J'admais ne pas bien saisire comment ça marche...
fweil
Messages : 505
Inscription : dim. 16/mai/2004 17:50
Localisation : Bayonne (64)
Contact :

Message par fweil »

Le principe d'optimisation en dernière passe est tout simple :

Par exemple, tous les Pokex() sont remplacés par l'équivalent ASM. Ce qui ne change rien au rendu du code, mais celà change une chose quand aux perfs.

En effet lorsqu'on fait un PokeL(Address, Value), celà est traduit dans un programme principal en :

! PUSH dword [v_Value]
! MOV eax,dword [v_Address]
! CALL PB_PokeL

Or le PB_PokeL lui_même opère une sauvegarde des registres avec restauration à la sortie avant de rendre la main.

Si à la place on pose systématiquement :

! MOV eax, dword [v_Address]
! MOV ebx, dword [v_Value]
! MOV [eax], ebx

on effectue le même travail en trois instructions machine.

Le travail de l'Optimizer est de ce niveau.
Mon avatar reproduit l'image de 4x1.8m présentée au 'Salon international du meuble de Paris' en janvier 2004, dans l'exposition 'Shades' réunisant 22 créateurs autour de Matt Sindall. L'original est un stratifié en 150 dpi.
gansta93
Messages : 1448
Inscription : jeu. 26/févr./2004 11:17
Localisation : Le Village
Contact :

Message par gansta93 »

Pourquoi Fred ne l'incluerait-il pas dans els prochaines versions ?
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

Effectivement, c'est intéressant de proposer des commandes pour débutant comme les peek/poke mais il est dommage que ce soit de vraies fonctions...

Dri
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

Bon, et bien je vais vous décevoir, pour ma lib effect, sur la rotation d'image avec un angle quelconque et avec antialiazing, le gain est de 0

Comme quoi, soit on des pros de l'optimisation, soit c'est pas terrible terrible, cet optimizer :oops:

j'ai également essayé avec mon programme "loupe" que vous retrouverez sur le forum.
Le prog ayant des opération mathématiques complexe sans aucune optimisation ASM
Et la aussi, le gain est de 0

Bref, je ne suis pas convaincu du tout
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

effectivement , il doit falloir pas mal de commandes prises en compte par l'optimizer pour voir une différence et encore.

dans l'exemple joint à l'optimizer :
Sans Optimizer j'obtiens un peu plus de 25 secondes
Avec Optimizer j'obtiens un peu plus de 24 secondes
en gros , je gagne une seconde ( 4%).
C'est pas flagrant .

Souhaitons que Fred saura faire encore mieux avec la V4 :)

Code : Tout sélectionner

a = 5
b = 6
c = 7
D = 3
e = 1
zahl = 1
i2 = 1
e = 1
c = 5
#N = 49999999
z.l
Delay(1000)

time1 = ElapsedMilliseconds()
For z = 1 To #N
    ;{ Integer
    c - a / D
    c = a % 2
    a % 2
    a = b * 3
    a * 5
    zahl = i2/e
    zahl = -i2 - -c
    zahl * 576
    zahl * 2005
    zahl * 10
    zahl * 20
    zahl * 36
    zahl * 1399
    zahl * 417
    zahl * 427
    PeekL(@c)
    PokeL(@c,2)
    Red(c)
    Green(c)
    Blue(c)
    RGB(a,b,c)
    PeekB(@c)
    PokeB(@c, 2)
    PeekW(@c)
    PokeW(@c,23)
    PeekF(@c)
    PokeF(@c, 2.0)
    ; Austausch von Variablenwerten
    a = b
    b = c
    c = a
    
    ;}
    
Next
time1 = ElapsedMilliseconds() - time1

MessageRequester(Str(zahl), Str(time1))
Répondre