Página 5 de 9

Re: Seis colores por carácter. ¡ CONSEGUIDO !

NotaPublicado: Lun Feb 02, 2009 8:30 am
por mcleod_ideafix
Pues no lo he medido, pero te lo miro ahora mismo:...

Código: Seleccionar todo
$ time ./raw2hr modelo.raw   

real    0m0.008s
user    0m0.008s
sys     0m0.000s
$ time ./raw2hrv2 modelo.raw

real    0m9.823s
user    0m9.821s
sys     0m0.004s


El programa raw2hr usa el primer algoritmo, el que usa la luminancia de la imagen original para generar los píxeles y atributos de la versión para Spectrum.
El programa raw2hrv2 usa el algoritmo de fuerza bruta que para cada tira de 8 píxeles de la imagen original, genera todas las posibles combinaciones de colores y escoge aquella que se parezca más a la tira original. Es ahí donde uso el método de mínimos cuadrados para medir el error.

Como ves, tarda casi 10 segundos. Esto es usando un Pentium 4 a 3GHz, que aunque es hyperthreading, resulta que yo no uso en el código fuente nada que aproveche esto. La cosa es que este algoritmo es altamente paralelizable. Tengo que recompilarlo con OpenMP, aunque sea como curiosidad a ver cuánto consigo acelerarlo...

Re: Seis colores por carácter. ¡ CONSEGUIDO !

NotaPublicado: Lun Feb 02, 2009 12:31 pm
por juanjo
Yo tengo un AMD a 3500. Pues si que va rapida la maquina virtual de java. En el doble nucleo de mi hermano tarda la mitad, no se por que tanta diferencia, si yo no lo he paralelizado tampoco.

Por cierto, yo he usado una optimizacion: para no mirar las posibilidades simetricas de tinta y papel (o sea la permutacion de tinta y papel y tambien de los bits del bitmap, que dan lugar a los mismos colores) hago que la tinta sea igual o mayor que el papel, asi se ahorran bastantes combinaciones,
Código: Seleccionar todo
for ( int paper = 0; paper < 8; paper++ ) {
    for ( int ink = paper; ink < 8; ink++ ) {

Re: Seis colores por carácter. ¡ CONSEGUIDO !

NotaPublicado: Lun Feb 02, 2009 4:50 pm
por mcleod_ideafix
juanjo escribió:Yo tengo un AMD a 3500. Pues si que va rapida la maquina virtual de java. En el doble nucleo de mi hermano tarda la mitad, no se por que tanta diferencia, si yo no lo he paralelizado tampoco.

Por cierto, yo he usado una optimizacion: para no mirar las posibilidades simetricas de tinta y papel (o sea la permutacion de tinta y papel y tambien de los bits del bitmap, que dan lugar a los mismos colores) hago que la tinta sea igual o mayor que el papel, asi se ahorran bastantes combinaciones,


Anda! Que idiota soy! Pues no me había dado cuenta de eso... a ver qué pasa si lo pongo así...

Código: Seleccionar todo
$ time ./raw2hrv2 modelo.raw

real    0m5.604s
user    0m5.584s
sys     0m0.000s


¡Casi la mitad de tiempo! :)

Re: Seis colores por carácter. ¡ CONSEGUIDO !

NotaPublicado: Lun Feb 02, 2009 5:46 pm
por juanjo
Jeje... ya decia yo que habia poca diferencia entre el ejecutable y la version java.

Aprovecho para transmitir mi entusiasmo porque acabo de conseguir transmitir un byte por bluetooth desde mi movil al pc y viceversa. Hurra! Todo en java of course.

PS: Quien dice un byte dice un tera :)

Re: Seis colores por carácter. ¡ CONSEGUIDO !

NotaPublicado: Lun Feb 02, 2009 6:25 pm
por mcleod_ideafix
Seguimos con las optimizaciones.

Compilando con el compilador de Intel, y activando las opciones por defecto, tenemos:

Código: Seleccionar todo
$ icc -O2 -unroll -xSSE2 -o raw2hrv2 raw2hrv2.c
raw2hrv2.c(173): (col. 2) remark: LOOP WAS VECTORIZED.
raw2hrv2.c(37): (col. 2) remark: LOOP WAS VECTORIZED.
raw2hrv2.c(39): (col. 2) remark: LOOP WAS VECTORIZED.
$ time ./raw2hrv2 modelo.raw

real    0m1.814s
user    0m1.792s
sys     0m0.008s


Es decir, unos 2 segundos. Esto sin usar OpenMP :) Sólo ha vectorizado algunos bucles (cosa que en sí misma ya paraleliza bastante al usar el juego de instrucciones SSE2 para realizar múltiples cálculos en paralelo)

Re: Seis colores por carácter. ¡ CONSEGUIDO !

NotaPublicado: Lun Feb 02, 2009 7:00 pm
por juanjo
Esta muy bien pero... que hay de la rutina para cargar las imagenes en el spectrum?... que he hecho el editor y de momento no sirve para nada! (bueno si, le puse un modo para editar .scr normales, pero...) ponte con ella hombre! :D

Re: Seis colores por carácter. ¡ CONSEGUIDO !

NotaPublicado: Lun Feb 02, 2009 7:17 pm
por mcleod_ideafix
Eso está hecho!

Pero de mientras, admira, ¡oh mortal! lo que significa de verdad la diferencia entre un procesador hyperthreading y otro con doble nucleo "de verdad". En el de doble nucleo, el OpenMP se nota... ¡vaya si se nota!

Versión sin OpenMP
Código: Seleccionar todo
$ time ./raw2hrv2 modelo.raw

real    0m1.735s
user    0m1.716s
sys     0m0.000s


Versión con OpenMP
Código: Seleccionar todo
$ time ./raw2hromp modelo.raw

real    0m1.002s
user    0m1.752s
sys     0m0.004s

Re: Seis colores por carácter. ¡ CONSEGUIDO !

NotaPublicado: Lun Feb 02, 2009 7:26 pm
por mcleod_ideafix
Respecto al cargador, no hay más que coger la rutina "Cargador" del fuente que pasé y quitarle la parte en la que carga el bitmap.

Esto es: si mal no recuerdo, el editor genera dos ficheros, uno SCR y otro con los atributos en alta resolución.

El primero se cargaría de la forma habitual, LOAD "" SCREEN$

El segundo se cargaría a partir de la dirección de la etiqueta BitmapHR, y eso dependerá de dónde se haya ensamblado la rutina. Lo más sencillo es hacer como aparece en el fuente original, e incluir con un "incbin" el fichero con los atributos de alta resolución en la compilación.

Si se quiere cargar dinámicamente la pantalla, pues basta con darle un valor a BitmapHR para que apunte a un área de 2688 bytes, cargar en esa área el archivo de atributos, y llamar a "Cargador".

Código: Seleccionar todo
Cargador        proc
                ld hl,BitmapHR
                ld c,0              ;bucle externo C=0 hasta 191
BucY            ld b,0              ;bucle interno B=0 hasta 13
BucX            push bc
                ld a,(hl)           ;leemos valor de atributo
                inc hl
                push hl
                call PokeAttr       ;y lo enviamos al archivo de atributos en HR
                pop hl
                pop bc
                inc b
                ld a,b
                cp 14
                jr nz,BucX
                inc c
                ld a,c
                cp 192
                jr nz,BucY
                ret
                endp

Re: Seis colores por carácter. ¡ CONSEGUIDO !

NotaPublicado: Lun Feb 02, 2009 7:48 pm
por juanjo
Estooo.. puedes compilarla y pasarmela? es que no estoy puesto con el ensamblador de spectrum (... ni quiero ponerme :roll: ) Ponle a BitmapHR el valor que sea. Supongo que hay que meter Cargador y las funciones pokeAttr y las demas (la que hace el efecto de alta resolucion) en un mismo fichero y que se puedan llamar desde basic.. o sea necesitare saber tambien las direcciones de memoria de las rutinas. (Ahora ando liado... o solo hace falta llamar desde basic a Cargador?)

Re: Seis colores por carácter. ¡ CONSEGUIDO !

NotaPublicado: Lun Feb 02, 2009 7:49 pm
por mcleod_ideafix
Para que se pueda probar rapidamente lo generado en el editor, puedes usar este pequeño programa en formato TAP que adjunto.
Al cargarse no ocurre nada de especial, pero una vez cargado en memoria ya puedes volcar la pantalla.
- Usa LOAD "" SCREEN$ para cargar el bitmap y los atributos de baja resolución.
- Usa LOAD "" CODE 32768 para cargar los 2688 bytes de atributos de alta resolución. Si quieres cargar ese bloque en otra dirección, pokea las direcciones 58526 y 58527 con la nueva dirección a usar.
- Después, haz un RANDOMIZE USR 58525 para cargar el archivo de atributos en alta resolución a la rutina.
- Y por último, activa el modo de alta resolución con un RANDOMIZE USR 49411

Para desactivar el modo de alta resolución, RANDOMIZE USR 49418

Es decir, que en el BASIC del programa que te incluyo, tendrías que añadir esto (cambio el orden de la carga para que el bitmap se cargue lo último, ya que si no, las siguientes cargas "guarrearían" la información del mismo):
Código: Seleccionar todo
40 LOAD ""CODE 32768
50 LOAD ""SCREEN$
60 RANDOMIZE USR 58525
60 RANDOMIZE USR 49411
70 PAUSE 0

El TAP final deberá contener los siguientes bloques:
- El cargador BASIC con las modificaciones que te acabo de comentar
- El bloque de C/M, que carga en 49407 y ocupa 9147 bytes
- Un bloque de atributos de alta resolución generado por el editor
- Una pantalla generada por el editor

¿Te vale así?

Re: Seis colores por carácter. ¡ CONSEGUIDO !

NotaPublicado: Lun Feb 02, 2009 8:12 pm
por juanjo
Muchas gracias (y perdona mi puñeteria), ahora mismo lo pruebo :D

Re: Seis colores por carácter. ¡ CONSEGUIDO !

NotaPublicado: Lun Feb 02, 2009 8:50 pm
por juanjo
Fusionaaaaa!!! :D :D :D

Re: Seis colores por carácter. ¡ CONSEGUIDO !

NotaPublicado: Jue Ago 27, 2009 12:42 am
por marce
Aquí tenéis un cutre-dibujo que he realizado usando Colorator (https://github.com/yomboprime/colorator/blob/master/README-es.md):
Imagen

Y el fichero TZX:
http://mesxes.es/colorator/demo-colorator.tzx

Todavía no he podido probarlo en un Spectrum real, pero no creo que exista ningún problema.


Saludos,
//.arce

Re: Seis colores por carácter. ¡ CONSEGUIDO !

NotaPublicado: Jue Ago 27, 2009 8:23 am
por na_th_an
Interesante... :)

Re: Seis colores por carácter. ¡ CONSEGUIDO !

NotaPublicado: Jue Ago 27, 2009 1:29 pm
por marce
Probado en un gomas con éxito!