Jump to content
Jagware
Sign in to follow this  
GT Turbo

Pipe line, cache, ghost in the Gpu ?

Recommended Posts

GT Turbo    5

Salut tout le monde, HALLUCINATOIRE !!! Le Gpu est un truc de FOU !!!! On savait que certaines sequences d'instructions sont a eviter car resultats aleatoires, mais alors la, le Gpu a un principe de fonctionnement que je comprends pas !! Premier exemple :

 

 

 

 movei #140,r3	    ; Met 140 dans le reg r3

 

moveq #6,r5 ; Met 6 dans le registre r5

 

movei #$f033f8,r4 ; Met la valeur $f033f8 (Adresse) dans r4

 

Boucle:

 

ma boucle principale (15 lignes)

 

---------

 

 

 

subq #1,r5 ; On soustrait 1 a r5

 

si R5>0 on reboucle sinon on continue a la suite

 

 

 

et bien vous savez quoi ? Ce code ne fonctionne pas !!! Boucle sans fin, j'ai cherché un moment et en mettant r5 avant movei #140,r3 cela fonctionne !!! Je sais que le Gpu 'pipe line' mais a ce stade !!! On dirait presque un cache !! On a l'impression qu'il recharge R5 avec la valeur 6 d'ou ma boucle sans fin.

 

 

 

La sequence d'instruction suivante est a mettre dans les annales du Gpu, SI SI !!

 

 

 

 

 

[code] load (r7),r4 ; Charge le X1

 

load (r6),r3 ; Pareil mais pour le X2

 

 

 

Boucle :

 

sub r3,r4

 

puis une dizaine de ligne et :

 

 

 

addq #4,r7

 

addq #4,r6

 

load (r7),r4 ; recharge X1

 

load (r6),r3 ; recharge X2

 

 

 

Puis vint une boucle de synchro et après on reboucle a 'boucle'

 

 

 

Ce code fonctionne MAIS si vous supprimez un 'load' dans la boucle, le code fonctionne encore !! On a l'impression que le Gpu est hanté et joue avec vous !!

 

C'est dur a croire mais la j'hallucinais un moment, car je voulais faire un traitement sur r3 et cela ne fonctionnait pas, pour résoudre le problème il faut insérer des Nops après les 'load' avant la boucle !!! Quit dit mieux !! On a l'impression que le Gpu utilisait le 'load' avant la boucle et rechargeait R3, faut que je calcules l'écart necessaire entre les instructions, mais on peut assimilé cela a un cache, mais joueur le cache !!! Sinon une solution, faites de grosses boucles !!

 

 

 

GT Heureux, j'ai pu debbuger !! :yes:

Share this post


Link to post
Share on other sites
Azrael    0

C'est quoi exactement "Ce code fonctionne MAIS si vous supprimez un 'load' dans la boucle, le code fonctionne encore !!" ??

 

 

 

Après recompilation ou bien après code automodifiant ?

Share this post


Link to post
Share on other sites
GT Turbo    5

Si tu essaies ce code la :

 

 

 

load (r7),r4 ; Charge le X1

 

load (r6),r3 ; Pareil mais pour le X2

 

 

 

Boucle :

 

sub r3,r4

 

puis une dizaine de ligne et :

 

 

 

addq #4,r7

 

addq #4,r6

 

load (r7),r4 ; recharge X1

 

 

 

Puis vint une boucle de synchro et après on reboucle a 'boucle'

 

 

 

Ca donne le meme résultat que celui au dessus (mais la on a une instruction en moins dans la boucle !!)

 

 

 

GT Perdu !! :wacko:

Share this post


Link to post
Share on other sites
Azrael    0

ben tu as une instruction qui sert à rien :P ou bien si tu vires encore la ligne

 

 

 

 

load (r7),r4 ; recharge X1

 

 

 

 

est ce que ça donne encore la même chose que ton code original ?

 

 

 

Edit : correction orth

Share this post


Link to post
Share on other sites
GT Turbo    5
Azrael :


ben tu as une instruction qui sert à rien :P ou bien si tu vires encore un la ligne





load (r7),r4 ; recharge X1





est ce que ça donne encore la même chose que ton code original ?





Non une ligne de dégagé en plus me tracait des polygones bancales, cela m'arrangerait si je pouvais avoir une dizaine d'instructions qui me servait servait a rien !!



GT Turbo ;)

Share this post


Link to post
Share on other sites
SCPCD    0
GT Turbo :


Si tu essaies ce code la :



load (r7),r4 ; Charge le X1

load (r6),r3 ; Pareil mais pour le X2



Boucle :

sub r3,r4

puis une dizaine de ligne et :



addq #4,r7

addq #4,r6

load (r7),r4 ; recharge X1



Puis vint une boucle de synchro et après on reboucle a 'boucle'



Ca donne le meme résultat que celui au dessus (mais la on a une instruction en moins dans la boucle !!)



GT Perdu !!



Je ne sais pas ce que tu fais dans les lignes non données mais si tu ne modifi pas le r3, alors ca parait logique qu'il n'est pas necessaire de mettre le load (r6),r3.



Par contre, je n'ai pas encore trouvé l'explication de l'erreur sur le premier code...

A moins qu'il y est un bug dans le GPU sur les sauts qui en fait ce tromperais dans le calcul de la position du PC dans certains cas mais je ne me rappelle pas que ca a été decrit dans la liste des bugs.

Une autre possibilité serais qu'il y est un bug dans l'assembleur MADMAC dans le calcul de l'adresse de retour dans certaines combinaisons.....

Share this post


Link to post
Share on other sites
GT Turbo    5
SCPCD :


Je ne sais pas ce que tu fais dans les lignes non données mais si tu ne modifi pas le r3, alors ca parait logique qu'il n'est pas necessaire de mettre le load (r6),r3. ;)





R3 est modifié, mais j'ai pas fait apparaitre pour des raisons de confidentialité, et le plus marrant c'est que si tu place un :



<

Share this post


Link to post
Share on other sites
Azrael    0
SCPCD :


Une autre possibilité serais qu'il y est un bug dans l'assembleur MADMAC dans le calcul de l'adresse de retour dans certaines combinaisons.....





Bonne suggestion. Je ne sais pas si GT a dessaemble le code compile par l'asm MADMAC... suite dimanche ou lundi.

Share this post


Link to post
Share on other sites
cts    0

GT, possible de mettre à dispo la routine complète ?

 

 

 

Vu qu'y a pleins de bugs possibles (instruction après le JUMP/JR, LOAD et utilisation directe du registre...le MOVEQ à proscrire a moins de coller un "OR rn,rn" apres pour être sûr du contenu du registre)

 

 

 

Sinon, sur jaguar, c'est une mauvaise idée d'utiliser des tables xmin/xmax, vaut mieux tracer les horizontales en paralelle du calcul. (ma dernière routine en date doit faire moins de 200 octets et pas besoin de buffer donc ;))

Share this post


Link to post
Share on other sites
GT Turbo    5
cts :


GT, possible de mettre à dispo la routine complète ?







Par pour l'instant, car je travailles dessus, pour le jump/jr, j'ai juste un nop après, pour l'instant, je vais voir pour le moveq



cts :


Sinon, sur jaguar, c'est une mauvaise idée d'utiliser des tables xmin/xmax, vaut mieux tracer les horizontales en paralelle du calc





Tu peux un peu expliquer ta technique, j'ai du mal a voir :wacko:



GT Turbo ;)

Share this post


Link to post
Share on other sites
cts    0

Sans la routine, dur de trouver ton bug...

 

 

 

Sinon, le polygone sans table c'est:

 

 

 

10 x_left+=left_inc

 

20 x_right+=right_inc

 

30 DRAW (X_left,x_right,y)

 

40 y++

 

50 goto 10

 

 

 

On peut pas faire + simple ! ;)

Share this post


Link to post
Share on other sites
GT Turbo    5
cts :


Sans la routine, dur de trouver ton bug...



Sinon, le polygone sans table c'est:



10 x_left+=left_inc

20 x_right+=right_inc

30 DRAW (X_left,x_right,y)

40 y++

50 goto 10



On peut pas faire + simple ! ;)





En partant d'une base triangulaire a priori ? Pour l'instant on dispose d'une routine 'general', on peux aussi bien faire un octogone qu'un triangle.



Effectivement c'est le plus simple possible !! ;)



GT ;)

Share this post


Link to post
Share on other sites
gloky    0
Salut tout le monde, HALLUCINATOIRE !!! Le Gpu est un truc de FOU !!!! On savait que certaines sequences d'instructions sont a eviter car resultats aleatoires, mais alors la, le Gpu a un principe de fonctionnement que je comprends pas !! Premier exemple :

 movei #140,r3	    ; Met 140 dans le reg r3

moveq #6,r5 ; Met 6 dans le registre r5

movei #$f033f8,r4 ; Met la valeur $f033f8 (Adresse) dans r4

Boucle:

ma boucle principale (15 lignes)

---------

subq #1,r5 ; On soustrait 1 a r5

si R5>0 on reboucle sinon on continue a la suite</div>

et bien vous savez quoi ? Ce code ne fonctionne pas !!! Boucle sans fin, j'ai cherché un moment et en mettant r5 avant movei #140,r3 cela fonctionne !!! Je sais que le Gpu 'pipe line' mais a ce stade !!! On dirait presque un cache !! On a l'impression qu'il recharge R5 avec la valeur 6 d'ou ma boucle sans fin.

La sequence d'instruction suivante est a mettre dans les annales du Gpu, SI SI !!

 

 

[code] load (r7),r4 ; Charge le X1

load (r6),r3 ; Pareil mais pour le X2

 

Boucle :

sub r3,r4

puis une dizaine de ligne et :

addq #4,r7

addq #4,r6

load (r7),r4 ; recharge X1

load (r6),r3 ; recharge X2

 

Puis vint une boucle de synchro et après on reboucle a 'boucle'</div>

Ce code fonctionne MAIS si vous supprimez un 'load' dans la boucle, le code fonctionne encore !! On a l'impression que le Gpu est hanté et joue avec vous !!

C'est dur a croire mais la j'hallucinais un moment, car je voulais faire un traitement sur r3 et cela ne fonctionnait pas, pour résoudre le problème il faut insérer des Nops après les 'load' avant la boucle !!! Quit dit mieux !! On a l'impression que le Gpu utilisait le 'load' avant la boucle et rechargeait R3, faut que je calcules l'écart necessaire entre les instructions, mais on peut assimilé cela a un cache, mais joueur le cache !!! Sinon une solution, faites de grosses boucles !!

GT Heureux, j'ai pu debbuger !! :yes:

 

pour le premier code, je pense plutot que r5 doit valoir 0 a l'entre de la boucle et quand ca reboucle ca passe a -1 et sur 68000 ca s'arrete au bout d'un moment mais ici le registre est plus grand en nombre de bit donc ca dure tres longtemp

Share this post


Link to post
Share on other sites
Guest
You are commenting as a guest. If you have an account, please sign in.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoticons maximum are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

×