Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Mezcla de Instrucciones MMX y Matemáticas

Iniciado por fiero, 01 de Enero de 1970, 01:00:00 AM

« anterior - próximo »

fiero

                                Bueno, esto es una cosa que no habia tenido nunca la necesidad de utilizar. Me refiero a realizar operaciones con el coprocesador matemático y a la vez, en el mismo bucle,  tener unas variables en registros mmx que se van incrementando.

Lo he probado dejando los registros MM0 y MM7 sin usar y funciona perfectamente. En el MM0 (ó ST) se carga el número en coma flotante y al hacerlo se machaca el valor del MM7 ó ST(7) debido al desplazamiento de todos los registros. No he notado tampoco ninguna diferencia de velocidad en los cálculos al mezclar los dos tipos de instrucciónes.

¿Sabeis algo al respecto? ¿Algúna web donde se comente la cuestión? Recuerdo que cuando aparecieron las instrucciones mmx se habló algo de este tema, pero no me he topado con  ninguna discusión técnica sobre el asunto...

un saludo                                
www.videopanoramas.com Videopanoramas 3D player

Astharoth

                                Hola.

Veamos...

[Nota]
MMX es un "truco sucio" sobre la unidad de coma flotante.. es decir, el espacio interno dentro del procesador reservado para la pila del coprocesador matematico es el mismo que el ocupado por los registros MMX.
Gracias a "esto" no se puede utilizar codigo MMX y de copro al mismo tiempo y advierten que despues del codigo MMX se use la instruccion "emms" para limpiar lo que pueda haber dejado el proceso MMX.
[/Nota]


No se puede hacer mucho mas al respecto, aunque si controlas exactamente que tienes y en que posiciones de copro y los registros MMX que usas es posible que puedas mezclar algo de codigo evitando solapaciones (Lo que estas haciendo) . La teoria dice que se puede.. pero vamos, muy posiblemente de demasiados problemas, ademas, por ejemplo el Vc++ 6.0 se queja en caso de hacer estas "marranerias" :sonriendo:

No se exactamente que quieres saber. Has mezclado los dos tipos de registro "con cuidado" y no te ha dado problema.. exactamente cual era tu duda? la velocidad?


Saludos,Astharoth.



[ Este Mensaje fue editado por: Astharoth el 2002-09-17 09:11 ]                                

fiero

                                Si, el VC dá un warning, pero bueno (se queja por todo :sonriendo:).

Me gustaria saber si el coprocesador se prepara para ejecutar una y otra instrucción y por ello pierde tiempo en el cambio. Con vistas a poder utilizar el copro en algún bucle más crítico (si surge la necesidad), donde utilizo mmx.

saludos                                
www.videopanoramas.com Videopanoramas 3D player

Astharoth

                                Veamos..

La unidad de flotante esta conectada al resto del procesador usando un mapeo de puertos E/S y se utiliza una IRQ para los avisos a termino de operacion.

Esto es lo especificado aunque dudo mucho que hoy en dia sea asi (supongo que sera resquicio de compatibilidad de cuando el 80387 y compañia que eran externos).

Por otra parte y que yo sepa en coprocesador no necesita esperar a nada para comenzar su ciclo de ejecucion (salvo quizas cuando se hace un acceso a memoria.. las esperas que puedan salir en ese caso)

La unica solucion para eliminar dudas que se me ocurre, es que te bajes el pdf correspondiente de Intel sobre el conexionado interior y el flujo de instrucciones para saber si la unidad que decodifica MMX interfiere en algo frente a la del propio copro (y por esto deba de recargar registros).

Me suena que algo asi hay.. (que internamente al hacer uso de un tipo de instruccion u otra algun tema interno se modifica para trabajar con una unidad u otra) .. pero no te lo puedo asegurar ya que nunca he tenido necesidad de hacer un experimento asi.

Si descubres algo en ese sentido podrias postearlo por aqui, asi me entero.

Saludos, Astharoth.
                               

fiero

                                Bueno, despues de mucho buscar no he sido capaz de encontrar ningun documento que hable sobre el tema...:triste:

Tambien he comprobado que suceden cosas muy extrañas con los registros del coprocesador al manipular los registros mmx. Aunque las primeras pruebas me habian funcionado, he complicado un poco más el bucle y esto no resulta nada estable. Por comentar un poco, tenia la intención de interpolar 3 variables en coma flotante y otros 2 registros mmx con variables enteras (fixed point). El bucle iba incrementando todas las variables a la vez. Las variables flotantes estaban en st(0), st(1) y st(2) y los enteros en mm3 y mm4, pero resulta que "a veces" al manipular mm3 o mm4, los flotantes pasaban a st(5), st(6) y st(7):o como por arte de magia...

Bueno, como dices Astharoth es una manera un poco "guarrilla" de programar, así que, como el experimento no ha resultado, lo haré todo con floats y a correr...

un saludo                                
www.videopanoramas.com Videopanoramas 3D player

samsaga2

                                Lo digo de oidas... Creo que el MMX usa los registros de la unidad flotante, por lo tanto, al escribir en un registro del MMX pierdes los que tienes en la FPU. Y si no recuerdo mal, la principal mejora que lleva la extension de instrucciones del AMD es que tenia sus propios registros.
                               






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.