Eval vitesse d'un programme sur differents amigas
-
Merci Goodchip, yapuka… 😉
A500+ACA500 - A600+Vampire 2+indivision ECS - A1200+Vampire V2 1200 - Mac Mini 1.42 sous MOS - Just CPC 128k - CPC 6128 - Atari STE 4Mo/CosmosEx - Atari Falcon CT60/SuperVidel 🙂
C64C + 1541-II + Lecteur K7 + SD - Sharp X68000 CZ-601C 4Mo + CF - Sharp X68000 CZ-611C 10Mo + CF + ext. MIDICe soir j’ai ré-écrit le rasterizer en asm: >>ici<<
Résultat: outre le fait que c’est plus rapide, les différences entre compilateurs sont réduites.
Ca n’est qu’un 1er jet en ASM, je pense qu’on peut faire plus rapide car la grosse formule appliquée en chaque point:
[code]
*out = makeColour(
real2scalar(
modelTri->vertices[0]->color.x * d1 +
modelTri->vertices[1]->color.x * d2 +
modelTri->vertices[2]->color.x * d0),
real2scalar(
modelTri->vertices[0]->color.y * d1 +
modelTri->vertices[1]->color.y * d2 +
modelTri->vertices[2]->color.y * d0),
real2scalar(
modelTri->vertices[0]->color.z * d1 +
modelTri->vertices[1]->color.z * d2 +
modelTri->vertices[2]->color.z * d0));
[/code]
Peut être optimisée en passant par des delta pour réduire les 9 multiplications et 6 additions à seulement 3 additions.Samuel.
Amiga A500 + GVP530 (8Mo/fpu/mmu/scsi) - en panne 🙁
A500 (+ 1Mo PPS), A1200 (Blizzard-IV/fpu/64Mo)
A500 Vampire V2+ ^8^ 🙂
(mais aussi TO8, TO8D, TO9. Groupe PULS.)@Samuel
Si tu veux te lancer dans la modif de l’asm:
une commande pratique dans gcc c’estgcc -Wa,-adhln -g -Wall -m68020-40 -m68881 -noixemul -O3 -c fillpoly.c > fillpoly-mixed.c
qui donne l’asm généré mixé avec le source original en C
Je me suis fait une commande qui
1) nettoye ce listing (notamment enlève les chiffres en début de ligne et mets le C en commentaires)
ainsi on peut écrire dedans ses modifs de l’asm
2) la même commande enlève les commentaires pour obtenir un asm pur prêt à recompiler avec gccSi t’as un mail et que ça t’intéresse
Alain
Exemple de mix:
131:fillpoly.c **** Delta.L.u=(Edge2->L.u – Edge1->L.u)/dx;
863 .stabd 68,0,131
864 0084 202C 000C movel a4@(12),d0
865 0088 90AB 000C subl a3@(12),d0
866 008c 2E00 movel d0,d7
867 008e 4C46 7807 divsl d6,d7
868 0092 2B47 FFDC movel d7,a5@(-36)puis nettoyage:
// Delta.L.u=(Edge2->L.u – Edge1->L.u)/dx;
movel a4@(12),d0
subl a3@(12),d0
movel d0,d7
divsl d6,d7
movel d7,a5@(-36)puis optimisation manuelle:
// Delta.L.u=(Edge2->L.u – Edge1->L.u)/dx;
movel a4@(12),d0
subl a3@(12),d0
divsl d6,d0
movel d0,a5@(-36)puis asm pur:
movel a4@(12),d0
subl a3@(12),d0
divsl d6,d0
movel d0,a5@(-36)Ah merci cool, ca me manquait les sorties mixtes. Moi je faisais le bon vieux -S qui sort de ASM brut, mais comme mes méthodes sont courtes et ne font qu’une chose je m’en sortais avec ca. Il faut dire que le code C est l’asm 68k sont très voisins, donc on y retrouve ses petits.
Avec la vamp en revanche, et en particulier le superscalaire, le code ASM optimisé a tendence à mélanger plusieurs instructions sources séparées dans la même région asm. Je veux dire par là que la construction « INST1; INST2; » du C ne se traduit plus comme « ASM1; ASM2; » (assemblage linéaire) où ASM1 correspond aux instructions C de INST1 (idem avec les ASM2/INST2), mais on a en asm un mix de ASM1 et ASM2 interpénétrés: La fin de ASM1 déborde sur le début de ASM2. C’est assez pénible à relire, et surtout à écrire.
Je rêverais d’un outil qui prenne de l’ASM « linéaire » où ASM1 et ASM2 sont bien séparés et fasse le mélange ASM1/ASM2 automatiquement pour tirer parti des deux pipelines 5 étages. Ca s’appelle un (re-)scheduler d’instructions et ca n’existe pas à ma connaissance pour amiga. Du coup il faut faire ca à ma main, et c’est long et casse-gueule (surtout si on doit modifier l’algo par la suite), mais ca vaut le coup. Flype a testé en X11 et dépasse les 20fps à présent avec le monkey suzanne (500 points, 1500 facettes.)
Samuel.
Amiga A500 + GVP530 (8Mo/fpu/mmu/scsi) - en panne 🙁
A500 (+ 1Mo PPS), A1200 (Blizzard-IV/fpu/64Mo)
A500 Vampire V2+ ^8^ 🙂
(mais aussi TO8, TO8D, TO9. Groupe PULS.)Version du 13/10/18, Vampire 600 V2, Superscalar ON, Core x11
Ancienne version/nouvelle version
* vbcc – 15.551 fps / 17.118 fps
* gcc 2.95.3 – 15.637 fps / 16.987 fps
* gcc 3.2.2 – 15.917 fps / 18.239 fps
* gcc 6.3.1b – 17.306 fps / 18.957 fps
* gcc 6.4.1b – 17.801 fps / 18.222 fps
* sasc – 12.655 fps / 16.924 fps
Pas mal, pas mal… 🙂 Sur sasc, le bond est impressionnant ! Et effectivement, ça nivelle un peu le rendu 😉
A500+ACA500 - A600+Vampire 2+indivision ECS - A1200+Vampire V2 1200 - Mac Mini 1.42 sous MOS - Just CPC 128k - CPC 6128 - Atari STE 4Mo/CosmosEx - Atari Falcon CT60/SuperVidel 🙂
C64C + 1541-II + Lecteur K7 + SD - Sharp X68000 CZ-601C 4Mo + CF - Sharp X68000 CZ-611C 10Mo + CF + ext. MIDITiens c’erst un chouille en dessous de Flype. Il était peut-être en X12, je ne sais plus. Sinon si 19-20fps c’est trop rapide, il y a le mode « -model redrat » et là les perfs s’effondrent complètement du au trop grand nombre de faces qui s’affichent effectivement. Au fait je ne sais plus si je l’ai indiqué, mais les flèches gauche/droite permettent de tourner autour de l’objet, et haut/bas de s’en approcher ou de s’en éloigner.
Samuel.
Amiga A500 + GVP530 (8Mo/fpu/mmu/scsi) - en panne 🙁
A500 (+ 1Mo PPS), A1200 (Blizzard-IV/fpu/64Mo)
A500 Vampire V2+ ^8^ 🙂
(mais aussi TO8, TO8D, TO9. Groupe PULS.)@__sam__
C’est sans doute parce que je lance un script (avec execute) en utilisant l’argument -size :
>monkey.gcc-4.6.1b -size 320 200 -benchmark
Ce qui donne en gros avec gcc 6.x
20 fps en x11
22 fps en x12A600 Rev 1.5 + Vampire 600 V2-128.
A1200 Rev 1D4 + Blizzard 1230 III/50Mhz + 68882 + 256MB @ 50ns.Je lance un « execute run-benchmark.txt » pour qu’on ait des résultats comparables. 🙂
Et oui, Sam, tu avais indiqué pour tourner autour et le zoom.
A500+ACA500 - A600+Vampire 2+indivision ECS - A1200+Vampire V2 1200 - Mac Mini 1.42 sous MOS - Just CPC 128k - CPC 6128 - Atari STE 4Mo/CosmosEx - Atari Falcon CT60/SuperVidel 🙂
C64C + 1541-II + Lecteur K7 + SD - Sharp X68000 CZ-601C 4Mo + CF - Sharp X68000 CZ-611C 10Mo + CF + ext. MIDICa n’est qu’un 1er jet en ASM, je pense qu’on peut faire plus rapide car la grosse formule appliquée en chaque point: (…) peut être optimisée en passant par des delta pour réduire les 9 multiplications et 6 additions à seulement 3 additions.
Voila qui est fait: >>ici<<
La routine principale se réduit à quelques additions selement
.1 fcmp.s (a1)+,fp3 fble.b .2 fmove.s fp3,-4(a1) fmove.l fp5,d7 fmove.l fp4,(a2) move.w d7,2(a2) fmove.l fp6,d7 move.b d7,3(a2) .2 fadd.s d0,fp0 fblt.b .9 fadd.s d1,fp1 fblt.b .9 fadd.s d2,fp2 fblt.b .9 fadd.s d3,fp3 addq.l #4,a2 fadd.s d4,fp4 fadd.s d5,fp5 fadd.s d6,fp6 bra .1 .9 fmovem (sp)+,fp2-fp7 movem.l (sp)+,d2-d7/a2 rts
Samuel.
Amiga A500 + GVP530 (8Mo/fpu/mmu/scsi) - en panne 🙁
A500 (+ 1Mo PPS), A1200 (Blizzard-IV/fpu/64Mo)
A500 Vampire V2+ ^8^ 🙂
(mais aussi TO8, TO8D, TO9. Groupe PULS.)Version du 15/10/18, Vampire 600 V2, Superscalar ON, Core x11
Ancienne version/nouvelle version
* vbcc – 17.118 fps / 18.197 fps
* gcc 2.95.3 – 16.987 fps / 19.126 fps
* gcc 3.2.2 – 18.239 fps / 20.141 fps
* gcc 6.3.1b – 18.957 fps / 21.171 fps
* gcc 6.4.1b – 18.222 fps / 21.191 fps
* sasc – 16.924 fps / 17.727 fps
22.164 fps avec la même commande que Flype
A500+ACA500 - A600+Vampire 2+indivision ECS - A1200+Vampire V2 1200 - Mac Mini 1.42 sous MOS - Just CPC 128k - CPC 6128 - Atari STE 4Mo/CosmosEx - Atari Falcon CT60/SuperVidel 🙂
C64C + 1541-II + Lecteur K7 + SD - Sharp X68000 CZ-601C 4Mo + CF - Sharp X68000 CZ-611C 10Mo + CF + ext. MIDI
- Vous devez être connecté pour répondre à ce sujet.
› Forums › AmigaOS, MorphOS et AROS › Développement › Eval vitesse d'un programme sur differents amigas