Autor
|
Tema: Instrucciones 64-bit vs. Instrucciones Avanzadas (SSE, SSE2, SSE3, SSE4, AVX) (Leído 7,529 veces)
|
Fly_NighT
Desconectado
Mensajes: 4
|
Hola, soy nuevo en el foro, pero afortunadamente no soy tan novato con el tema de ensamblador. Programo por lo general en FASM, y mi procesador (i3-2310M) soporta hasta las instrucciones AVX (no soporta AVX2).
Debo hacer una aplicación que computa operaciones elementales con números enteros (no flotantes) lo suficientemente grandes como para que no entren en un resgistro de 64-bits. Por lo general, estos números enteros me suelen ocupar entre 1024-bits y 128-bits. Para computar las operaciones (suma, resta, multiplicación - NO división) me vi en la necesidad de aplicar las operaciones considerando cada número entero (de 128 a 1024) como un paquete de datos de 64-bits cada uno. Por ejemplo, en la suma, si tengo dos números de 1024-bits, tomo los primeros 64-bits de cada uno y los sumo. Luego vuelvo a hacer lo mismo con el segundo paquete de 64-bits de cada uno, sin olvidar sumarle el carry de la operación anterior, y así sucesivamente.
Mi problema radica en la velocidad de ejecución cuando debo hacer varios cálculos, ya que la cuestión empieza a hacerse lenta. Mironeando por ahí, encontré que las instrucciones SSE (1,2,3 o 4) y las instrucciones AVX permiten manejar registros de tamaño más grandes (128-bit y 256-bit creo, respectivamente, por lo que he leído), lo cuál probablemente haría más rápidas las ejecuciones y los cálculos. El tema es que desconozco cuál es la diferencia entre cada set de instrucciones, y cuáles de todos ellos "podría solventar" mi problema, o si en el peor de los casos, aplicar estas instrucciones empeoraría el rendimiento.
¡Les agradezco de antemano todas las respuestas!
|
|
|
En línea
|
|
|
|
|
Fly_NighT
Desconectado
Mensajes: 4
|
Podrias mirar esto: clickExcelente aporte. Aunque la parte de 64 bits ya la tengo implementada (incluso para operaciones entre números de 1024 bits) es interesante dejar el link. Me habría ahorrado horas de trabajo.. ESTO resuelve en parte mi problema. El listado de instrucciones para enteros de las instrucciones SIMD (SSE, SSE2, SSE3 y SSE4) por lo menos me permite saber qué instrucciones puedo utilizar. Precisamente ahora estaba revisando el Manual de Desarrolladores de Software de Arquitectura Intel® 64 y IA-32, para ver si encontraba tales instrucciones. Quizá en un par de horas más ya tengo el código que resuelva mi problema para las instrucciones SIMD. Sin embargo, en la página de Wiki no sale nada sobre las instrucciones AVX. ¿Tienes idea de donde puedo conseguir un listado similar de instrucciones para enteros de AVX? Si consiguiera eso, mi problema quedaría resuelto en un par de horas más. Excelente respuesta, te lo agradezco.
|
|
|
En línea
|
|
|
|
MCKSys Argentina
|
|
|
|
En línea
|
MCKSys Argentina "Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."
|
|
|
xv0
Desconectado
Mensajes: 1.027
|
En el primer PDF. http://software.intel.com/es-es/intel-isa-extensions Si lo unico qu quieres hacer es una simple suma, con PADDB/PADDW/PADDD/PADD, si no puedes hacerlo de mas maneras. Un saludo.
|
|
|
En línea
|
|
|
|
Fly_NighT
Desconectado
Mensajes: 4
|
Si lo unico qu quieres hacer es una simple suma, con PADDB/PADDW/PADDD/PADD, si no puedes hacerlo de mas maneras.
También lo hace la instrucción PADDQ que directamente opera sobre paquetes de 64-bits (quadword). ¿Esas "maneras" de las que hablas incluyen sumas sin "perder" el carry? Las instrucciones PADDB/PADDW/PADDD/PADDQ ejecutan sumas, pero desprecian el carry (overflow) entre cada entero: " When a result is too large to be represented in the 8/16/32 integer (overflow), the result is wrapped around and the low bits are written to the destination element (that is, the carry is ignored). [...] Note that these instructions can operate on either unsigned or signed (two’s complement notation) integers; however, it does not set bits in the EFLAGS register to indicate overflow and/or a carry. To prevent undetected overflow conditions, software must control the ranges of the values operated on."
|
|
« Última modificación: 5 Marzo 2014, 06:46 am por Fly_NighT »
|
En línea
|
|
|
|
xv0
Desconectado
Mensajes: 1.027
|
Es que las instrcciones SEEx y AVX no tienen soporte para el carry.
Un saludo.
|
|
|
En línea
|
|
|
|
Fly_NighT
Desconectado
Mensajes: 4
|
Entonces tendré que implementarlo manualmente, aunque ya no será complicado. Muchas gracias. Mi problema ha sido resuelto. Excelentes respuestas en excelente tiempo. ¡Saludos a todos!
|
|
|
En línea
|
|
|
|
xv0
Desconectado
Mensajes: 1.027
|
Si tendras que implementarlo, piensa que las extensiones SSEx y AVX estan pensadas para hacer calculos independientes en byte, word, doubleword, quad etc...
De hay que tengas instrucciones como padd, pshuf, psll/pslr, pcmepeq, punpckh.
Un saludo
|
|
« Última modificación: 5 Marzo 2014, 07:47 am por cpu2 »
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
x86, set de instrucciones
Ingeniería Inversa
|
Blank Demon
|
2
|
3,006
|
29 Septiembre 2004, 09:28 am
por Blank Demon
|
|
|
Instrucciones Cubo
Electrónica
|
omega3
|
0
|
2,080
|
16 Marzo 2005, 10:34 am
por omega3
|
|
|
Separar instrucciones, pausa entre instrucciones
Java
|
NelxoN
|
5
|
7,270
|
28 Marzo 2009, 18:24 pm
por Amerikano|Cls
|
|
|
Malware que descarga instrucciones?
« 1 2 3 »
Análisis y Diseño de Malware
|
Vaagish
|
25
|
9,379
|
1 Julio 2014, 07:54 am
por x64core
|
|
|
Pregunta sobre instrucciones de repetición
Programación C/C++
|
Mario Olivera
|
4
|
2,615
|
12 Agosto 2014, 05:34 am
por leosansan
|
|