viernes, 24 de junio de 2011

Introducción a la computación paralela (parte 1)

La idea es crear una serie de artículos en los que podamos cubrir algunos aspectos básicos y no tan básicos de la computación paralela para que el lector tenga un punto de partida en esta área tan fascinante y continúe investigando por su cuenta. En este primer artículo comenzaremos con los conceptos básicos que nos permitirán abordar de mejor manera los siguientes posts de esta serie.

Hoy en día se ha vuelto tan común tener PC's o portátiles con más de un procesador, núcleo o core (usen el que más les guste) por esto resulta importante explotar de manera adecuada esta ventaja, sobre todo con aplicaciones que consumen mucho tiempo de procesador como aplicar filtros y efectos complejos con Gimp, renderización de imáges, cálculos intensivos como simulaciones, programas que hagan uso de las técnicas de computación emergente, métodos de elementos finitos, juegos, etc.

Para aquellos que trabajamos en el área y sobre todo si nos gusta "jugar" con las técnicas de la computación emergente aprovechar todo el poder de cálculo que nos brindan los computadores resulta ideal. ¿Por qué uso Python y no C/C++ si lo que necesito es aumentar el rendimiento al máximo? Todas las librerías matemáticas que usa Python están escritas en C (numpy por ejemplo) así que básicamente lo que hacemos es un script que interactúa con las funciones hechas en C. Ahora bien, en este sentido podríamos usar Perl o el lenguaje de su preferencia, mi preferencia es Python =)

Comencemos con una breve introducción a la computación paralela, como podemos leer en la wikipedia:
La computación paralela es una técnica de programación en la que muchas instrucciones se ejecutan simultáneamente. Se basa en el principio de que los problemas grandes se pueden dividir en partes más pequeñas que pueden resolverse de forma concurrente ("en paralelo"). 
Tratemos de explicar este concepto con un ejemplo sencillo, deseamos realizar una encuesta a 1000 personas acerca de un asunto X. ¿Nos podríamos nosotros mismos a entrevistar a las 1000 personas? o ¿podríamos a un grupo de empleados a hacerlo? Durante el día cada empleado entrevistará una cuantas personas, cada uno de ellos con un grupo distinto. Acabamos de paralelizar el trabajo, además llamada "paralelismo de datos":
Paralelismo de datos es un paradigma de la programación concurrente que consiste en subdividir el conjunto de datos de entrada a un programa, de manera que a cada procesador le corresponda un subconjunto de esos datos. Cada procesador efectuará la misma secuencia de operaciones que los otros procesadores sobre su subconjunto de datos asignado. En resumen: se distribuyen los datos y se replican las tareas.
Otro ejemplo que nos servirá más adelante es el típico ejemplo de un banco. Supongamos que hablamos ahora de un banco en el que tenemos una cola de personas esperando ser atendidas y 4 taquillas en las que serán de ello (Quad Core o X4 jejeje). ¿Tendría sentido poner a todas las personas en la misma taquilla? o ¿pasaríamos a cada persona por una taquilla diferente a medida que se desocupen? Supongo que la respuesta más evidente para nosotros es atender a los clientes a medida que se desocupen las taquillas.

Entonces terminamos con una cola de "jobs" o trabajos por hacer y 4 "workers" o trabajadores que se encargarán de atender estas peticiones. Nuevamente tenemos la parelización de los trabajos:



A medida que las taquillas o workers (como se les conoce en la computación paralela) se van desocupando atienden a los clientes o jobs que tengan pendientes con estos.

También tenemos el paralelizmo de tareas:
Paralelismo de tareas es un paradigma de la programación concurrente que consiste en asignar distintas tareas a cada uno de los procesadores de un sistema de cómputo. En consecuencia, cada procesador efectuará su propia secuencia de operaciones.
Para entender este concepto vamos a imaginar una fábrica automotriz, en todo momento se están haciendo asientos, puertas, chasis, motores, etc. Al mismo tiempo se realizan tareas diferentes en distintas partes de la fábrica, incluso en fábricas diferentes (lo que en nuestro contexto sería computación distribuida).

Aquí nos topamos con otro concepto interesante, el de la computación distribuida, podemos tener poderosos clústers de cálculo capaces de realizar muchas más operaciones de las que podríamos en un único computador, puede estar compuesto desde un par de computadores personales hasta una gran cantidad de computadores especializados. La idea principal tras de esto es distribuir las tareas no solo entre los procesadores, si no también entre distintos computadores.

Como se podrá imaginar se puede hacer una combinacion de estos tres coceptos para obtener el mejor rendimiento en una aplicación que consuma una gran cantidad de recursos, por ejemplo podríamos tener un cluster en el que le asignamos una tarea a cada nodo (computador en nuestro cluster) y este a su vez paraleliza la tarea en varias partes.

En los siguientes artículos desarrollaremos algunos ejemplos de cada tipo de paralización que mencionamos en este post (hay más tipos, pero son los principales) incluso de computación distribuida.

lunes, 20 de junio de 2011

Instalación, configuración y personalizacion de EasyHotspot

Lo prometido es deuda, aquí está el artículo del hotspot que decidí usar para el proyecto que comenté en una entrada anterior, decidí usar EasyHotspot en vista de lo fácil que es de usar, instalar, configurar y personalizar.

La instalación es bastante sencilla como la de cualquier Ubuntu, el detalle que se debe tener en cuenta es el particionado en vista de que se trata de un servidor y no cualquier PC de escritorio (aunque si se desea, cosa que no recomiendo, se usa el particionado por defecto usando todo el disco). Para las pruebas iniciales usé una máquina virtual creada con Virtual Box, le asigné 4 Gb de disco duro, para un servidor de pruebas es más que suficiente.

En su página podemos encontrar los pasos para la instalación y configuración inicial, vamos a concentrarnos en los pasos siguientes a la instalación. En primer lugar y antes de comenzar a cargar la configuración perzonalizada actualizamos el código fuente de la interfaz web, para ello abrimos una cónsola, cambiamos el directorio y actualizamos de los repos:

cd /opt/local/web/easyhotspot
git pull
 Una vez hecho esto ya contamos con la última versión de la interfaz web, ahora debemos actualizar la base de datos (por eso la insistencia en no cargar ninguna configuración personalizada):

cd /opt/local/web/easyhotspot/install
Si listamos (ls -l) los archivos que se encuentran en la carpeta nos encontramos con tres (3) archivos .sql

database_with_sample.sqldatabase_schema_only.sql
easyhotspot_opensource_2010-10-21.sql
Particularmente usé easyhotspot_opensource_2010-10-21.sql, esto lo hacemos con:
$ mysql -u root -p easyhotspot_opensource < easyhotspot_opensource_2010-10-21.sql
La clave por defecto del MySQL es "easyhotspot", lo siguiente que hice fue cargar la configuración de la compañía a la que se le instalaría el hotspot en el archivo:

/opt/local/web/easyhotspot/htdocs/system/application/config/easyhotspot.php

En el podremos cambiar el nombre, dirección, separador de miles, decimales, entre otra cosas.

Para la mayoría esto, además de los pasos que se indican en la página, es suficiente para tener el servidor en funcionamiento, sin embargo tuve que cambair la pantalla de inicio de sesión para los clientes que por defecto se vé así:



El el foro de EasyHotspot podemos encontrar cómo cambiar la pantalla de inicio de sesión usando Php, pero como la solución no me funcionó decidí modificar directamente el cgi que está escrito en Perl  y se encuentra en:
/opt/local/web/easyhotspot/hotspot/hotspotlogin.cgi
Recomiendo hacer una copia de respaldo antes en caso de que algo no funcione bien, poder restaurarlo al estado inicial, hay que ser cuidadoso, una comilla mal puesta y no iniciará sesión adecuadamente.. El resultado fue algo como esto:


Obviamente taché los nombres de la compañía para evitar "detalles" legales. El cambio de clave Lo agregué yo, no forma parte de la solución y fue un requerimiento de los clientes. Es un script Php que actualiza las tablas en las que se encuentran los datos de registro de los clientes (postpaid_account y radcheck).

Si quieren más detalles acerca de la instalación o las modificaciones realizadas no duden en preguntar o comentar.