miércoles, 27 de febrero de 2008

Sol, sol, sol!!!

Pues si, increíble.
Después del primer día lluvioso el resto de días han sido muy soleados. Mi casa esta orientada hacia el sur (con unas maravillosas vistas al vertedero) con lo que recibo muchísima luz :)
Esta semana me la han dado libre, así que he aprovechado para hacer todo el papeleo:
1. Cuenta corriente.
2. PPS/Impuestos.
3. Internet
4. Teléfono móvil.
De momento salvo por el teléfono móvil, para el que necesito una prueba de vivienda algo difícil de conseguir, todo está hecho.
Mañana iré a Dublín para ponerme al día el pasaporte, que está apunto de caducárseme.
Y una última curiosidad: En Irlanda las cocinas están de adorno, si intentas cocinar en ellas te salta la alarma de incendios al mínimo humillo que provoques... A ver si le pillo el truco.

Ya empiezo un poco a volar en Irlanda parece...
Ta, bêko gaiok agor-ezkeroz,
Iguzki-k ezin urtuzko egoz
(Ikar-ek ez bezelakoz)
goazeman zerura igoz,
izar urdiñetarañoko asmoz!
X. Lizardi 

martes, 26 de febrero de 2008

Settling in

Después de un viajecito toulouse -> carcassonne -> Dublin -> Limerick (y cada uno de ellos en un medio de transporte distinto) llegué finalmente a Irlanda.
Ha sido una sensación rara, llegar a una ciudad nueva, que no conoces de nada y que sabes (por experiencia) que en unos meses será tu hogar.
Aún estoy triste, es un algo que me queda dentro. La despedida de mis amigos y compañero fue bastante más dura de lo que me esperaba...
Mis colegas me hicieron pagar una apuesta perdida el último día: Me vistieron de conejo y me obligaron a hacer así el circuito de salida de mi empresa.
Fue la leche de gracioso, pero hoy, no se por que, no me apetece reir.

miércoles, 20 de febrero de 2008

Algo huele a podrido en el salon

Este tio es un hacha, mensaje recibido esta manana en el trabajo. (sic)

"Un cierto numero de personas hackean las maquinas de cafe para evitar pagar. Independientemente del precio del cafe en si mismo, esto provoca intervenciones tecnicas que son facturadas a tocateja. Ya se que concierne a un grupo reducidisimo de gente, pero si los pillo, la sancion sera dura.
JC"

Este tipejo es el mismo gilipollas que:
1. se compra un porsche el mismo dia que echa a 20 tios a la puta calle.
2. nos hace venir a buscar los ordenadores y cuadernos a su despacho cada vez que nos los olvidamos sin bloquear para echarnos la bronca.
3. nos envia mensajes diciendo que los rumores de desmembramiento son falsos minutos despues de que el CTO lo confirme.
4. quiso ponerme un parte de comportamiento por que decia que los espanoles hablabamos muy fuerte en la cafeteria y que molestaba a los clientes.

En lugar de desperdiciar su tiempo, y el dinero de la empresa, en tocar activamente los cojones del personal, podria tratar de hacer su trabajo y organizar el ciclo de desarrollo para evitar los problemas que han hecho que la empresa pierda un 50% de su parte de mercado, curisamente desde que el se ocupa de la division.

Pregunta de teoría de volumenes

Cuanta mierda puede acumular un apartamento después de 6 meses cerrado?
Respuesta:
Mucha, MUCHISIMA.
joder, me cago en la madre que parió a las mudanzas.

jueves, 14 de febrero de 2008

Simon says



Simple, corto, visceral.

lunes, 11 de febrero de 2008

Despedida

Metodo nipon para despedir a un espanol?

Llevarle a restaurante espanol.... pero vaya restaurante.



Nipones con patillas postizas enoooooormes en playback al ritmo de ketama.

Impagable.

Cagondios... :P Si en el fondo los quiero ^^

viernes, 8 de febrero de 2008

Just In Time Compilation (JIT)

Hoy voy a hacer un pequeno comentario sobre una tecnica de programacion muy interesante para entornos de alto rendimiento embebidos y es lo que se llama JIT, o como podria decirse en espanol "Compilacion en tiempo real".

EXPLICACION:
El rendimiento de un procesador puede ser calculado por el flujo maximo de datos que genera por ciclo de reloj, sin embargo, cuando se pasa a la implementacion de un determinado algoritmo nos podemos encontrar que generamos un flujo bastante inferior al teorico. Esto puede ocurrir por:

1) Uso sub-optimo de la vectorizacion (Ejemplo): Un procesador de 64 bits puede hacer 8 sumas de 8 bits en paralelo, si queremos aplicar un filtro sobre una componente de un pixel definido como:



La inicializacion es un poco mas compleja, pero basicamente hace lo mismo pero con 3 operaciones cada 8 pixels contra 16 por 8 pixels.

2) Por stalls en la pipeline (Ejemplo): Debidos a cache miss (Instrucciones o Datos), o la concatenacion de instrucciones que utilizan las mismas unidades aritmeticas.

3) Por ruptura de la pipeline debido a un salto (Ejemplo): Un if (...) no bien predicho.

En concreto, la programacion de tipo JIT, tiene como objetivo eliminar (o reducir considerablemente) los stalls en la pipeline debidos a instruction miss, y las rupturas de pipeline debidas a salto.

COMO:
La programacion consiste a crear un pequeno buffer de instrucciones en tiempo real, para ello tenemos que crearnos un minicompilador interno y segun los datos de entrada generamos unas instrucciones en codigo maquina (bytecode) adaptadas a nuestro algoritmo.
Imaginemos la interpolacion lineal:
El algoritmo de base es:



Para general el codigo git equivalente supongamos:

a) el tamano de la linea de la data cache es de 32 bytes.
b) y las siguientes funciones

void generate_ldrb_r_r_off(uint32_t * jitcmdbuf, int rd, int ra, int off);
genera el codigo fuente de una instruccion que guarda en el registro rd el byte contenido en la direccion guardada
en [ra] + offset y lo anade a jitcmdbuf

void generate_pld_r_off(uint32_t * jitcmdbuf, int ra, int off);
este genera un preload en cache de los 32 bytes a partir de la direccion calculada en [ra] + off

void generate_strb_r_r_off(uint32_t * jitcmdbuf, int rd, int ra);
idem a ldrb pero guardando

void generate_save(uint32_t *);void generate_rest(uint32_t *);
salvan y recuperan el estado de los registros y el program counter.

void generate_addb_r_r_r_asr(uint32_t * jitcmdbuf, int rd, int rm, int rs, int asr);
suma los datos de rm y rs en rd, y le aplica un shift de asr a la derecha al resultado.

Pues en jit primero preparariamos el codebufer.



Ahora "func" es un puntero a funcion de tipo void interpolate(uint8_t * in, uint8_t *out) que tiene las siguiente ventajas:
1) No hay rupturas de pipeline (los ifs son precalculados)
2) No hay calculos internos de los offsets
3) No hay data miss (los preloads son predichos)
Aun se podria mejorar, pero como proof of concept esta bien.

LIMITACIONES:

  • Generar las funciones toma tiempo, mejor utilizarlas en cosas repetitivas.
  • Las funciones generan un numero grande de instrucciones, hay que tener cuidado que cada uno de nuestros monstruitos no supere el tamano de la cache de instrucciones.
  • En arquitecturas conbit NX (No execute) hay que tener cuidado para que nuestra funcion sea ejecutable.
  • Hay que comentar y documentar bien, si no es ilegible

Pues esto es una pequena introduccion, algun dia metere esquemitas.

Para otros dias me dejo otras perlitas como:
A) Vectorizacion (introducida hoy)
B) Gestion buffer de salida de datos y de entrada.
C) Reordenacion de instrucciones.


CURIOSIDAD:

La compilacion JIT es muy similar a la técnica de injección de codigo de los buffer-overflow.

jueves, 7 de febrero de 2008

Tetris!!!

A compilar con cualquier compilador C. Funciona sobre targets GNU o sobre win32 si anadis cygwin.
Controles:
"j" => izquierda
"l" => derecha
"k" => girar
"espacio" => abajo
"q" => salir

long h[4];t(){h[3]-=h[3]/3000;setitimer(0,h,0);}c,d,l,v[]={(int)t,0,2},w,s,I,K
=0,i=276,j,k,q[276],Q[276],*n=q,*m,x=17,f[]={7,-13,-12,1,8,-11,-12,-1,9,-1,1,
12,3,-13,-12,-1,12,-1,11,1,15,-1,13,1,18,-1,1,2,0,-12,-1,11,1,-12,1,13,10,-12,
1,12,11,-12,-1,1,2,-12,-1,12,13,-12,12,13,14,-11,-1,1,4,-13,-12,12,16,-11,-12,
12,17,-13,1,-1,5,-12,12,11,6,-12,12,24};u(){for(i=11;++i<264;)if((k=q[i])-Q[i]
){Q[i]=k;if(i-++I||i%12<1)printf("\033[%d;%dH",(I=i)/12,i%12*2+28);printf(
"\033[%dm "+(K-k?0:5),k);K=k;}Q[263]=c=getchar();}G(b){for(i=4;i--;)if(q[i?b+
n[i]:b])return 0;return 1;}g(b){for(i=4;i--;q[i?x+n[i]:x]=b);}main(C,V,a)char*
*V,*a;{h[3]=1000000/(l=C>1?atoi(V[1]):2);for(a=C>2?V[2]:"jkl pq";i;i--)*n++=i<
25||i%12<2?7:0;srand(getpid());system("stty cbreak -echo stop u");sigvec(14,v,
0);t();puts("\033[H\033[J");for(n=f+rand()%7*4;;g(7),u(),g(0)){if(c<0){if(G(x+
12))x+=12;else{g(7);++w;for(j=0;j<252;j=12*(j/12+1))for(;q[++j];)if(j%12==10){
for(;j%12;q[j--]=0);u();for(;--j;q[j+12]=q[j]);u();}n=f+rand()%7*4;G(x=17)||(c
=a[5]);}}if(c==*a)G(--x)||++x;if(c==a[1])n=f+4**(m=n),G(x)||(n=m);if(c==a[2])G
(++x)||--x;if(c==a[3])for(;G(x+12);++w)x+=12;if(c==a[4]||c==a[5]){s=sigblock(
8192);printf("\033[H\033[J\033[0m%d\n",w);if(c==a[5])break;for(j=264;j--;Q[j]=
0);while(getchar()-a[4]);puts("\033[H\033[J\033[7m");sigsetmask(s);}}d=popen(
"stty -cbreak echo stop \023;sort -mnr -o HI - HI;cat HI","w");fprintf(d,
"%4d from level %1d by %s\n",w,l,getlogin());pclose(d);}

lunes, 4 de febrero de 2008

Tesbah 'Ala Kheir Ya Habet Eini

Un pequeño mensaje personal para cierta persona que, aunque ahora sea imposible, nunca abandonara mis recuerdos...

estah'te lek... ranita