comment faire plusieurs additions a la fois ?

comment faire plusieurs additions a la fois ? - ASM - Programmation

Marsh Posté le 02-04-2003 à 13:42:49    

me revoila :)
 
toujours en train d'apprendre l'assembleur, j'ai lu que les processeurs permettaient de faire plusieurs additions en même temps. mais comment faire ? si on met les instructions les unes après les autres, elles seront exécutées séquentiellement, et pas en même temps :heink:


---------------
Bougredane et bougre d'andouille ne font qu'un !
Reply

Marsh Posté le 02-04-2003 à 13:42:49   

Reply

Marsh Posté le 02-04-2003 à 13:44:07    

si, y'a plusieurs pipeline dans un CPU, par contre il faut bien evidemment qu'il n'y ait aucune dependance entre tes instructions

Reply

Marsh Posté le 02-04-2003 à 13:46:37    

tu peux aussi utiliser le MMX, qui te permet de faire jusqu'à 8 opérations simultanées


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 02-04-2003 à 13:50:48    

chrisbk a écrit :

si, y'a plusieurs pipeline dans un CPU, par contre il faut bien evidemment qu'il n'y ait aucune dependance entre tes instructions
 

tu peux expliquer :??:


---------------
Bougredane et bougre d'andouille ne font qu'un !
Reply

Marsh Posté le 02-04-2003 à 13:51:48    

Harkonnen a écrit :

tu peux aussi utiliser le MMX, qui te permet de faire jusqu'à 8 opérations simultanées


tu peux expliquer aussi :??:


---------------
Bougredane et bougre d'andouille ne font qu'un !
Reply

Marsh Posté le 02-04-2003 à 13:57:52    

vic le viking a écrit :

tu peux expliquer :??:


 
 
add eax,ebx
add ecx,edx;
 
ces deux instructions vont etre execute simultanement (sur un pentium ou mieux). Ce sont des instructions simples, et n'ayant aucune dependance entre elle
ex :
 
add eax,ebx
add eax,edx;
 
tu noteras une dependance de flux entre les deux instructions, forcant l'execution sequentielle
 
 
le MMX te permet te faire +eurs instruction d'un seul, pour peu que tes donnees soit organisees de manieres correcte
 
mettons :
int tab[2];
int tab2[2];
 
tu veux faire :
tab[0] = tab[0] + tab2[0];
tab[1] = tab[0] + tab2[1];
 
en MMX :
 
movq  mm0, tab;  //deplace 64bits dans le registre MMX mm0
pmuld mm0, tab2; //effectue le bout de code decrit plus haut
movq  tab, mm0;  //rebalance le tout en ram
 
les reg MMX font 64bits. Ces regs peuvent etre vu comme :
2 regs de 32bits
4 regs de 16bits
8 regs de 8bits
 
(mais pas comme un gros de 64bits)
une instruction MMX pourra donc s'appliquer a plusieurs donnes a la fois
 
(je suis pas clair mais bon, bref)
 

Reply

Marsh Posté le 02-04-2003 à 14:04:49    

2

vic le viking a écrit :


tu peux expliquer aussi :??:


le MMX utilise des registres 64 bits qui peuvent être divisés en octets, word, dword ou quadword. tu peux faire des opérations simultanées sur les 8 octets, sur les 4 word ou sur les 2 dword. chaque donnée sera traitée séparément
 
edit: grilled, mais je te file quand même un code d'exemple :
 


tab1    db 10,20,30,40,50,60,70,80,90
tab2    db 15,25,35,45,55,65,75,85,95
 
mov    eax,offset tab1
mov    ebx,offset tab2
 
movq   mm0,[eax]  ; on transfère les octets de tab1 dans mm0
movq   mm1,[ebx]  ; idem pour tab1 dans mm1
paddb  mm0,mm1    ; on additionne les octets entre eux
femms             ; on quitte le mmx (pour libérer la FPU)


 
mm0 contiendra donc les octets suivants :
 
25,45,65,85,105,125,145,165
 
en 3 lignes, tu as fait un transfert de données et réalisé 8 additions !


Message édité par Harkonnen le 02-04-2003 à 14:11:19

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 02-04-2003 à 14:33:24    

chrisbk a écrit :


movq  mm0, tab;  //deplace 64bits dans le registre MMX mm0
pmuld mm0, tab2; //effectue le bout de code decrit plus haut
movq  tab, mm0;  //rebalance le tout en ram


t'es sur que tu voulais pas mettre paddd ? ;)


Message édité par Harkonnen le 02-04-2003 à 14:36:50

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 02-04-2003 à 14:36:34    

Harkonnen a écrit :


t'es sur que tu voulais pas mettre paddb ? ;)


 
si :D
 
par contre (si je puis me permettre et pour faire de l'enculationnage de drosophyle)
 

Code :
  1. movq   mm0,[eax]  ; on transfère les octets de tab1 dans mm0
  2. paddb  mm0,[ebx]  ; on s'economise un mov, un registre, et dixit les docs AMD les athlons sont tres fort a ce petit jeu la (load execute que ca s'apelle, meme, pour faire mon mec super intelligent)
  3. femms             ; on quitte le mmx (pour libérer la FPU). Ceci est une instruction 3dnow only, donc ca passera pas sur intel :O Utiliser emms pour plus de compatibilite


 
 
C moi qui ait eu le dernier mot [:neffy] :D


Message édité par chrisbk le 02-04-2003 à 14:37:43
Reply

Marsh Posté le 02-04-2003 à 14:38:22    

chrisbk a écrit :


 
si :D
 
par contre (si je puis me permettre et pour faire de l'enculationnage de drosophyle)
 

Code :
  1. movq   mm0,[eax]  ; on transfère les octets de tab1 dans mm0
  2. paddb  mm0,[ebx]  ; on s'economise un mov, un registre, et dixit les docs AMD les athlons sont tres fort a ce petit jeu la
  3. femms             ; on quitte le mmx (pour libérer la FPU). Ceci est une instruction 3dnow only, donc ca passera pas sur intel :O Utiliser emms pour plus de compatibilite


 
 
C moi qui ait eu le dernier mot [:neffy] :D


[:tapai]
emms = 50 cycles
femms = 5 cycles
 
y'a pas photo ! pour un tel gain, tout le monde devrait avoir un Athlon :d
 
edit: et j'ai détaillé pour qu'il puisse comprendre, meme si tu as raison : on peut faire l'économie d'un mov ;)


Message édité par Harkonnen le 02-04-2003 à 14:40:07

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 02-04-2003 à 14:38:22   

Reply

Marsh Posté le 02-04-2003 à 14:38:49    

heuh oui, il aurait ete utile de preciser que les registres MMX sont en fait un remappage de la pile de la FPU. Donc impossible d'utiliser MMX et FPU en meme temps  

Reply

Marsh Posté le 02-04-2003 à 14:41:06    

Harkonnen a écrit :


[:tapai]
emms = 50 cycles
femms = 5 cycles
 
y'a pas photo ! pour un tel gain, tout le monde devrait avoir un Athlon :d
 
edit: et j'ai détaillé pour qu'il puisse comprendre, meme si tu as raison : on peut faire l'économie d'un mov ;)


(je fais du code portable, moi monsieur :O :D)
 
ah tiens, t'as finalement reussi a trouver le nb de cycle pour AMD ?

Reply

Marsh Posté le 02-04-2003 à 14:41:07    

chrisbk a écrit :

heuh oui, il aurait ete utile de preciser que les registres MMX sont en fait un remappage de la pile de la FPU. Donc impossible d'utiliser MMX et FPU en meme temps  
 


oups... oui, effectivement  :whistle:


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 02-04-2003 à 14:43:39    

chrisbk a écrit :

ah tiens, t'as finalement reussi a trouver le nb de cycle pour AMD ?


j'ai trouvé une doc, assez ancienne et très incomplète, qui indique le nombre de cycles des principales instructions 3DNow. mais c'est pas vraiment ce que je cherchais :(
 

chrisbk a écrit :


(je fais du code portable, moi monsieur :O :D)  


ah mais moi aussi ! mon code est portable sur tous les Athlons, XP ou non :d


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 02-04-2003 à 14:46:06    

Harkonnen a écrit :


ah mais moi aussi ! mon code est portable sur tous les Athlons, XP ou non :d


 
 
Vu que j'a un athlon (non XP) ca passera pour cette fois :D
Par contre je veux pas entendre parler de SSE :O

Reply

Marsh Posté le 02-04-2003 à 14:58:33    

chrisbk a écrit :


 
 
Vu que j'a un athlon (non XP) ca passera pour cette fois :D
Par contre je veux pas entendre parler de SSE :O


je t'avouerais que j'ai jamais essayé de jouer avec le SSE ! je sais meme pas à quoi ressemblent ses instructions, ni ou trouver la doc dessus !


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 02-04-2003 à 15:08:21    

Va surement falloir aller sur le site d'intel [:meganne] Tiens, voila ton casque, corde, lampe de poche, si t'es pas revenu dans deux jours j'apelle les secours ok ?
 
(pourtant des reg 128bits, ca devrait t'interesser non ? perso tout ce que je sais sur le SSE c que les regs s'apellent XMM, c bien tout :D )

Reply

Marsh Posté le 02-04-2003 à 15:11:44    

chrisbk a écrit :

Va surement falloir aller sur le site d'intel [:meganne] Tiens, voila ton casque, corde, lampe de poche, si t'es pas revenu dans deux jours j'apelle les secours ok ?


[:totoz]
 

chrisbk a écrit :


(pourtant des reg 128bits, ca devrait t'interesser non ?  


tu m'étonnes :love:
je vois d'ici les possibilités pour faire un bump ! je pourrais traiter 16 pixels à la fois ! un pur bonheur :love:
 

chrisbk a écrit :


perso tout ce que je sais sur le SSE c que les regs s'apellent XMM, c bien tout :D )


pareil [:sinclaire]
XMM, c'est tout ce que je sais ! je file chez Intel tiens
 
[:neowen]


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 02-04-2003 à 15:18:35    

aie, petite deception a l'horizon, je crois que le SSE c'est du float only [:spamafore]

Reply

Marsh Posté le 02-04-2003 à 15:25:03    

g un peu de bout de code SSE issu du moteur sur lequel je bosse si tu veux [:ddr555]

Reply

Marsh Posté le 02-04-2003 à 15:26:02    

vas y, poste ! moi je me paume chez Intel :fou:


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 02-04-2003 à 15:27:43    

Harkonnen a écrit :

vas y, poste ! moi je me paume chez Intel :fou:


 
content de te l'entendre dire :D :D
 
 
 

Code :
  1. ZGSVector4d* zgTransfVector4dSSE(ZGSVector4d*resVect , ZGSVector4d*inVect, ZGSMatrix4x4*mat , int count)
  2. {
  3.     //static float matriceNew[4*4];
  4.    
  5.     matriceNew[0].value[0] = mat->value[0];
  6.     matriceNew[0].value[0+4] = mat->value[0 + 4];
  7.     matriceNew[0].value[0+8] = mat->value[0 + 8];
  8.     matriceNew[0].value[0+12] = mat->value[0+12];
  9.     matriceNew[0].value[1] = mat->value[1 + 4];
  10.     matriceNew[0].value[1+4] = mat->value[1 + 8];
  11.     matriceNew[0].value[1+8] = mat->value[1 + 0];
  12.     matriceNew[0].value[1+12] = mat->value[1+12];
  13.     matriceNew[0].value[2] = mat->value[2 + 8];
  14.     matriceNew[0].value[2+4] = mat->value[2 + 0];
  15.     matriceNew[0].value[2+8] = mat->value[2 + 4];
  16.     matriceNew[0].value[2+12] = mat->value[2 + 12];
  17.     ZGSMatrix4x4* lpMat = *matriceNew;
  18.     int iPtr = (int)*matriceNew;
  19.     __asm
  20.     {
  21.         mov edi , inVect
  22.         mov esi , resVect
  23.         mov edx , iPtr
  24.         mov ecx , count
  25.         //mov ebx , -16
  26.         xor ebx,ebx
  27.        
  28.         boucle:
  29.             movaps xmm1 , [edi+ebx]
  30.            
  31.             movups xmm2 , [edi+ebx]
  32.             shufps xmm2 , xmm2 , 1 + (2<<2) + (0<<4) + 0
  33.             mulps xmm1 , [edx]
  34.             movups xmm3 , [edi+ebx]
  35.             shufps xmm3 , xmm3 , 2 + (0<<2) + (1<<4) + (1<<6)
  36.            
  37.             mulps xmm2 , [edx+16]
  38.             addps xmm1 , xmm2
  39.             mulps xmm3 , [edx+16*2]
  40.             addps xmm3 , [edx+16*3]
  41.             addps xmm1 , xmm3
  42.             movntps [esi+ebx] , xmm1
  43.          
  44.             add ebx,16
  45.             dec ecx
  46.         jnz boucle
  47.        
  48.         sfence
  49.     }
  50.     return resVect;
  51. }


 
 
m'en demande pas trop, le code est pas de moi :O


Message édité par chrisbk le 02-04-2003 à 15:28:35
Reply

Marsh Posté le 02-04-2003 à 15:31:48    

ça a l'air sympa :)
 
le principe est le meme que le MMX ? ie les registres sont divisés en b,w,dw ?
la saturation est gérée aussi ?


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 02-04-2003 à 15:33:53    

Harkonnen a écrit :

ça a l'air sympa :)
 
le principe est le meme que le MMX ? ie les registres sont divisés en b,w,dw ?
la saturation est gérée aussi ?


 
A mon avis, vu que c du float, t'as 4*32 et c'est tout. Donc tes pb de saturation, hein ? :D
me semble que certaines instructions fonctionne que si correctement alignee (je t'ai skippe le debut du fichier, mais newMatrix est une structure prenant garde a son alignement)
 
le reste, franchement, aucune idee  
 

Reply

Marsh Posté le 02-04-2003 à 15:34:29    

Reply

Marsh Posté le 02-04-2003 à 15:36:40    

Citation :

MOVNTPS stores data from a SIMD floating-point register to memory. The memory address must be aligned to a 16-byte boundary; if it is not aligned, a general protection exception will occur.


 
attention ca rigole pas [:ddr555]

Reply

Marsh Posté le 02-04-2003 à 16:04:37    


waw il a l'air génial ce site, hop dans mes favoris pour plus tard :whistle:
 
merci :jap:


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
Reply

Marsh Posté le 02-04-2003 à 16:32:53    

c sympa ce site :love:
tiens, je teste Quexal, ça a pas l'air mal :)


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 02-04-2003 à 16:35:40    

Harkonnen a écrit :

c sympa ce site :love:
tiens, je teste Quexal, ça a pas l'air mal :)


 
J'essayerais ce soir, si Dieu veuille bien que mon acces au net fonctionne enfin

Reply

Marsh Posté le 02-04-2003 à 16:38:04    

comme on a pollué le topic de vic [:ddr555]
 
d'un autre coté, s'il apprend l'asm, ça lui fera pas de mal de lire tout ça


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 02-04-2003 à 16:39:38    

Harkonnen a écrit :

comme on a pollué le topic de vic [:ddr555]
 
d'un autre coté, s'il apprend l'asm, ça lui fera pas de mal de lire tout ça


 
meuh non, au debut il parlait de MIMD et la on cause SIMD, finalement on est pas si loin que ca :D

Reply

Marsh Posté le 02-04-2003 à 16:46:42    

ça n'a pas été inutile, j'ai appris 2-3 trucs et j'apprendrai sûrement plus une fois que j'aurai exploré les possibilités de MMX et consorts ;)


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
Reply

Marsh Posté le 03-04-2003 à 13:48:40    

mais pourquoi chaque fois que chrisbk et harkonnen me répondent, je comprends rien du tout a ce qu'ils racontent ? :cry: :cry: :cry:
 
vous pouvez pas essayer de vous mettre à mon niveau les gars ? parce que j'ai rien compris du tout à vos explications :sweat:


---------------
Bougredane et bougre d'andouille ne font qu'un !
Reply

Marsh Posté le 03-04-2003 à 13:54:01    

laisse tomber la fin du topic (MMX & cie) et dis moi ce que tu n'as pas compris a mon post


Message édité par chrisbk le 03-04-2003 à 13:54:14
Reply

Marsh Posté le 03-04-2003 à 13:54:13    

vic le viking a écrit :

mais pourquoi chaque fois que chrisbk et harkonnen me répondent, je comprends rien du tout a ce qu'ils racontent ? :cry: :cry: :cry:
 
vous pouvez pas essayer de vous mettre à mon niveau les gars ? parce que j'ai rien compris du tout à vos explications :sweat:
 


commence pas à polluer le topic toi hein :non:


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 03-04-2003 à 13:56:08    

Harkonnen a écrit :


commence pas à polluer le topic toi hein :non:


 
[:ddr555]

Reply

Marsh Posté le 03-04-2003 à 13:56:22    

ben en fait, c'est quoi un pipeline ? et le mmx m'interesse aussi, mais j'arrive pas a compiler le code qu'harkonnen a donné


---------------
Bougredane et bougre d'andouille ne font qu'un !
Reply

Marsh Posté le 03-04-2003 à 13:59:26    

vic le viking a écrit :

ben en fait, c'est quoi un pipeline ? et le mmx m'interesse aussi, mais j'arrive pas a compiler le code qu'harkonnen a donné


 
 
bah pipeline = partie du CPU qui effectue les calculs (pour aller vite)
donc si t'as deux pipelines tu peux effectuer deux instructions en meme temps (on appelle ca une architecture superscalaire), a condition que les deux instructions soit parrallelisables.
 
Mes infos date du PI (entre tmps je sais pas trop ou ca en est), le P1 disposait pour les entier de deux pipelines (U/V)
U pouvait effectuer n'importe quelle operation tandis que V etait limité aux instructions simple(pas de mul/div par ex)

Reply

Marsh Posté le 03-04-2003 à 13:59:59    

t'utilises quel assembleur ? masm32 ? tasm ? nasm ?


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 03-04-2003 à 14:02:42    

chrisbk merci :jap:
harkonnen j'utilise masm32


---------------
Bougredane et bougre d'andouille ne font qu'un !
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed