Help - Search - Members - Calendar
Full Version: Pipe line, cache, ghost in the Gpu ?
Jagware > Consoles > Development
GT Turbo
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 :



[code] 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:
Azrael
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 ?
GT Turbo
Si tu essaies ce code la :



[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



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:
Azrael
ben tu as une instruction qui sert à rien :p ou bien si tu vires encore la ligne



[code]

load (r7),r4 ; recharge X1





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



Edit : correction orth
GT Turbo
Azrael :


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



[code]

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 ;)
SCPCD
GT Turbo :


Si tu essaies ce code la :



[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



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:



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.....
GT Turbo
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 :



[code]

movei #120,r3





Dans la boucle ben il fonctionne pas !!! Il n'est soit pas executé soit executé mais le 'load' hors boucle replace la valeur du tableau dedans !



GT Déboussolé !! :wacko:
Azrael
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.
cts
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 ;))
GT Turbo
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 ;)
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 ! ;)
GT Turbo
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 ;)
gloky
QUOTE (GT Turbo @ 19 Oct 2005, 21:55) *
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 :
[code] 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.gif


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
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Invision Power Board © 2001-2012 Invision Power Services, Inc.