Page 1 sur 1

Grosse perte de perf... PB -> ASM

Publié : dim. 03/janv./2010 1:11
par ker2x
Code PB :

Code : Tout sélectionner

x0 = (complexWidth * i / screenSize - (complexWidth/2.0))
Code ASM généré par PB :

Code : Tout sélectionner

; x0 = (complexWidth * i / screenSize - (complexWidth/2.0))
	FLD	 qword [v_complexWidth]
	FIMUL	 dword [v_i]
	MOVZX	 eax,word [v_screenSize]
	MOV	 dword [rsp-4], eax
	FIDIV	 dword [rsp-4]
	FLD	 qword [v_complexWidth]
	FDIV	 qword [D3]
	FSUBP	 st1,st0
	FADD	 qword [D4]
	FSTP	 qword [v_x0]

Mon code a moi :

Code : Tout sélectionner

    EnableASM
      FLD complexWidth  ; st0 = complexWidth 
      FIMUL i           ; st0 = complexWidth * i 
      FIDIV screenSize  ; st0 = complexWidth * i / screenSize 
      FLD complexWidth  ; st0 = complexWidth ; st1 = complexWidth * i / screenSize
      FLD1              ; st0 = 1 ; st1 = complexWidth ; st2 = complexWidth * i / screenSize
      FLD1              ; st0 = 1 ; st1 = 1 ; st2 = complexWidth ; st3 = complexWidth * i / screenSize
      FADDP             ; st0 = 2 ; st1 = complexWidth ; st2 = complexWidth * i / screenSize
      FDIVP             ; st0 = complexWidth / 2 ; st1 = complexWidth * i / screenSize
      FSUBP             ; st0 = complexWidth * i / screenSize - complexWidth / 2
      FSTP x0
    DisableASM
La perte en performance en utilisant mon code ASM est abyssale.
Ce n'est pas la partie la plus critique du code et je perd plus de 20% en performance

J'ai merdé ou ?
La difference entre les 2 code ne me semble pourtant pas monstrueuse...

Re: Grosse perte de perf... PB -> ASM

Publié : dim. 03/janv./2010 14:09
par djes
En effet, ton code ne devrait pas être plus lent. Par contre, si je peux donner mon avis, ces calculs sont inutiles, tu pourrais les faire une fois pour toutes au début de ton code et en utiliser le résultat tout fait.

Re: Grosse perte de perf... PB -> ASM

Publié : dim. 03/janv./2010 15:14
par ker2x
j'ai deplacé una partie du code ailleur et je n'ai plus ce probleme.
Mais je ne comprend quand meme pas autant de perte de perf.

Je suis en train de virer toutes les instructions de la fpu pour faire du MMX/SSE :)

Ca avance, ca avance ... d'ailleur cette partie la est devenue :

Code : Tout sélectionner

  MOVQ     xmm2, qword [v_complexWidth]
  MOVZX    eax, word [v_i]
  CVTSI2SD xmm3, eax
  MULSD    xmm2, xmm3
  MOVZX    eax, word [v_screenSize]
  CVTSI2SD xmm4, eax
  DIVSD    xmm2, xmm4
  SUBSD    xmm2, qword [v_complexWidthBy2]
  MOVQ     qword [v_x0], xmm2
Pas optimal mais ca marche. Une fois que j'aurai fini de tout passé en instruction SSE, j'optimiserai pour tirer avantage des "packed" instructions et mieux utiliser les registres pour eviter tout ces MOV. Mais faut d'abord que je recode avant d'optimiser l'utilisation des registres :)

Il y a largement assez de registres pour arreter tout ces MOV dans tous les sens.

Re: Grosse perte de perf... PB -> ASM

Publié : dim. 03/janv./2010 15:26
par djes
Oui, maintenant, faut pas se priver :)
Je ne suis d'ailleurs plus trop au courant des instructions spécifiques AMD/Intel; A priori, le SSE2 devrait être compatible partout, par contre le SSE3 SSSE3 etc vaut mieux éviter ; à moins de faire un test en début de code. Y'a ça pour savoir : http://www.nasm.us/doc/nasmdocb.html

Re: Grosse perte de perf... PB -> ASM

Publié : lun. 04/janv./2010 6:50
par ker2x
Pour l'instant j'ai multiplié la vitesse du code par 4 :)

Re: Grosse perte de perf... PB -> ASM

Publié : lun. 04/janv./2010 11:19
par djes
Rien que ça :D

Re: Grosse perte de perf... PB -> ASM

Publié : ven. 13/nov./2015 15:10
par ker2x
5ans plus tard j'ai perdu mon code source et j'arrive pas a relire le peu que j'ai pu poster.

Serieux. j'ai codé ca moi ? Je suis jaloux de mon moi d'il y a 5ans. 8O

Re: Grosse perte de perf... PB -> ASM

Publié : ven. 13/nov./2015 16:22
par djes
Tu sais il y en a ici qui ont travaillé avec des cartes perforées... :mrgreen: