elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado:


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  ASM (Moderador: Eternal Idol)
| | | |-+  Rotar en registros XMM
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 [2] Ir Abajo Respuesta Imprimir
Autor Tema: Rotar en registros XMM  (Leído 12,892 veces)
xv0


Desconectado Desconectado

Mensajes: 1.027



Ver Perfil
Re: Rotar en registros XMM
« Respuesta #10 en: 29 Octubre 2013, 05:03 am »

De momento no soy capaz de hacer nada estoy bloqueado, he estado mirando la instruccion punpckhw y de momento nada, tambien podria mirar de hacerla con xors, cualquier ayuda es bienvenida.

Solo optimize una la mas facil claro, rotword.

Código
  1. pshuflw $0xb1, %xmm0, %xmm0
  2. pshufhw $0xb1, %xmm0, %xmm0

Le saque bastante en diferencia a la del codigo no?

Un saludo.


En línea

Karcrack


Desconectado Desconectado

Mensajes: 2.416


Se siente observado ¬¬'


Ver Perfil
Re: Rotar en registros XMM
« Respuesta #11 en: 29 Octubre 2013, 09:24 am »

He leído de un ingeniero de Intel que no hay forma fácil de hacer ror/rol desde SSE ya que no está diseñado en la arquitectura y la forma que he visto recomendada es la de hacer una máscara or duplicando el registro, usando shift sin rotación... Exactamente lo que hacías en un inicio.

Cuando acabes de hacerlo para SSE hazlo para CUDA jaja :P


En línea

xv0


Desconectado Desconectado

Mensajes: 1.027



Ver Perfil
Re: Rotar en registros XMM
« Respuesta #12 en: 29 Octubre 2013, 19:47 pm »

Si ya tengo una idea de como hacerlo con shift, pero entendi mal shiftrows no funciona de la manera que lo explique, bueno cuando tenga el codigo ya veras.

Bueno y sobre la funcion rotword creo que me quedo bastante mejor, este es del codigo de exemplo.

Código:
k = temp[0];
temp[0] = temp[1];
temp[1] = temp[2];
temp[2] = temp[3];
temp[3] = k;

Y este ejemplo lo saque de unos de los pdf de intel.

Código:
RotWord(X) = (X >> 8) | (X << 24)

Y solo rotan uno, yo con esas dos instrucciones todos y sin usar direcciones de memoria, le saco bastante, pero bueno es la mas facil que hay jeje.

Cuando acabes de hacerlo para SSE hazlo para CUDA jaja :P

jajaja pero en realidad seria bueno hacerlo, se desperdicia mucha potencia de las tarjetas graficas, ejemplo mi HD 5870 tiene unos 2,7 TeraFlops, y sin contar los modelos nuevos que comercializaron Nvidia y AMD. Tesla FireGL...

Un saludo.

Edito:

Se rota un byte en rotword, tendre que corregirlo.



Como te prometi aqui tienes el codigo. Esta programado con la extension SSE2 asi que es bastante compatible con mas CPU's.

La funcion son unos 158 bytes seguro que no es una buena funcion para tus bichos jaja, bueno tambien mire que OPS y latencias podria consumir, lei unos documentos de Agner Fog que explicaba los OPS y las latencias que consumia cada instruccion de la CPU especifica. Tengo un K10 segun ese documento son unos 34 OPS y unas 77 Latencias, es lo que me importa, de verdad como lo ves?

Si quieres posteo el dissasembler de la funcion del codigo en C++, y me dices si esta implementacion es mas rapida.

Bueno aqui el codigo.

Código
  1. movdqa %xmm0, %xmm1
  2. movdqa %xmm0, %xmm2
  3. movdqa %xmm0, %xmm3
  4. movdqa %xmm0, %xmm4
  5. movdqa %xmm0, %xmm5
  6. movdqa %xmm0, %xmm6
  7. pslld $0x18, %xmm0
  8. psrld $0x18, %xmm0
  9. pslldq $0x4, %xmm1
  10. psrld $0x18, %xmm1
  11. pslld $0x18, %xmm1
  12. psrld $0x18, %xmm2
  13. psrldq $0x9, %xmm2
  14. psrlw $0x8, %xmm3
  15. psllw $0x8, %xmm3
  16. pslld $0x8, %xmm3
  17. psrldq $0x5, %xmm3
  18. psllw $0x8, %xmm4
  19. psrlw $0x8, %xmm4
  20. psrld $0x10, %xmm4
  21. pslldq $0xa, %xmm4
  22. psllw $0x8, %xmm5
  23. psrlw $0x8, %xmm5
  24. psrld $0x10, %xmm5
  25. psrldq $0x6, %xmm5
  26. psrlw $0x8, %xmm6
  27. pslld $0x10, %xmm6
  28. pslldq $0xb, %xmm6
  29. pxor %xmm1, %xmm0
  30. pxor %xmm2, %xmm0
  31. pxor %xmm3, %xmm0
  32. pxor %xmm4, %xmm0
  33. pxor %xmm5, %xmm0
  34. pxor %xmm6, %xmm0

Seguro que se puede mejorar algo, pero de momento paso.

Bueno hilo solucionado, y cualquier mejora sobre el codigo pues bienvenida.

Un saludo y siento el doble post.



Bueno, aqui les dejo la optimizacion, el anterior codigo parece una p**a chapuza al lado de este, esta 100% escrito por mi, lo sorprendente es que no vi ninguna implementacion en SSE2 para este tipo de funcion solo en SSSE3.

OPS 13 & Latencia 30.5 en un K10.

Código
  1. .section .data
  2.  
  3. sldw:
  4. .quad 0x000000ff000000ff,0x000000ff000000ff
  5. slw:
  6. .quad 0x0000ff000000ff00,0x0000ff000000ff00
  7. shw:
  8. .quad 0x00ff000000ff0000,0x00ff000000ff0000
  9. shdw:
  10. .quad 0xff000000ff000000,0xff000000ff000000
  11.  
  12. .section .text
  13. .globl _start
  14.  
  15. _start:
  16.  
  17. movdqa %xmm0, %xmm1
  18. movdqa %xmm1, %xmm2
  19. movdqa %xmm2, %xmm3
  20. andpd sldw, %xmm0
  21. andpd slw, %xmm1
  22. pshufd $0x39, %xmm1, %xmm1
  23. pxor %xmm1, %xmm0
  24. andpd shw, %xmm2
  25. pshufd $0x4e, %xmm2, %xmm2
  26. pxor %xmm2, %xmm0
  27. andpd shdw, %xmm3
  28. pshufd $0x93, %xmm3, %xmm3
  29. pxor %xmm3, %xmm0

En xmm0 es donde esta la matriz logico.

Un saludo.
« Última modificación: 12 Noviembre 2013, 14:15 pm por Eternal Idol » En línea

Karcrack


Desconectado Desconectado

Mensajes: 2.416


Se siente observado ¬¬'


Ver Perfil
Re: Rotar en registros XMM
« Respuesta #13 en: 12 Noviembre 2013, 14:17 pm »

Menudo cambio :D Todavía tengo que analizar ese código para ver que hace :laugh: Cuantos bytes ocupa con la lookup table esa?
En línea

xv0


Desconectado Desconectado

Mensajes: 1.027



Ver Perfil
Re: Rotar en registros XMM
« Respuesta #14 en: 12 Noviembre 2013, 17:07 pm »

El code son unos 75 bytes mas la tabla son unos 139 bytes algo se bajo, pero no es el peso si no la optimizacion, le saco el doble por lo menos, y ya no te digo lo que le saco a la de C++ jeje.

Bueno creo que esta bastante bien, ahora tengo que ir a por otra ya tengo shiftrows y rotword, ya las ire publicando en el subforo de criptografia que es el sitio mas indicado.

Y sobre el peso, creo que cuando lo tenga todo acabado no pasara de 1.3kB, ya dije anteriormente para que lo queria, tampoco pesa tanto no?

Un saludo.
En línea

Karcrack


Desconectado Desconectado

Mensajes: 2.416


Se siente observado ¬¬'


Ver Perfil
Re: Rotar en registros XMM
« Respuesta #15 en: 13 Noviembre 2013, 08:55 am »

El peso es algo anecdótico teniendo en cuenta que tú buscabas velocidad ^^
En línea

xv0


Desconectado Desconectado

Mensajes: 1.027



Ver Perfil
Re: Rotar en registros XMM
« Respuesta #16 en: 13 Noviembre 2013, 10:46 am »

Bueno, le baje el peso en 10 bytes ahora son 129 bytes, simplemente copie la direccion a un registro de general purpose rsi creo que es el mejor para ese trabajo y quedo de esta forma, segun el manual que estoy leyendo mover una constante a un registro son 1 ops y 1 latencia, asi que se queda al final en 14 OPS & 31.5 Latencias, por 10 bytes creo que esta bien.

Código
  1. .section .data
  2.  
  3. sldw:
  4. .quad 0x000000ff000000ff,0x000000ff000000ff
  5. slw:
  6. .quad 0x0000ff000000ff00,0x0000ff000000ff00
  7. shw:
  8. .quad 0x00ff000000ff0000,0x00ff000000ff0000
  9. shdw:
  10. .quad 0xff000000ff000000,0xff000000ff000000
  11.  
  12. .section .text
  13. .globl _start
  14.  
  15. _start:
  16.  
  17. movq $sldw, %rsi
  18. movdqa %xmm0, %xmm1
  19. movdqa %xmm1, %xmm2
  20. movdqa %xmm2, %xmm3
  21. andpd (%rsi), %xmm0
  22. andpd 16(%rsi), %xmm1
  23. pshufd $0x39, %xmm1, %xmm1
  24. pxor %xmm1, %xmm0
  25. andpd 32(%rsi), %xmm2
  26. pshufd $0x4e, %xmm2, %xmm2
  27. pxor %xmm2, %xmm0
  28. andpd 48(%rsi), %xmm3
  29. pshufd $0x93, %xmm3, %xmm3
  30. pxor %xmm3, %xmm0

Si alguien quiere probarlo que mueva la matriz de 4 x 4 a xmm0, aqui se da por sentado de que ya esta, cualquier pregunta o duda pues ya saben, bueno no me enrrollo mas y ahora si que doy el tema por cerrado.

Un saludo.
En línea

Páginas: 1 [2] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
rotar video
Multimedia
ostkapi 2 2,285 Último mensaje 9 Mayo 2005, 10:07 am
por ostkapi
Rotar video
Multimedia
4aicampo 5 13,348 Último mensaje 22 Diciembre 2006, 14:50 pm
por Songoku
Rotar Video
Multimedia
JS11 3 3,978 Último mensaje 1 Junio 2009, 16:35 pm
por JS11
[Registros] existe algún registro para Outlook en los registros de windows?
Windows
moikano→@ 5 7,433 Último mensaje 14 Febrero 2011, 14:56 pm
por dantemc
rotar div
Desarrollo Web
basickdagger 1 2,373 Último mensaje 14 Junio 2013, 22:31 pm
por engel lex
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines