En attendant voici la toute dernière version optimisé du calcul au GPU.
J'ai ajouté aussi une attente d'1 seconde après l'initialisation vidéo pour laisser le temps à l'écran de se synchroniser
J'ai remis l'effacement du 2ème l'écran pour faire propre
Pour le calcul GPU, je crois que j'ai atteint une bonne limite d'optimisation avec le code d'origine.
Le plus gros du calcul c'est celui de la boucle d'un point, qui peut être répéter au maximum 256 fois. C'est le calcul fractal en lui même.
Je ne suis pas assez calé dans ce domaine (ou alors il faudrait que je m'y penche plus sérieusement) pour pouvoir toucher à cette partie.
J'ai quand même réussi à optimisé la boucle d'origine de 2, oui madame,
2 instructions (woohoo) en modifiant le comptage de la couleur et en utilisant le fait que les RISC de la Jaguar exécute toujours l'instruction suivant un JUMP (ou JR)
Bon en fait pour le comptage de la couleur j'avoue je ne gagne rien car pour gagner 1 instruction j'ai changé l'incrémentation d'origine par une décrémentation. ça m'a permit de pouvoir virer une instruction CMP pour remplacer la boucle par un SUBQ suivi d'un saut par condition.
Donc là au lieu de 3 instructions (ADDQ, CMP,JR), j'avais juste 2 instructions (SUBQ, JR). Seulement, dans le code d'origine la valeur 0 n'est jamais utilisé, la boucle s'arrête donc à la valeur 1. Sans CMP je ne peut pas atteindre cette condition sans ruser.
La ruse c'est de décrémenter de 2 au lieu de 1, et si le résultat est zéro c'est qu'on est arrivé à al fin de la boucle. Et juste après le rajoute 1 pour retomber sur la bonne valeur.... et donc je perds l'instruction que j'avais gagné.... Tout ça pour ça...
Et du coup bien sur la palette de l'image est inversée, mais c'est jolie aussi.
La boucle d'origine fait 24 instructions en comptant les nop, la version optimisée fait 22, en respectant le nombre de couleurs traités.
Par contre tout le reste du code est vraiment pas mal optimisé, mais ça ne change vraiment pas grand chose.
J'ai trouvé une routine sur Internet dont la boucle principale fait 16 instructions, mais c'est du code x86 que je ne maitrise pas. J'ai commencé à regarder mais ça commence à faire beaucoup pour un truc qui était juste pour passer le temps.
pour info :
https://github.com/leto/asmutils/blob/master/src/bonus/mandelbrot.asm?fbclid=IwAR0oLAVMrQW7j5PD0nkH1PtCTvvzseucW_JlYswvTmcxyjZms795vV1Al5IJe ne sais pas si le résultat est le même non plus. C'est une routine pour une image en 640*480*8, mais pour une fractale Mandelbrot il y a d'autres critères qui entre en compte, notamment le nombre d'itération non ?
Il faudrait que je regarde aussi la routine d'effacement de l'écran au blitter. Je n'ai pas regardé en détails et je ne connais pas assez le fonctionnement du blitter pour comprendre, mais dans la version d'origine B_COUNT est initialisé avec les valeur 256 et 200.
Normal, l'écran d'origine est est en 256*200. Logiquement je me suis dit qu'en mettant 640 et 480 dans B_COUNT ça marcherait.... ben non, je dois mettre 640*1000 sinon ça n'efface pas tout l'écran...
Fichier joint : JAGMAND.COF