Seis colores por carácter. ¡ CONSEGUIDO !

Todo sobre la creación, diseño y programación de nuevo software para
nuestro Spectrum

Moderador: Sir Cilve Sinclair

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

Notapor mcleod_ideafix el Lun Feb 02, 2009 8:30 am

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...
Web: ZX Projects | Twitter: @zxprojects
Avatar de Usuario
mcleod_ideafix
Johnny Jones
 
Mensajes: 3980
Registrado: Vie Sep 21, 2007 1:26 am
Ubicación: Jerez de la Frontera

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

Notapor juanjo el Lun Feb 02, 2009 12:31 pm

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++ ) {
juanjo
rst 0
 
Mensajes: 31
Registrado: Dom Ene 18, 2009 7:03 pm

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

Notapor mcleod_ideafix el Lun Feb 02, 2009 4:50 pm

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! :)
Web: ZX Projects | Twitter: @zxprojects
Avatar de Usuario
mcleod_ideafix
Johnny Jones
 
Mensajes: 3980
Registrado: Vie Sep 21, 2007 1:26 am
Ubicación: Jerez de la Frontera

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

Notapor juanjo el Lun Feb 02, 2009 5:46 pm

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 :)
juanjo
rst 0
 
Mensajes: 31
Registrado: Dom Ene 18, 2009 7:03 pm

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

Notapor mcleod_ideafix el Lun Feb 02, 2009 6:25 pm

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)
Web: ZX Projects | Twitter: @zxprojects
Avatar de Usuario
mcleod_ideafix
Johnny Jones
 
Mensajes: 3980
Registrado: Vie Sep 21, 2007 1:26 am
Ubicación: Jerez de la Frontera

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

Notapor juanjo el Lun Feb 02, 2009 7:00 pm

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
juanjo
rst 0
 
Mensajes: 31
Registrado: Dom Ene 18, 2009 7:03 pm

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

Notapor mcleod_ideafix el Lun Feb 02, 2009 7:17 pm

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
Web: ZX Projects | Twitter: @zxprojects
Avatar de Usuario
mcleod_ideafix
Johnny Jones
 
Mensajes: 3980
Registrado: Vie Sep 21, 2007 1:26 am
Ubicación: Jerez de la Frontera

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

Notapor mcleod_ideafix el Lun Feb 02, 2009 7:26 pm

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
Web: ZX Projects | Twitter: @zxprojects
Avatar de Usuario
mcleod_ideafix
Johnny Jones
 
Mensajes: 3980
Registrado: Vie Sep 21, 2007 1:26 am
Ubicación: Jerez de la Frontera

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

Notapor juanjo el Lun Feb 02, 2009 7:48 pm

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?)
juanjo
rst 0
 
Mensajes: 31
Registrado: Dom Ene 18, 2009 7:03 pm

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

Notapor mcleod_ideafix el Lun Feb 02, 2009 7:49 pm

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í?
Web: ZX Projects | Twitter: @zxprojects
Avatar de Usuario
mcleod_ideafix
Johnny Jones
 
Mensajes: 3980
Registrado: Vie Sep 21, 2007 1:26 am
Ubicación: Jerez de la Frontera

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

Notapor juanjo el Lun Feb 02, 2009 8:12 pm

Muchas gracias (y perdona mi puñeteria), ahora mismo lo pruebo :D
juanjo
rst 0
 
Mensajes: 31
Registrado: Dom Ene 18, 2009 7:03 pm

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

Notapor juanjo el Lun Feb 02, 2009 8:50 pm

Fusionaaaaa!!! :D :D :D
juanjo
rst 0
 
Mensajes: 31
Registrado: Dom Ene 18, 2009 7:03 pm

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

Notapor marce el Jue Ago 27, 2009 12:42 am

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
Ultima edición por marce el Lun Abr 17, 2017 7:05 pm, editado 1 vez en total
Avatar de Usuario
marce
Herbert
 
Mensajes: 79
Registrado: Lun Jun 11, 2007 8:05 pm
Ubicación: Mallorca

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

Notapor na_th_an el Jue Ago 27, 2009 8:23 am

Interesante... :)
Avatar de Usuario
na_th_an
Nonamed
 
Mensajes: 1889
Registrado: Lun May 07, 2007 10:16 am
Ubicación: Andalucía

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

Notapor marce el Jue Ago 27, 2009 1:29 pm

Probado en un gomas con éxito!
Avatar de Usuario
marce
Herbert
 
Mensajes: 79
Registrado: Lun Jun 11, 2007 8:05 pm
Ubicación: Mallorca

PrevioSiguiente

Volver a Programación y nuevos desarrollos

¿Quién está conectado?

Usuarios navegando este Foro: No hay usuarios registrados visitando el Foro y 4 invitados