jeudi 6 octobre 2011

scsi.device v43.46 (I)

De l'auto-promotion aujourd'hui ! Se cirer les pompes, ça fait du bien au moral ! Huhu !!

Voici donc une vidéo présentant une nouvelle version du driver disque dur des Amiga 600 et 1200. C'est le composant Gayle qui gère l'IDE 2.5 sur ces deux modèles. Beaucoup de travail et de larges modifications ont été effectué pour cette monture qui fonctionne plus rapidement maintenant.

Une 'nouvelle' technique est utilisé pour augmenter le taux de transfert. Elle n'est pas vraiment nouvelle en fait, mais plutôt 'étendue' dirons-nous.

Explications : la très grande majorité des programmes sur Amiga sont codés en C/C++ avec parfois quelques routines en assembleur pour les parties les plus souvent sollicitées par le CPU. Ici, c'est le driver en entier qui est optimisé en asm : voilà la différence.

Un exemple très simple pour mieux comprendre : il faut déjà savoir que les programmes sont une suite d'instructions CPU ayant chacune un certain poids (avec pour unité de mesure l'octet) agencées de manière cohérente par le programmeur. Imaginons un programme en fastram : suivant la fréquence du CPU et son type d'interface mémoire, le microprocesseur mets un certain temps à accéder au code. L'idée principale est donc de diminuer le poids du programme, c'est à dire d'utiliser deux instructions plutôt que trois partout où c'est possible ! De cette manière, non seulement le temps d'accès à la lecture de la mémoire est moindre (deux mnémoniques au lieu de trois pour notre exemple) mais aussi ensuite avec un nombre de cycles nécessaires inférieurs pour exécuter les opérations puisqu'il n'y a plus que deux instructions : le programme dans son ensemble fonctionne donc très très légèrement plus vite. Le code cache du CPU est également moins rempli, ce qui offre un autre léger bonus vitesse... Il y a aussi d'autres avantages dans certains cas, mais je veux rester simple pour que les néophytes comprennent. Le 060 possède aussi trois unités de calculs : deux pour les nombres entiers (nommés pOEP et sOEP) et une autre pour les nombres à virgules. Il est possible avec un agencement correct et bien précis des mnémoniques de réduire encore le temps d'exécution...

L'exemple suivant n'est valable qu'à partir du 68020 : pour cette nouvelle version, j'ai gagné plus de 1676 octets sur la totalité du driver en utilisant plusieurs autres astuces comme celle-ci mais compatible avec le 68000 puisque l'A600 utilise ce premier CPU de la gamme 68k.

Bref, voici du code bien concret :
  • move.b d1,d0                                                                  ; => poids de 2 octets et 1 cycle CPU 68040
  • ext.w d0                                                                         ; => poids de 2 octets et 1 cycle CPU 68040
  • ext.l d0                                                                           ; => poids de 2 octets et 1 cycle CPU 68040

Le poids de ces trois mnémoniques assembleur 68k est de 6 octets avec 3 cycles CPU.

Il est tout à fait possible d'économiser une instruction de cette façon :
  • move.b d1,d0                                                                  ; => poids de 2 octets et 1 cycle CPU 68040
  • extb.l d0                                                                         ; => poids de 2 octets et 1 cycle CPU 68040

Le résultat dans d0 est identique, alors que maintenant le code ne fait plus que 4 octets avec 2 cycles CPU...

Bien sûr, le gain de cette instruction économisée se mesure en nano-secondes : il faut donc l'addition sur la totalité du driver de très nombreuses optimisations de densité et de cycle pour arriver au final à un speedup visible par tous les utilisateurs d'Amiga 600 et 1200 :
  1. Une instruction ôtée = gain infime
  2. infime + infime + infime + infime + infime = gain minuscule
  3. minuscule + minuscule + minuscule + minuscule + minuscule = gain minime
  4. minime + minime + minime + minime + minime = gain léger
  5. léger + léger + léger + léger + léger = un speedup global de + 25 % pour ce driver IDE

Les gains cumulés sont très intéressants suivant le type de cartes accélératrice utilisées : sur la vidéo à venir, la vitesse de lecture est accrue de 25 % avec une ACA1230@28. Avec d'autres cartes ayant des accès au chipset AGA ou ECS (Gayle) plus lents, le bonus sera moindre.

Le récapitulatif de tous les changements :
  • 43.45 => 43.46
  • A600 & A1200 versions unifiées
  • Debug code ôté
  • Le serveur d'interruption optimisé
  • La fonction de lecture/écriture complètement retravaillée
  • Quelques sous-routines utilisées une seule fois intégrées
  • Le code est 100% PC relatif
  • Les cycles d'attente pour les très vieux HDs ôtés
  • Du code spécial pour le Conner 20 Mo CP2024 ôté
  • Ajout du hack de Doobrey pour que Pfs3 v18.4+ fonctionne avec les partitions situées au delà des 4 Go
  • 1676 octets sauvés

La vidéo est en cours de montage...
   

3 commentaires:

  1. Attention Cosmos, tu vas rendre nos Amigas parfaits.

    C'est pour cela qu'il y a du brouillard à Besançon ces temps-ci!

    RépondreSupprimer
  2. chapeau bas! a quand une carte video 100% cosmos pour nos amiga :D

    RépondreSupprimer
  3. Bon, et bien moi, je n'ai rien compris du tout ! C'est du Chinois pour moi.
    Je relève quand même que l'iDE va plus vite avec ^^

    RépondreSupprimer

Posté vos remarques :