Infos sur la Vampire

15 sujets de 886 à 900 (sur un total de 971)

  • serge

      #296405

      C’est super goodchip.

      Impatient d’avoir ton retour.


      @sinisrus
      : mdr 😀

      RyZen Rulez 😉

      thellier

        #296463

        >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’adressage

        y aussi ceci pour mesurer les optimisations
        http://www.apollo-core.com/knowledge.php?b=4&note=2528

        Alain

        __sam__

          #296465

          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.)

          Thor1230

            #296469

            Personne pour montrer comment il a integre sa vampire sur son amiga 500 ???

            Amiga + CPC + PC = La meme passion !

            __sam__

              #296473

              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.)

              seg

                #296474

                @sam
                J’avais lu un truc de Gunnar qui disait que les instructions AMMX du 68080 étaient ni plus ni moins les mêmes que celles d’Intel. En gros, tu prends la doc Intel et tu utilises les registres du 68080.

                A vérifier.

                __sam__

                  #296477

                  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.)

                  seg

                    #296480

                    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.

                    thellier

                      #296481

                      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 DOUBLE 

                      Conversion 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 WORDs 

                      Packed 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 integers 

                      Comparison 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 than 

                      Logical 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 XOR 

                      Shift 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 logical 

                      State Management Instructions (MMX)
                      The emms (EMMS) instruction clears the MMX state from the MMX registers.

                      Mnemonic Description 
                      ————————-
                      EMMS empty MMX state 

                      __sam__

                        #296487

                        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.

                        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.)

                        seg

                          #296515

                          @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&note=800&z=eVB4Nn

                          __sam__

                            #296524

                            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.)

                            seg

                              #296527

                              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é.

                              __sam__

                                #296534

                                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.)

                                seg

                                  #296548

                                  @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?

                                15 sujets de 886 à 900 (sur un total de 971)

                                • Le sujet ‘Infos sur la Vampire’ est fermé à de nouvelles réponses.

                                Forums AmigaOS, MorphOS et AROS Matériel Infos sur la Vampire

                                Amiga Impact