Page 1 sur 1
Optimisation d'un code PB en ASM
Publié : lun. 01/août/2022 11:34
par SPH
Salut à tous (et particulièrement a Manababel),
Y aurait il un code assembleur pouvant booster cette partie d'un code ? :
Code : Tout sélectionner
quad_hazard.q=octets1(x)+octets1(x+1)*256+octets1(x+2)*65536+octets1(x+3)*16777216+octets1(x+4)*4294967296+octets1(x+5)*1099511627776+octets1(x+6)*281474976710656+octets1(x+7)*72057594037927936
x=Random(Len(sph$))+1
quad_hazard.q!octets2(x)+octets2(x+1)*256+octets2(x+2)*65536+octets2(x+3)*16777216+octets2(x+4)*4294967296+octets2(x+5)*1099511627776+octets2(x+6)*281474976710656+octets2(x+7)*72057594037927936
Et cette partie aussi :
Code : Tout sélectionner
tableau(a)!quad_hazard
q=Random(65536*32768-1)+cent(Random(100))
q*Random(65536*32768-1)*vingt(Random(20)+1)
q*Random(65536*32768-1)+vingt(Random(20)+1)
q+Random(65536*32768-1)+cent(Random(100))
tableau(a)!q
Merci

Re: Optimisation d'un code PB en ASM
Publié : mar. 02/août/2022 12:24
par manababel
Bonjour SPH ,
ca ne me pose pas de probleme pour vous aider.
mais je ne comprends pas ce que vous voulez faire.
pouvez vous poster un autre code que je puisse compiler.
Dans le premier code posté , si c'est des nombre entriers , utilisez plutot le decalage de bits que la multiplication ( x<<8 = x*256 )
Dans le deuxieme code essayé d'utilisez un minimum de ramdom , si c,'est posible .
Re: Optimisation d'un code PB en ASM
Publié : mar. 02/août/2022 18:17
par manababel
voici comment je traduirais la ligne :
quad_hazard.q=octets1(x)+octets1(x+1)*256+octets1(x+2)*65536+octets1(x+3)*16777216+octets1(x+4)*4294967296+octets1(x+5)*1099511627776+octets1(x+6)*281474976710656+octets1(x+7)*72057594037927936
par :
Dim octets1.q(999)
x.q=0
pointer.q = @octets1()
!mov rax,[v_x]
!shl rax,3
!add rax,[v_pointer]
!movq xmm0,[rax+0*0]
!movq xmm1,[rax+1*8]
!psllq xmm1,8 ; * 256
!movq xmm2,[rax+2*8]
!psllq xmm2,16 ; * 65536
!movq xmm3,[rax+3*8]
!psllq xmm3,24 ; ...
!movq xmm4,[rax+4*8]
!psllq xmm4,32
!movq xmm5,[rax+5*8]
!psllq xmm5,40
!movq xmm6,[rax+6*8]
!psllq xmm6,48
!movq xmm7,[rax+7*8]
!psllq xmm7,64
!paddq xmm0,xmm1
!paddq xmm0,xmm2
!paddq xmm0,xmm3
!paddq xmm0,xmm4
!paddq xmm0,xmm5
!paddq xmm0,xmm6
!paddq xmm0,xmm7
!movq [v_quad_hazard],xmm0
Re: Optimisation d'un code PB en ASM
Publié : mer. 03/août/2022 14:05
par SPH
Merci, je regarde ça !

Re: Optimisation d'un code PB en ASM
Publié : mer. 03/août/2022 14:25
par SPH
Bon, j'ai mis bout à bout mon code et le tiens.
Ca n'affiche pas les mêmes valeurs...
Code : Tout sélectionner
Dim octets1.w(100)
For i=0 To 100
octets1.w(i)=Random(65535)
Next
x=0
quad_hazard.q=octets1(x)+octets1(x+1)*256+octets1(x+2)*65536+octets1(x+3)*16777216+octets1(x+4)*4294967296+octets1(x+5)*1099511627776+octets1(x+6)*281474976710656+octets1(x+7)*72057594037927936
Debug quad_hazard
;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;
pointer.q = @octets1()
!mov rax,[v_x]
!shl rax,3
!add rax,[v_pointer]
!movq xmm0,[rax+0*0]
!movq xmm1,[rax+1*8]
!psllq xmm1,8 ; * 256
!movq xmm2,[rax+2*8]
!psllq xmm2,16 ; * 65536
!movq xmm3,[rax+3*8]
!psllq xmm3,24 ; ...
!movq xmm4,[rax+4*8]
!psllq xmm4,32
!movq xmm5,[rax+5*8]
!psllq xmm5,40
!movq xmm6,[rax+6*8]
!psllq xmm6,48
!movq xmm7,[rax+7*8]
!psllq xmm7,64
!paddq xmm0,xmm1
!paddq xmm0,xmm2
!paddq xmm0,xmm3
!paddq xmm0,xmm4
!paddq xmm0,xmm5
!paddq xmm0,xmm6
!paddq xmm0,xmm7
!movq [v_quad_hazard],xmm0
;quad_hazard.q=octets1(x)+octets1(x+1)*256+octets1(x+2)*65536
Debug quad_hazard
Par contre, en utilisant "<<", ça marche (et c'est en effet plus rapide) :
Code : Tout sélectionner
Dim octets1.w(100)
For i=0 To 100
octets1.w(i)=Random(65535)
Next
x=0
quad_hazard.q=octets1(x)+octets1(x+1)*256+octets1(x+2)*65536+octets1(x+3)*16777216+octets1(x+4)*4294967296+octets1(x+5)*1099511627776+octets1(x+6)*281474976710656+octets1(x+7)*72057594037927936
Debug quad_hazard
;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;
quad_hazard.q=octets1(x)+octets1(x+1)<<8+octets1(x+2)<<16+octets1(x+3)<<24+octets1(x+4)<<32+octets1(x+5)<<40+octets1(x+6)<<48+octets1(x+7)<<56
Debug quad_hazard
Re: Optimisation d'un code PB en ASM
Publié : mer. 03/août/2022 19:23
par manababel
Voici une version optimisée , mais le gain est insignifiant.
Code : Tout sélectionner
Dim octets1.u(100)
For i=0 To 100
octets1(i)=Random(65535)
Next
x=0
quad_hazard.q=octets1(x)+octets1(x+1)<<8+octets1(x+2)<<16+octets1(x+3)<<24+octets1(x+4)<<32+octets1(x+5)<<40+octets1(x+6)<<48+octets1(x+7)<<56
Debug quad_hazard
pointer.q = @octets1()
!mov rax,[v_x]
!shl rax,1
!add rax,[v_pointer]
!pxor xmm0,xmm0
!pxor xmm1,xmm1
!pxor xmm2,xmm2
!pxor xmm3,xmm3
!pinsrw xmm0,[rax+00],0
!pinsrw xmm1,[rax+02],0
!psllq xmm1,8
!pinsrw xmm0,[rax+04],1
!pinsrw xmm2,[rax+06],0
!psllq xmm2,24
!pinsrw xmm0,[rax+08],2
!pinsrw xmm3,[rax+10],0
!psllq xmm3,40
!paddq xmm0,xmm1
!paddq xmm0,xmm2
!pxor xmm1,xmm1
!pinsrw xmm0,[rax+12],3
!pinsrw xmm1,[rax+14],0
!psllq xmm1,56
!paddq xmm0,xmm3
!paddq xmm0,xmm1
!movq [v_quad_hazard],xmm0
Debug quad_hazard
Re: Optimisation d'un code PB en ASM
Publié : mer. 03/août/2022 19:32
par manababel
pour la partie avec les "random"
si possible , utiliser cette commande un minimum de fois ( je me répète )
et/ou utiliser un "custom random", il exit une version rapide avec "XOR" au lieu de "MOD"
mais c'est plus délicat à mètre en œuvre.
Re: Optimisation d'un code PB en ASM
Publié : mer. 03/août/2022 20:04
par SPH
C'est quoi un dim ".u" ? même taille qu'un ".w" ?
pour les randoms, je sais mais je n'ai pas le choix

Re: Optimisation d'un code PB en ASM
Publié : mer. 03/août/2022 21:24
par case
.u unsigned ?
Re: Optimisation d'un code PB en ASM
Publié : mer. 03/août/2022 21:46
par SPH
Je regarderais demain sur mon autre ordi mais j'utilise des :
Je pense que les ".u" ne seront pas compatibles...

Re: Optimisation d'un code PB en ASM
Publié : jeu. 04/août/2022 6:15
par manababel
.u = unsigned
u => 0 à 655535
w => -32768 à 32767
je regard si je peux le rendre compatible .w
Re: Optimisation d'un code PB en ASM
Publié : jeu. 04/août/2022 7:56
par SPH
manababel a écrit : jeu. 04/août/2022 6:15
.u = unsigned
u => 0 à 655535
w => -32768 à 32767
je regard si je peux le rendre compatible .w
Je ne savais pas que ".u" pouvait etre renseigner dans PB (contrairement a l'asm).
Merci pour ton essai de compatibilité ".w"

Re: Optimisation d'un code PB en ASM
Publié : jeu. 04/août/2022 20:18
par manababel
Tel quelle, je ne pense pas pouvoir optimise le code en Asm, PB fait très bien son travail
voici le code que PB crée
Code : Tout sélectionner
Dim octets1.w(100)
pointer.q = @octets1()
var.q = 0
For i=0 To 100
octets1(i)=Random(65535)
Next
x=0
quad_hazard.q = octets1(x+0) +octets1(x+1)<<8+octets1(x+2)<<16+octets1(x+3)<<24+octets1(x+4)<<32+octets1(x+5)<<40+octets1(x+6)<<48+octets1(x+7)<<56
Debug quad_hazard
!mov rax,[v_x]
!shl rax,1
!add rax,[v_pointer]
!movsx r8, word[rax+00]
!movsx r9, word[rax+02]
!shl r9,8
!add r8,r9
!movsx r9, word[rax+04]
!shl r9,16
!add r8,r9
!movsx r9, word[rax+06]
!shl r9,24
!add r8,r9
!movsx r9, word[rax+08]
!shl r9,32
!add r8,r9
!movsx r9, word[rax+10]
!shl r9,40
!add r8,r9
!movsx r9, word[rax+12]
!shl r9,48
!add r8,r9
!movsx r9, word[rax+14]
!shl r9,56
!add r8,r9
!mov [v_quad_hazard],r8
Debug quad_hazard
le mnémonique "MOVSX" permet de convertir un "word signé"(16bits) en un "quad signé"(64bits) . ( dans le prog ci-dessus )
il n'y a pas d’équivalent dans les "simd".
Re: Optimisation d'un code PB en ASM
Publié : jeu. 04/août/2022 22:45
par SPH
Grand merci manababel,
j'en ai appris des trucs avec ce post !
Pour la peine, je vais refaire un troisieme crypteur
ThX a LoT
Re: Optimisation d'un code PB en ASM
Publié : lun. 15/août/2022 13:43
par Ollivier
Petite remarque : il me semble que les multiplication et division entières par puissances de 2 sont optimisées.
x.i * 2 ; <=> x.i << 1