viernes, junio 23, 2006

Codigo para representar matrices CSR

En entradas anteriores, traté de explicar que es una matriz en formato CSR[1] y con un ejemplo[2], como se construye un matriz CSR a partir de una matriz densa.

Esta vez coloco código para representar como un tipo de datos definidos por el usuario, matrices en formato CSR.

En lenguaje C como un archivo de cabecera:
#ifndef _MATCSR_H
#define _MATCSR_H

#include
#include

/* CSR user define data */

struct MatCsr{
int n;
unsigned int *ia;
unsigned int *ja;
double *a;
};

typedef struct MatCsr MATCSR;

#endif
Y en Fortran
MODULE CSR_mod

IMPLICIT NONE

PRIVATE

! Define the derived data type for the CSR matrices

TYPE CSR
INTEGER :: N
INTEGER, DIMENSION (:), POINTER :: IA, JA
REAL(KIND=DP), DIMENSION (:), POINTER :: A
END TYPE CSR

PUBLIC :: CSR

END MODULE CSR_mod
Con forme avance, seguiré publicando código que utilice matrices CSR.

jueves, junio 22, 2006

Para los hispanohablantes que usan MySQL

La comunidad responsable de generar documentación sobre MySQL (un RDBMS) recientemente han puesto a disposición del público el "Manual de referencia de MySQL 5.0" completamente en español.

Si haces uso de MySQL[1] y te interesa el manual, puedes accesarlo a través de la siguiente URL:

http://dev.mysql.com/doc/#spanish-5.0

miércoles, junio 21, 2006

Probando Elive

Hace algunos días leí por alguna parte en la Internet, que existía un live-cd basado en Debian llamado Elive, pero que trae por gestor de ventanas Enlightenment, en lugar de los escritorios GNOME o KDE que son los más conocidos.

Es muy parecido al ya famoso live-cd Knoppix, en su funcionalidad; básicamente bajas el iso, lo "quemas" en un cd, reinicias tu máquina con el cd dentro del lector (siempre y cuando la pc pueda iniciar desde la unidad de cd-rom), y comenzará a cargarsé todo el sistema operativo en RAM, teniendo al final un sistema totalmente funcional.

Lo descargué para probarlo y realemente me gustó, porque ya trae "accesos rápidos" para lanzar las aplicaciones que es más común usar, como una consola, un navegador, un reproductor multimedia, una suite de oficina, y un par de cosas más que no recuerdo.

En el menú de aplicaciones (al que se puede accesar dando click izquierdo sobre el "escritorio"), tiene lo básico para trabajar; en particular de la sección de juegos, me dió gusto poder volver a jugar Armagetron, un clon del juego Tron en 3D.

La barra de "accesos rápidos" tiene un comportamiento similar al del escritorio de MacOS X, que me pareció un detalle curioso para impresionar.

Al parecer Elive no es muy exigente en cuanto recursos, así que en teoría debe funcionar en máquinas un poco "viejas". Yo no he tenido aún oportunidad de probarla en alguna máquina con pocos recursos.

Si quieres probar una distro Linux, y no quieres instalarla en tu disco duro por miedo a perder algo, prueba usar un live-cd. Y si te gusta Elive y quieres instalarlo en un disco duro, trae una opción para realizar la instalación, que esta disponible desde los "accesos rápidos".

Al momento de escribir esta entrada, la versión disponible para descargar de Elive es la 0.4.2

Nota: Si alquien quiere probarlo y sabe llegar al cubículo de LIDSOL, puede pedirme que le "queme" una copia, solo pido que lleven un cd-virgen para hacerles la copia.

viernes, junio 16, 2006

Comentario: Un examen de maestría y formas de pensar

El día martes me encontré a knish en la FI (UNAM), y comenzamos a platicar acerca de su examen de adminisión a maestría que presentó. Me comentó que en el examen habia algunas cuestiones vagas y ambiguas.

Después de comentarlas, a mi también me parecieron ambiguas, y estó se debió a que en la vida profesional de cualquiera, los problemas a los que hay que enfrentarse diariamente, son muy claros o específicos, aunque no por ello faciles de resolver.

Es cierto que un jefe puede pedir que hagamos cosas confusas o inconsistentes, pero el profesionista es quien evalúa las solicitudes o propuestas y busca su viabilidad, llegando a establecer metas claramente definidas.

Pero la situación con un jefe, es diferente a la que se presenta en un examen, porque en el medio laboral, tenemos tiempo para desarrollar una propuesta. En un examen, solo se tiene el mínimo tiempo y nada de flexibilidad, así que si en un examen se pregunta algo que en la vida profesional ya se ha enfrentado, y las respuestas son iguales de confusas que las preguntas, no hay mucho que hacer.

Durante esta charla, me dí cuenta que la experiencia laboral si influye en la manera en como percibimos los problemas y en la manera en como buscamos solucinarlos. Y a su vez, influye en nuestro desempeño frente a un examen, pensado bajo un esquema diferente (tal vez academico).

He aquí un ejemplo de una de las preguntas hechas durante el examen y nuestras interpretaciones (de knish y mio):

Dado el siguiente codigo en secuencial:

for(i = 1; i<=100; i++)
a = b +c ;

¿En cuantos nodos se puede paralelizar?

Según knish, en ninguno, dado que es una suma dentro de un ciclo, así que existe una fuerte dependencia entre los elementos secuenciales, que impide su parelización.

Según yo, como el ciclo suma 100 veces lo mismo (el resultado de la iteración 50 es igual que la 79 y que la 100), pues entonces reparto la suma en tantos nodos, como sea necesario, hasta tener una sola iteración ejecutandose en un nodo, es decir, si un nodo hace 100 veces la misma suma, entonces pongo 100 nodos ha hacer la misma suma, y me tardo el tiempo de una sola iteración.

No se puede hacer en mas de 100 nodos, porque ya no hay mas elementos que distribuir (es decir no puedeo hacer una sola porción de la suma), por lo que el intervalo de división del ciclo para paralelizar el codigo es [2, 100].

Pero entonces pensé, el uso de 100 nodos depende de, la eficiencia con que se requiere hacer el proceso (más nodos, más operaciones de comunicación), la rapidez, la cantidad efectiva de nodos de que se dispone, el consumo electrico, y otros factores que influen en la desición de la distribución de las partes de un proceso.

¿És correcta mi respuestas de distribuirlo en 100 nodos? Probablemente no es la que el evaluador espera, porque mi criterio para responder esa pregunta, se basó en rapidez, (si se hace 100 veces en un solo nodo, mejor hacerlo en 100 nodos una vez). Pero no conozco el criterio bajo el que se formuló la pregunta, y tal vez se pretente evaluar otra cosa, que al no aportar más datos, varias respuestas son válidas.

lunes, junio 12, 2006

Representación de matrices en formato CSR

En una entrada anterior[1], explicaba los elementos y consideraciones para representar matrices dispersas en formato CSR.

Ahora explico con un ejemplo, como construir una matriz en formato CSR a partir de su representación en formato denso.

Suponiendo que se tiene una matriz como la siguiente:

/
| 1.2 2.3 0.0 0.0 0.0 0.0 0.0 |
| 2.4 3.1 4.5 0.0 0.0 0.0 0.0 |
| 0.0 7.8 2.1 5.4 0.0 0.0 0.0 |
| 0.0 0.0 4.5 6.2 4.1 0.0 0.0 |
| 0.0 0.0 0.0 4.7 7.2 6.1 0.0 |
| 0.0 0.0 0.0 0.0 5.5 4.8 2.3 |
| 0.0 0.0 0.0 0.0 0.0 6.8 9.4 |
\ /

Recordando los elementos del formato CRS:

  • n := dimensión de la matriz
  • ia := índices para referirse a los renglones
  • ja := índices para las columnas
  • a := Elementos diferentes de cero
La matriz en formato CSR queda:

n = 7
ia = [1, 3, 6, 9, 12, 15, 18, 20]
ja = [1, 2, 1, 2, 3, 2, 3, 4, 3, 4, 5, 4, 5, 6, 5, 6, 7, 6, 7]
a = [1.2, 2.3, 2.4, 3.1, 4.5, 7.8, 2.1, 5.4, 4.5, 6.2, 4.1, 4.7, 7.2, 6.1, 5.5, 4.8, 2.3, 6.8, 9.4]

La longitud del vector ia es igual a la dimensión de la matriz más uno (7 + 1 = 8).

La longitud del vector ja es igual al del vector a, y se corresponde con él último elemento del vector ia menos uno (ia[7 + 1] - 1 = 20 -1 = 19).

Interpretando los vectores ia, ja y a; el primer elemento de ia es el índice que corresponde al vector ja y a, que representa la primera fila de la matriz, así:

ia[1] = 1

Ese 1 indica el índice en donde comienzan los elementos correspondientes al primer renglón, leídos en los vectores ja y al a siguientes:

ja[1] = 1
a[1] = 1.2
ja[2] = 2
a[2] = 2.3

Con lo que obtienes que en el renglón 1, columna 1, está el elemento 1.2; y en el renglón 1, columna 2, está el elemento 2.3. El resto de los elementos del renglón son ceros.

El elemento siguiente en ia es:

ia[2] = 3

Que indica el índice en donde comienzan los elementos del siguiente renglón.

ja[3] = 1
a[3] = 2.4
ja[4] = 2
a[4] = 3.1
ja[5] = 3
a[5] = 4.5

En el segundo renglón las columnas utilizadas son 1, 2 y 3, que se corresponden con los elementos 2.4, 3.1 y 4.5 respectivamente. Nuevamente, el resto de los elementos del renglón son ceros.

De esta manera se leen el resto de los elementos de la matriz en formato CSR.

Se observa que hay una relación uno a uno entre el vector ja y el vector a, que pueden ser movidos en el intervalo entre un renglón y otro, por ejemplo, de la matriz en formato CSR anterior, podemos modifica el orden de los dos primeros elementos en ja y a, que se corresponden con el primer renglón. También se puede alterar el orden de los tres siguientes elementos que corresponden al segundo renglón.

n = 7
ia = [1, 3, 6, 9, 12, 15, 18, 20]
ja = [2, 1, 3, 1, 2, 2, 3, 4, 3, 4, 5, 4, 5, 6, 5, 6, 7, 6, 7]
a = [2.3, 1.2, 3.1, 2.4, 4.5, 7.8, 2.1, 5.4, 4.5, 6.2, 4.1, 4.7, 7.2, 6.1, 5.5, 4.8, 2.3, 6.8, 9.4]

Hay que observar que en el mismo orden en que se modificó el vector ja, debe ser modificado el vector a. Si solo se altera el orden de ja o de a, ya no es una matriz equivalente. También hay que notar que no se debe modificar el orden de la matriz más allá de los índices que limitan los renglones, de hacerlo, se tendría una matriz diferente a la original.

En el caso del vector ia, el último elemento es un índice imaginario que no se refiere a ninguno de los elementos en el vector ja.

Una observación adicional, el vector ia se construye de la siguiente manera, el primer elemento siempre es 1, y los siguientes es la suma de todos los elementos del renglón diferentes de cero, más el elemento anterior en el vector ia.

Por ejemplo, el primer elemento de ia es 1, el siguiente es la suma de todos los elementos diferentes de cero del primer renglón, que son 2, más el elemento anterior en ia que es 1, da un total de tres, entonces, el segundo elemento de ia es 3; el tercer elemento de ia es 3 (total de elementos diferentes de cero del segundo renglón), más el elemento anterior que es 3, por lo que el tercer elemento en ia es 6. Así sucesivamente se construye el vector ia con el resto de los elementos de la matriz.

viernes, junio 02, 2006

Charla virtual sobre analisis forense

Laboratorio de Investigación y Desarrollo de Software Libre invita a la Charla Virtual:


Charla Virtual: Mesa Redonda sobre Análisis Forense
Fecha: Viernes 9 de Junio.
Horario: 11:00 hrs.
Lugar: #lidsol en el canal de irc en el servidor de irc freenode.net
Expositor: Staff de Lidsol e Invitados.

Pueden utilizar el cliente de LIDSOL.