Allocation pour FPU

Allocation pour FPU - Divers - Programmation

Marsh Posté le 01-09-2004 à 16:10:58    

Pour aller vite : j'ecris un compilo, et la partie compilation entiere est finie et a l'air de marcher, sauf pour div, parce que div ca pue, mais c'est pas le probleme. Le probleme, c'est les flottants. J'aurais un CPU un peu futé ca sera pas un pb, mais voila, j'ai comme bcp de monde un Intel, et la au lieu d'avoir des registres on a cette stupide pile a la con.
 
Question, donc : comment faire une allocation 'de registre' pour la FPU, en exploitant ses capacités et en sachant prendre en compte ses "defauts" (genre l'utilisation implicite de st(0)) ? Mon muchnick m'apprends que le compilo Intel fait comme si de rien n'etait (genre c'est des registres) et synchronise la pile au niveau des joint node. Perso j'ai du mal a voir comment faire ca proprement et comment cela peut generer un code pas trop momoche, sans fxch a tout va. (oui il se 'pair', mais quand meme)
 
Le pire la dedans, c'est que je pensais trouver de la doc en veux tu en voila sur le net, et en fait, que dalle. Quelqu'un a une idée ?

Reply

Marsh Posté le 01-09-2004 à 16:10:58   

Reply

Marsh Posté le 01-09-2004 à 17:07:05    

bon, d'accord, j'ai compris, jvais chercher une tof de famapoil pour egayer le topic, bougez pas [:petrus75]

Reply

Marsh Posté le 01-09-2004 à 17:07:52    

bienvenue au club des gens qui font des tomics qui n'interressent personne :heink:

Reply

Marsh Posté le 01-09-2004 à 17:10:15    

dommage que le CPU soit pas programmé en php, la j'aurais ptet eu des réponses [:petrus75]

Reply

Marsh Posté le 01-09-2004 à 17:11:11    

j'ai pensé pareil pour mes tomics IA, ImageMagick, bibliolinks imagerie, ordonnancement etc. etc. [:sisicaivrai]
nous sommes des incompris

Reply

Marsh Posté le 01-09-2004 à 17:12:16    

Nan, juste des Elitz au milieu d'un tas de No0bZ0R de l'info [:fande--]

Reply

Marsh Posté le 01-09-2004 à 17:12:52    

vous êtes l'31337 du forome, personne vous comprend...[:dawa]


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 01-09-2004 à 17:13:35    

c'est un peu ce que je dis, l4|\/|4h [:petrus75]

Reply

Marsh Posté le 01-09-2004 à 17:13:53    

c'est ta faute aussi, plus la question est pointue moins ya de gens qui répondent
 
c'est comme quand Taz pose une question, déjà faut se remettre de vous voir ne pas savoir un truc (non, c'est même pas du lèche bottisme) et après on réalise qu'on a tout juste compris la question :o
Alors pour y répondre :/
 
(tout ca pour dire que tu trouverais plus facilement ton bonheur sur les newsgroups avec ta question)


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 01-09-2004 à 17:25:23    

sinon je dirais, fais comme ton cpu, continue à jouer avec la pile en faisant "comme si" :??:

Reply

Marsh Posté le 01-09-2004 à 17:25:23   

Reply

Marsh Posté le 01-09-2004 à 17:28:58    

moktar1er a écrit :

sinon je dirais, fais comme ton cpu, continue à jouer avec la pile en faisant "comme si" :??:


 
Comment cela ?
 
Moi, je veux bien faire comme si, mais apres je risque d'avoir des trucs genre :
 

Code :
  1. fld st7, [eax + 20];


 
Qui sont assez incorrect dans le genre, et qui devront etre remplacé par
 

Code :
  1. fxch st7,
  2. fld [eax + 20];


 
et a la fin on a du spaghetti (surtout avec les synchros au niveau du joint) Sans compter qu'une pile c'est pas comme des regs, si on fait ca mal on se bouffe du stack overflow [:petrus75]
 
Enfin bon si intel fait comme ca, hein ? vais méditer quand meme un peu la dessus
 
 
 

Reply

Marsh Posté le 01-09-2004 à 17:31:00    

pour la synchro tu combles de nop à la va comme je te pousse [:spamafote]
(et [:neowen] aussi accessoirement)

Reply

Marsh Posté le 01-09-2004 à 17:38:21    

Si vous la voulez en anglais, lui il explique aussi tres bien  mon probleme [:petrus75]
 
http://groups.google.fr/groups?q=F [...] ers&rnum=2

Reply

Marsh Posté le 01-09-2004 à 17:57:55    

bon en fait j'y connait pas grand chose, mais a ce que j'avait lu, a partir des proc p6, le fxchg est totalement gratuit en cycles cpu car il est pris en charge par le renommeur de registres, la fpu n'étant plus réellement à pile. donc je vois pas le probleme d'en truffer le code.

Reply

Marsh Posté le 01-09-2004 à 17:58:14    

chrisbk a écrit :

Si vous la voulez en anglais, lui il explique aussi tres bien  mon probleme [:petrus75]
 
http://groups.google.fr/groups?q=F [...] ers&rnum=2


Citation :


 Seul article de ce fil


 
[:petrus75]


---------------
IVG en france
Reply

Marsh Posté le 01-09-2004 à 18:00:09    

gligli a écrit :

bon en fait j'y connait pas grand chose, mais a ce que j'avait lu, a partir des proc p6, le fxchg est totalement gratuit en cycles cpu car il est pris en charge par le renommeur de registres, la fpu n'étant plus réellement à pile. donc je vois pas le probleme d'en truffer le code.


 
ca me fend le coeur [:petrus75] Mais bon, va falloir s'y faire je crois, pis j'ai besoin du support float prestemment
 
uriel > oué j'ai vu, et vu que le thread date de 98 je pense que ca sert a rien de le surveiller [:petrus75]

Reply

Marsh Posté le 01-09-2004 à 18:00:57    

et dans les sources de gcc?

Reply

Marsh Posté le 01-09-2004 à 18:03:00    

moktar1er a écrit :

et dans les sources de gcc?


 
Bah, j'ai aussi celle de rotor, mais bon, pour s'y retrouver, bonjour.
GCC j'avais regardé un coup, pour la grammaire, j'avais l'impression d'etre devant de l'hébreux
 
enfin bon, jvais voir a faire du fxch, pis vala. La synchro me fait un brin peur [:petrus75]


Message édité par chrisbk le 01-09-2004 à 18:04:03
Reply

Marsh Posté le 01-09-2004 à 18:04:10    

tu nous raconteras hein [:mad_overclocker]

Reply

Marsh Posté le 01-09-2004 à 18:04:55    

moktar1er a écrit :

tu nous raconteras hein [:mad_overclocker]


 
chui devin, je peux te le faire des maintenant :
 


0x000000005


 
[:chrisbk]

Reply

Marsh Posté le 01-09-2004 à 18:10:05    

D'un ot coté, sans algo spécialisé FPU je peux pas utiliser les f*p, f*pp, ce qui est un peu balot ? (ou on demande au peephole de faire ca pour nous apres ? [:jean-guitou]

Reply

Marsh Posté le 01-09-2004 à 20:44:13    

bouge pas ...


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 01-09-2004 à 20:53:28    

... ok ....

Reply

Marsh Posté le 01-09-2004 à 20:59:30    

heu, tu peux bouger, mais garde un oeuil ....


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 01-09-2004 à 21:05:06    

ouf, je commencais a pu pouvoir me retenir... [:petrus75]


Message édité par chrisbk le 01-09-2004 à 21:05:19
Reply

Marsh Posté le 01-09-2004 à 21:06:08    

heuh ? [:petrus75]

Reply

Marsh Posté le 01-09-2004 à 21:07:43    


 [:neowen]


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 01-09-2004 à 21:09:49    

Code :
  1. | Lop(Iaddf | Isubf | Imulf | Idivf | Ispecific(Isubfrev | Idivfrev)
  2.           as floatop) ->
  3.         begin match (is_tos i.arg.(0), is_tos i.arg.(1)) with
  4.           (true, true) ->
  5.           (* both operands on top of FP stack *)
  6.           `     {emit_string(instr_for_floatop_pop floatop)}    %st, %st(1)\n`
  7.         | (true, false) ->
  8.           (* first operand on stack *)
  9.           `     {emit_string(instr_for_floatop floatop)}        {emit_reg i.arg.(1)}\n`
  10.         | (false, true) ->
  11.           (* second operand on stack *)
  12.           `     {emit_string(instr_for_floatop_reversed floatop)}       {emit_reg i.arg.(0)}\n`
  13.         | (false, false) ->
  14.           (* both operands in memory *)
  15.           `     fldl    {emit_reg i.arg.(0)}\n`;
  16.           `     {emit_string(instr_for_floatop floatop)}        {emit_reg i.arg.(1)}\n`
  17.         end


 
je vais chercher les bouts qui manquent (surtout ce qu'il s'est passé avant qu'on en arrive là) ...


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 01-09-2004 à 21:12:22    

ben surtout commen tu geres les joint-node avec ceci
(pis niveau qualité de code emis ? paske la tu fais un peu au coup par coup non ?)

Reply

Marsh Posté le 01-09-2004 à 21:19:29    

nraynaud a écrit :


je vais chercher les bouts qui manquent (surtout ce qu'il s'est passé avant qu'on en arrive là) ...


 
Marrant, j'ai eu la même idée (mais j'ai la flemme...).


---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
Reply

Marsh Posté le 01-09-2004 à 21:31:05    

chris> en fait, j'ai l'impression qu'il se prend pas la tête.
comme c'est un compilo où les floats sont boxés, il mise tout sur le unboxing plutôt que sur le code émis.
 
Je vais chercher une autre piste ...


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 01-09-2004 à 22:04:09    

ça me fait penser qu'il faudra que je regarde des docs sur la conception de compilateur, je me coucherai moins bête :/

Reply

Marsh Posté le 01-09-2004 à 22:07:09    

bjone a écrit :

ça me fait penser qu'il faudra que je regarde des docs sur la conception de compilateur, je me coucherai moins bête :/


 
par contre tu vas perdre tout tes amis, les filles te cracheront dessus dans la rue, ton poisson rouge se cachera au fond du bocal et les gamins te jetterons des pierres [:petrus75]
mais c'est toi qui voit [:petrus75]

Reply

Marsh Posté le 01-09-2004 à 22:13:56    

crisse >

Code :
  1. (* la formulation de kahan *)
  2. let kahan l =
  3.    let rec sum s c l = match l with
  4.      | [] -> s
  5.      | x::xs ->
  6.        let y = x -. c in
  7.        let t = s +. y in
  8.        sum t ((t -. s) -. y) xs
  9.    in
  10.    sum 0. 0. l;;
  11. (* créé une liste de n éléments ayant v pour valeur *)
  12. let lst v n =
  13.    let rec lst' l n = match n with
  14.      | 0 -> l
  15.      | n -> lst' (v::l) (n - 1)
  16.    in
  17.    lst' [] n;;
  18. let v:float = float_of_string Sys.argv.(1);;
  19. let f:float = kahan (lst v 10000);;
  20. print_float f;;


donne :
 

Code :
  1. nraynaud@macaron:~/hfr$ cat kahan.s
  2.         .data
  3.         .globl  _Kahan__data_begin
  4. _Kahan__data_begin:
  5.         .text
  6.         .globl  _Kahan__code_begin
  7. _Kahan__code_begin:
  8.         .data
  9.         .long   4096
  10.         .globl  _Kahan
  11. _Kahan:
  12.         .space  16
  13.         .data
  14.         .long   3319
  15. _Kahan__1:
  16.         .long   _caml_curry2
  17.         .long   5
  18.         .long   _Kahan__lst_67
  19.         .data
  20.         .long   2295
  21. _Kahan__2:
  22.         .long   _Kahan__kahan_57
  23.         .long   3
  24.         .data
  25.         .long   3319
  26. _Kahan__5:
  27.         .long   _caml_curry3
  28.         .long   7
  29.         .long   _Kahan__sum_59
  30.         .data
  31.         .long   2301
  32. _Kahan__3:
  33.         .double 0d0.
  34.         .data
  35.         .long   2301
  36. _Kahan__4:
  37.         .double 0d0.
  38.         .globl  _Kahan__sum_59
  39.         .text
  40.         .align  2
  41. _Kahan__sum_59:
  42.         mflr    r0
  43.         addi    r1, r1, -16
  44.         stw     r0, 12(r1)
  45. L101:
  46.         cmpwi   r5, 1
  47.         beq     L100
  48.         lwz     r8, 0(r5)
  49.         lfd     f8, 0(r4)
  50.         lfd     f7, 0(r8)
  51.         lfd     f5, 0(r3)
  52.         fsub    f6, f7, f8
  53.         fadd    f4, f5, f6
  54.         addi    r31, r31, -24
  55.         cmplw   r31, r30
  56.         addi    r7, r31, 4
  57. L103:   bltl    L102
  58.         li      r6, 2301
  59.         stw     r6, -4(r7)
  60.         li      r6, 2301
  61.         addi    r4, r7, 12
  62.         stfd    f4, 0(r7)
  63.         stw     r6, -4(r4)
  64.         lfd     f3, 0(r3)
  65.         mr      r3, r7
  66.         fsub    f2, f4, f3
  67.         fsub    f1, f2, f6
  68.         stfd    f1, 0(r4)
  69.         lwz     r5, 4(r5)
  70.         b       L101
  71. L100:
  72.         lwz     r11, 12(r1)
  73.         mtlr    r11
  74.         addi    r1, r1, 16
  75.         blr
  76. L102:
  77.         b       _caml_call_gc
  78.         .globl  _Kahan__lst$27_70
  79.         .text
  80.         .align  2
  81. _Kahan__lst$27_70:
  82.         mflr    r0
  83.         addi    r1, r1, -16
  84.         stw     r0, 12(r1)
  85. L105:
  86.         cmpwi   r4, 1
  87.         beq     L104
  88.         addi    r31, r31, -12
  89.         cmplw   r31, r30
  90.         addi    r7, r31, 4
  91. L107:   bltl    L106
  92.         li      r6, 2048
  93.         stw     r6, -4(r7)
  94.         lwz     r6, 12(r5)
  95.         addi    r4, r4, -2
  96.         stw     r6, 0(r7)
  97.         stw     r3, 4(r7)
  98.         mr      r3, r7
  99.         b       L105
  100. L104:
  101.         lwz     r11, 12(r1)
  102.         mtlr    r11
  103.         addi    r1, r1, 16
  104.         blr
  105. L106:
  106.         b       _caml_call_gc
  107.         .globl  _Kahan__kahan_57
  108.         .text
  109.         .align  2
  110. _Kahan__kahan_57:
  111. L108:
  112.         addis   r4, 0, ha16(_Kahan__4)
  113.         addi    r4, r4, lo16(_Kahan__4)
  114.         addis   r6, 0, ha16(_Kahan__5)
  115.         addi    r6, r6, lo16(_Kahan__5)
  116.         mr      r5, r3
  117.         addis   r3, 0, ha16(_Kahan__3)
  118.         addi    r3, r3, lo16(_Kahan__3)
  119.         b       _Kahan__sum_59
  120.         .globl  _Kahan__lst_67
  121.         .text
  122.         .align  2
  123. _Kahan__lst_67:
  124.         mflr    r0
  125.         addi    r1, r1, -16
  126.         stw     r0, 12(r1)
  127. L109:
  128.         addi    r31, r31, -20
  129.         cmplw   r31, r30
  130.         addi    r5, r31, 4
  131. L111:   bltl    L110
  132.         li      r6, 5
  133.         addis   r7, 0, ha16(_caml_curry2)
  134.         addi    r7, r7, lo16(_caml_curry2)
  135.         li      r8, 4343
  136.         stw     r8, -4(r5)
  137.         stw     r7, 0(r5)
  138.         stw     r6, 4(r5)
  139.         addis   r6, 0, ha16(_Kahan__lst$27_70)
  140.         addi    r6, r6, lo16(_Kahan__lst$27_70)
  141.         stw     r6, 8(r5)
  142.         stw     r3, 12(r5)
  143.         li      r3, 1
  144.         lwz     r11, 12(r1)
  145.         addi    r1, r1, 16
  146.         mtlr    r11
  147.         b       _Kahan__lst$27_70
  148. L110:
  149.         b       _caml_call_gc
  150.         .globl  _Kahan__entry
  151.         .text
  152.         .align  2
  153. _Kahan__entry:
  154.         mflr    r0
  155.         addi    r1, r1, -16
  156.         stw     r0, 12(r1)
  157. L112:
  158.         addis   r20, 0, ha16(_Kahan__2)
  159.         addi    r20, r20, lo16(_Kahan__2)
  160.         addis   r11, 0, ha16(_Kahan)
  161.         stw     r20, lo16(_Kahan)(r11)
  162.         addis   r19, 0, ha16(_Kahan__1)
  163.         addi    r19, r19, lo16(_Kahan__1)
  164.         addis   r11, 0, ha16(_Kahan+4)
  165.         stw     r19, lo16(_Kahan+4)(r11)
  166.         addis   r11, 0, ha16(_Sys)
  167.         lwz     r18, lo16(_Sys)(r11)
  168.         lwz     r17, -4(r18)
  169.         srwi    r16, r17, 9
  170.         twllei   r16, 3
  171.         lwz     r3, 4(r18)
  172.         addi    r1, r1, -64
  173.         addis   r11, 0, ha16(L_float_of_string$non_lazy_ptr)
  174.         lwz     r11, lo16(L_float_of_string$non_lazy_ptr)(r11)
  175. L113:   bl      _caml_c_call
  176.         addi    r1, r1, 64
  177.         addis   r11, 0, ha16(_Kahan+8)
  178.         stw     r3, lo16(_Kahan+8)(r11)
  179.         li      r4, 20001
  180.         addis   r11, 0, ha16(_Kahan+8)
  181.         lwz     r3, lo16(_Kahan+8)(r11)
  182. L114:   bl      _Kahan__lst_67
  183. L115:   bl      _Kahan__kahan_57
  184.         addis   r11, 0, ha16(_Kahan+12)
  185.         stw     r3, lo16(_Kahan+12)(r11)
  186.         addis   r11, 0, ha16(_Kahan+12)
  187.         lwz     r3, lo16(_Kahan+12)(r11)
  188. L116:   bl      _Pervasives__string_of_float_163
  189.         mr      r4, r3
  190.         addis   r11, 0, ha16(_Pervasives+92)
  191.         lwz     r3, lo16(_Pervasives+92)(r11)
  192. L117:   bl      _Pervasives__output_string_214
  193.         li      r3, 1
  194.         lwz     r11, 12(r1)
  195.         mtlr    r11
  196.         addi    r1, r1, 16
  197.         blr
  198.         .non_lazy_symbol_pointer
  199. L_float_of_string$non_lazy_ptr:
  200.         .indirect_symbol _float_of_string
  201.         .long   0
  202.         .text
  203.         .globl  _Kahan__code_end
  204. _Kahan__code_end:
  205.         .data
  206.         .globl  _Kahan__data_end
  207. _Kahan__data_end:
  208.         .long   0
  209.         .const
  210.         .globl  _Kahan__frametable
  211. _Kahan__frametable:
  212.         .long   8
  213.         .long   L117 + 4
  214.         .short  16
  215.         .short  0
  216.         .align  2
  217.         .long   L116 + 4
  218.         .short  16
  219.         .short  0
  220.         .align  2
  221.         .long   L115 + 4
  222.         .short  16
  223.         .short  0
  224.         .align  2
  225.         .long   L114 + 4
  226.         .short  16
  227.         .short  0
  228.         .align  2
  229.         .long   L113 + 4
  230.         .short  80
  231.         .short  0
  232.         .align  2
  233.         .long   L111 + 4
  234.         .short  16
  235.         .short  2
  236.         .short  3
  237.         .short  1
  238.         .align  2
  239.         .long   L107 + 4
  240.         .short  16
  241.         .short  3
  242.         .short  5
  243.         .short  3
  244.         .short  1
  245.         .align  2
  246.         .long   L103 + 4
  247.         .short  16
  248.         .short  2
  249.         .short  5
  250.         .short  1
  251.         .align  2


 
ça te parraît optimisé ? sinon, pas la peine de se prendre la tête.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 01-09-2004 à 22:15:27    

# fsub    f6, f7, f8
# fadd    f4, f5, f6
 
ca a surtout une drole de gueule, cela dit je cherche pas le code parfait (j'en suis loin), je voudrais surtout dans un premier tps du truc fonctionnel


Message édité par chrisbk le 01-09-2004 à 22:18:00
Reply

Marsh Posté le 01-09-2004 à 22:25:36    

chrisbk a écrit :

# fsub    f6, f7, f8
# fadd    f4, f5, f6
 
ca a surtout une drole de gueule

MOAHAHAHAHHAHAHA LE BOOLAY TOTAL !!!!!
 
 
/o\ je suis sur le mac, d'où le code à 3 adresses /o\
 
 
désolé. pas pensé, exploration d'un générateur de code natif tout en lisant une thèse sur un Gc hybride, fatigue, tout ça /o\


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 01-09-2004 à 22:30:07    

Ben paske avec 3 adresses (voir meme 2), hein, un bon graph coloring et voila. Par contre une pile de mairde .. [:petrus75]

Reply

Marsh Posté le 01-09-2004 à 22:57:54    

Tu peux aussi regarder le classique Aho/Sethi/Ullman dont le gen. de code suppose une organisation "en pile" des reg. Exactement comme les st() de x86.

Reply

Marsh Posté le 01-09-2004 à 23:01:21    

j'imagine qu'il n'y a pas de version en ligne de l'article nous interessant ici ?

Reply

Marsh Posté le 01-09-2004 à 23:19:41    

Ben, l'algo est vieux (~75) et p-e chez citeseer.
Sinon, http://www.cs.umd.edu/class/spring [...] c14.2p.pdf
semble vaguement du meme tonneau.

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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