Infos sur la Vampire
-
>un peu de AMMX pour accélérer les routines primitives seraient bien aussi (mais tant qu’on a pas les docs)
Y a ceci qui décrit l’AMMX et les optimisations 68080
http://forum.apollo-accelerators.com/viewtopic.php?f=10&t=25
http://forum.apollo-accelerators.com/viewtopic.php?f=10&t=1702
Apparemment c’est un peu comme l’altivec et autre MMX qui font plusieurs calculs en une fois (calcul sur vecteurs) mais en plus souple (cad mieux) au niveau de l’adressagey aussi ceci pour mesurer les optimisations
http://www.apollo-core.com/knowledge.php?b=4¬e=2528Alain
C’est quand même très succinct comme documentation. Ca se concentre sur quelques exemples ou concepts. On est loin de la doc 68k qui est complète et détaille la façon de calculer les cycles pour chaque instruction dans chaque circonstance (cache miss ou pas par ex.) Or pour optimiser en ASM, je ne connais rien d’autre que les comptage de cycles or même la doc « officielle » de http://www.apollo-core.com/index.htm?page=instructions oublie de donner le nb de cycles par instruction et mode d’adressage. C’est ballo, car une simple feuille excel serait suffisante pour ca 🙁
Mais il parrait qu’il y a quelqu’un qui bosse sur la doc. Espérons que les lacunes seront comblées, en particulier pour ce qui concerne le nb de cycles.
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.)Bah si!
Le type n’a pas envie de le laisser les trippes à l’air comme ca, ni faire des trous dans le boitier. Perso je pense que le mieux est de faire passer les câbles par la trape d’extension sur le coté gauche de la machine.
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.)Les instructions c’est bien et on peut même deviner ce qu’elle font via leur mnémonique.
Mais combien de cycles prennent-elles? Comment se comportent-elles en cas d’IRQ en plein milieu ? Quel type de TRAP lèvent-elles quand elles font un truc illégal ? y a t’il un bus-error avec les opérations de load/store via AMMX quand il y a un problème d’alignement ? ou de protection R/W/E via la MMU ?
Ce sont ca les infos dont je parle et qu’on trouve nulle-part sauf dans les vraies docs d’un processeur (la datasheet, le user-guide, le cooking-book, etc). Vivement qu’on ait tout ca 😀
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.)L’IRQ doit en principe avoir lieu après l’exécution complète de l’instruction. Dans le cas du deuxième core virtuel (l’hyperthread), j’imagine qu’une IRQ peut-être traitée à tout moment par l’un des cores. Dès qu’il y en a un de dispo en somme.
Par contre, là, c’est toi sam qui va me brieffer. Est-ce que dans les cpu actuelles, le cpu peut interrompre l’instruction en cours pour exécuter un autre bout de code? Ça me parait dénoué de sens. Car, déjà que les instructions prennent que dalle en cycle (on est loin du 68000), je ne vois pas l’intérêt de créer un mécanisme permettant d’interrompre 1 demi cycle d’exécution? Peut-être que j’ai mal compris ce que tu veux dire.
Les instructions classiques prennent en moyenne 0,5 cycle, donc 2 instructions par cycle (ça peut des fois être moins, des fois plus).
Si les instructions AMMX sont bien gaulées (et je n’en doute pas), ce devrait être dans les 0,5 cycle, soit 2 instructions par cycle (voir doc Intel). On doit être dans les mêmes timings qu’Intel.Il n’y a pas de problème d’alignement à ce que je sache. Ni avec les instructions standards, ni avec les instructions vectorielles. J’avance ça sans preuve bien sûr. Mais j’ai bien suivi toutes les données techniques fournie par Gunnar depuis plusieurs années et, s’il y avait eu une feinte de ce genre, je pense qu’il en aurait parlé.
Pour les trap, c’est secondaire. En principe, on évite de faire des divisions par zéro avant de faire le div…
Ceci dit, toutes ces informations sont utiles. J’attends moi aussi une doc digne de ce nom. Et comme dirait l’autre, c’est prévu. Ils bossent dessus.
En attendant une doc officielle on peut se remettre en tête ce que faisait le MMX d’ Intel :
(mais le AMMX travaille sur 3 opérandes genre C=A+B )MMX Instructions:
The MMX instructions enable x86 processors to perform single-instruction, multiple-data(SIMD) operations
on packed BYTE, WORD, LONG, or DOUBLE integer operands contained in memory, in MMX registers, or in general-purpose registers.Data Transfer Instructions (MMX)
The data transfer instructions move LONG and DOUBLE operands between MMX registers and between MMX registers and memory.Mnemonic Description
————————-
MOVD move LONG
MOVQ move DOUBLEConversion Instructions (MMX)
The conversion instructions pack and unpack BYTEs, WORDs, and LONGs.Mnemonic Description
————————-
PACKSSDW pack LONGs into WORDs with signed saturation
PACKSSWB pack WORDs into BYTEs with signed saturation
PACKUSWB pack WORDs into BYTEs with unsigned saturation
PUNPCKHBW unpack high-order BYTEs
PUNPCKHDQ unpack high-order LONGs
PUNPCKHWD unpack high-order WORDs
PUNPCKLBW unpack low-order BYTEs
PUNPCKLDQ unpack low-order LONGs
PUNPCKLWD unpack low-order WORDsPacked Arithmetic Instructions (MMX)
The packed arithmetic instructions perform packed integer arithmetic on packed BYTE, WORD, and LONG integers.Mnemonic Description
————————-
PADDB add packed BYTE integers
PADDD add packed LONG integers
PADDSB add packed signed BYTE integers with signed saturation
PADDSW add packed signed WORD integers with signed saturation
PADDUSB add packed unsigned BYTE integers with unsigned saturation
PADDUSW add packed unsigned WORD integers with unsigned saturation
PADDW add packed WORD integers
PMADDWD multiply and add packed WORD integers
PMULHW multiply packed signed WORD integers and store high result
PMULLW multiply packed signed WORD integers and store low result
PSUBB subtract packed BYTE integers
PSUBD subtract packed LONG integers
PSUBSB subtract packed signed BYTE integers with signed saturation
PSUBSW subtract packed signed WORD integers with signed saturation
PSUBUSB subtract packed unsigned BYTE integers with unsigned saturation
PSUBUSW subtract packed unsigned WORD integers with unsigned saturation
PSUBW subtract packed WORD integersComparison Instructions (MMX)
The compare instructions compare packed BYTEs, WORDs, or LONGs.Mnemonic Description
————————-
PCMPEQB compare packed BYTEs for equal
PCMPEQD compare packed LONGs for equal
PCMPEQW compare packed WORDs for equal
PCMPGTB compare packed signed BYTE integers for greater than
PCMPGTD compare packed signed LONG integers for greater than
PCMPGTW compare packed signed WORD integers for greater thanLogical Instructions (MMX)
The logical instructions perform logical operations on DOUBLE operands.Mnemonic Description
————————-
PAND bitwise logical AND
PANDN bitwise logical AND NOT
POR bitwise logical OR
PXOR bitwise logical XORShift and Rotate Instructions (MMX)
The shift and rotate instructions operate on packed BYTEs, WORDs, LONGs, or DOUBLEs in 64–bit operands.Mnemonic Description
————————-
PSLLD shift packed LONGs left logical
PSLLQ shift packed DOUBLE left logical
PSLLW shift packed WORDs left logical
PSRAD shift packed LONGs right arithmetic
PSRAW shift packed WORDs right arithmetic
PSRLD shift packed LONGs right logical
PSRLQ shift packed DOUBLE right logical
PSRLW shift packed WORDs right logicalState Management Instructions (MMX)
The emms (EMMS) instruction clears the MMX state from the MMX registers.Mnemonic Description
————————-
EMMS empty MMX statePar contre, là, c’est toi sam qui va me brieffer. Est-ce que dans les cpu actuelles, le cpu peut interrompre l’instruction en cours pour exécuter un autre bout de code? Ça me parait dénoué de sens.
Et bien si, ca existe et pas forcément sur les CPU nouveaux. Par exemple avec le 6309 de Toshiba, les opérations de transfert de bloc mémoire peuvent être interrompus avant la fin, et il faut vérifier le registre compteur ou ceux d’adresse pour savoir si le bloc est intégralement ou partiellement copié. C’est pareil avec le prefix REP/REPE/REPNZ sur x86 mais chez eux le retour d’interruption rejoue l’opération au lieu de passer à la suivante comme sur 6309, du coup c’est transparent pour le programmeur ouf!
Ces affaires d’IRQ interompant les opérations lentes sont nécéssaires en fait. Imagines ce qu’il se passe si tu dois attendre les 200cycles de traitements d’un calcul de sinus dans un fpu ou de division entière 64 bits sur des micro-controlleurs qui doivent réagir rapidement à une interruption: c’est trop lent!
C’est pour ca que parfois on recommande de ne pas utiliser certaines instructions pour réduire la latence aux interruptions. Par exemple un div.s coûte 150cycles sur 68000. C’est hyper-lent à attendre pour traiter une interruption. Il vaut mieux remplacer le div.s par du software qui fait pareil certes plus lentement, mais qui est interuptible avec une latence nettement plus faible. (Tout dépend des circonstances bien sur.)
Question TRAP 68k ca va bien au delà de la simple division par 0. Dans toute la gamme des 68k et de l’amiga il y a eu des modifications du trap généré par exemple quand on accède à de la ram inexitante. Ca peut faire, soit rien, soit un adress-error ou un bus-error suivant le cpu et l’amiga. Quelle est la statégie retenue avec la vampire ? Bref: je suis un peu impatient d’en apprendre plus sur le design et la conception du 68080, un peu comme les trucs qu’on peut apprendre en lisant ceci: http://amigadev.elowar.com/read/ADCD_2.1/AmigaMail_Vol2_guide/node0161.html (qui explique pourquoi oui la MMU est nécéssaire et activée dès le boot sur un amiga équipé d’un 68040)
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
Pour des instructions de 150 cycles, je peux le comprendre. Mais pour des trucs de 1 à 30 cycles, c’est fort de café. En plus, les machines turbinent aux giga hertz. Et puis c’est pas le genre d’instructions que le cpu rencontre à chaque adresse…M’enfin, si c’est comme ça, c’est qu’il doit y avoir une demande. Tant mieux si c’est transparent.
Je me souviens que tu avais parlé de ça sur un forum thomson. C’est pourquoi je t’ai demandé un brieffing.
EDIT: flype nous donnait un aperçu de quelques instructions ici: http://apollo-core.com/knowledge.php?b=4¬e=800&z=eVB4Nn
Ce lien est interressant (dommage que le fichier source GCC ne soit plus dispo). Etonnament les DIV, MUL et déplacements mémoire-mémoire ont besoin de plusieurs cycles. J’aurais cru que le 080 faisait ca en 0.5 cycles finger-in-ze-nose.
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.)D’une part, ce test date de plus d’un an (il pourrait y avoir des optims de faites entre deux). D’autre part, il faut scheduler correctement les instructions pour exécuter jusqu’à 4 instructions en même temps, c’est-à-dire avoir des instructions exécutables en 0.25 cycle.
Dans la pratique, Gunnar indique que la plupart des instructions sont exécutées en moins d’un cycle. Mais il ne faut pas trop s’amuser à les scheduler comme sur 060. En effet, la techno « bonding » est en plus par rapport au 060, ce qui permet au 080 d’exécuter 2 instructions comme si elles n’en formaient qu’une, là où on arrangeait les instructions différemment sur 060 pour profiter du « fusing ». Genre, on peut avoir 2 couples d’instructions groupés, eux-même fusionnés ensemble.
Bref, fusing et bonding permettent d’exécuter jusqu’à 4 instructions dans le même cycle.
A noter qu’il est encore possible d’améliorer le nombre de pipes pour faire mieux. Je pense que ça viendra plus tard, dans la limite des capacités du fpga.
EDIT: Et puis il faut rappeler que le 80 est hyperthreadé. Donc, 2 cores virtuels, soit le double de registres. Il y a moyen de faire des trucs encore plus ouf avec un code bien pensé.
C’est dommage que personne ne bosse sur un compilo C correct capable de tirer profit de ces trucs là, parce que je pense que les optims manuelles en ASM ca va 5mins pour les démos-codeurs, mais en pratique personne ne fait ca pour des applis normales.
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
Je suis sûr que tu as déjà mis le nez dedans et que tu sais déjà comment adapter un bon gcc6 pour la vampire.En plus, il existe une version linux de gcc6 qui génère du code 68k. A lui seul, il doit être capable de compiler la version 6 pour nos 68k.
Théoriquement (parce que j’ai jamais mis le nez dedans – c’est le porteur officiel de gcc 68k qui m’avait brieffé il y a 25 ans), gcc découpe le process en 3 étapes:
1) il y a la partie compilo qui génère un code intermédiaire
2) le code intermédiaire s’appelle du RTL (Register Transfer Language). C’est là, dans l’optimizer, qu’il va falloir gérer le code 080. Il doit donc générer le code du cpu en question.
3) le code généré est encapsulé dans un conteneur dédié. Chez nous, c’est le format Chunk (parce que « ELF is a monster » – petit clin d’oeil).C’est pratique non? Qui s’y colle?
- Le sujet ‘Infos sur la Vampire’ est fermé à de nouvelles réponses.
› Forums › AmigaOS, MorphOS et AROS › Matériel › Infos sur la Vampire