lunes, 6 de enero de 2014

Enseñar a programar

Navegando me tope con este inetesante sitio http://code.org/ en el cual proponen que dediques una hora de tu tiempo a aprender los fundamentos de programación desde cero con una técnica educativa muy entretenida, asi que si quieres aprender a programar desde cero ó inculcarles a tus hijos ó sobrinos el arte de programar esta página es la indicada.
No hace referencia a un lenguaje en especial pero te da las pautas para entender la programación.


domingo, 30 de junio de 2013

DAME TU OPINION


Me gustaria conocer tu opinion respecto a este Blog, te pido que me des un minuto de tu tiempo llenando este encuesta


 Si no puedes ingresar copia y pega esta direcciòn:
https://docs.google.com/forms/d/1MPTDH8YtDppUOocC0Z-AYJ009jQ58lGqTeUM3lOH9M4/viewform

martes, 13 de julio de 2010

Como habilitar la sección de MACROS en Excel 2010

Bueno hace algún tiempo tenía que validar el número de identificación de más de 1000 personas y los datos estaban almacenados en Excel y bueno opte por escribir una pequeña Macro en Excel pero sorpresa, la interfaz de MS Office 2010 (Excel) al igual que la del Office 2007 había cambiado, y bueno pase un buen rato tratando de habilitar la famosa barra, y bueno aquí les muestro como habilitar dicha barra.

Pasos:
  1. Hacemos clic en la pestaña “File” o “Archivo

2) Una vez desplegado el menú seleccionamos “Options” o “Opciones


3) Una vez desplegada la ventana de opciones seleccionamos la opción “Customize Ribbon” ó “Personalizar cinta

4) En la columna derecha existe una casilla nombrada “Developer” o “Desarrollo”, pues procedemos a seleccionar dicha casilla y posteriormente presionamos “Aceptar” y podremos ver que aparece en el Ribbon la pestaña nombrada “developer” o “desarrollador” como se puede ver en las imágenes.


viernes, 21 de mayo de 2010

Felz Cumpleaños PAC MAN

Pues si hoy 21 de Mayo es el cumpleaños de este juego que en su tiempo nos saco del aburrimiento antes que existan los actuales juegos con interfaz grafica tan impresionante.

Google dijo Feliz Cumpleaños a su estilo, hoy al ingresar a google se mostraba esa imagen del juego que era una version de este gran juego y la cual tenia sonido.

jueves, 13 de mayo de 2010

Llegamos a los 27

Pues si, este inicio de semana llegue a mis 27 añitos, ya mismo llego a los 30 :S pero bueno asi toca.
PD: El adorno de rosa (quinceañera) es una joda de mi hermano menor.
Espero este año darme tiempo para poder publicar nuevos articulos ya que como no he tenido tiempo me he descuidado.

lunes, 7 de diciembre de 2009

Editores de PHP

Bueno hace ya un año me he dedicado a tratar de entender a PHP y pudedo decir que aun me falta mucho para dominar este lenguaje pero eso es otro tema. Pero PHP es un lenguaje espectacular pero aun le falta madurar un poco en lo relacionado a la POO.

Para desarrollar en PHP solo necesitamos el block de notas y tener instalado PHP y APACHE pero para una manera profesional esto no es nada elegante, pues quiero listarte algunos de los editores profesionales IDE's:
1.- Zend Studio 7.0 (Licenciado)
2.- Aptana Studio
3.- NetBeans
4.- Adobe Dramewaver (Licenciado)

El 4to Adobe Dramewaver es una buena herramienta pero para desarrollar unicamente la parte de HTML pero para PHP es aun una herramienta incompleta. Por otro lado NetBeans este IDE mas usado y conocido para JAVA tambien ha implementado la capacidad para realizar proyectos de PHP pero realmente a mi criterio aun le falta mucho ya que al tratar de usar el auto completar se congela (cuelga) por unos segundo la aplicacion y eso es un verdadero fastidio, tambien tenemos Aptana Studio, este es un IDE que tiene buenas funcionalidades pero lo malo es que al correr con java parece que se colapsa la memoria y hace que el editor se colapse (ojo no estoy afirmando o diciendo que java es malo ó que el IDE en cuestion es malo) este IDE es licenciado pero pueden descargarlo y usarlo sin contar con licencia pero con las características limitadas, por último tenemos a Zend Studio este IDE es licenciado y lo he empezado a usar y hasta el momento no me ha dado problemas, compila bien, su autocompletado no da problemas, el unico impedimento es que su licencia es un poquito cara, pero creo que vale la pena invertir, pueden descargar la version de evaluacion y probar por si mismos, me atrevo a decir que es el equivalente de Visual Studio .Net para PHP

Formatear Salida por Consola

Bueno algunas veces necesitamos imprimir en consola con un Console.WriteLine algo y muchas de las veces tenemos que separar los datos en pantalla y por lo general recurrimos a imprimir caracteres en blanco, lo que buscamos al formatear una cadena es obtener algo como esto
Item Detalle
---------------------
1 Detalle1
1 Detalle1
1 Detalle1
En el que se muestre las columnas rectas y no disparejas para lo cual hacemos lo siguiente en la cadena que va dentro de un Console.WrieteLine debe tener este formato "{,}".
Si codificaramos podria verse el codigo algo asi:

static void Main(string[] args)
{
int item = 1;
string descripcion = "esfero";
double precio = 2.44;
Console.WriteLine("--Sin formatear la cadena--");
Console.WriteLine("ITEM | DESCRIPCION | PRECIO");
Console.WriteLine("{0} | {1} | {2}", item, descripcion, precio);
Console.WriteLine("{0} | {1} | {2}", item, descripcion, precio);
Console.WriteLine("{0} | {1} | {2}", item, descripcion, precio);
Console.WriteLine("-----------------------------------");
Console.WriteLine("--Formateaando la cadena--");
Console.WriteLine("{0,5} {1,15}{2,10}", "ITEM","DESCRIPCION","PRECIO");
Console.WriteLine("{0,5} {1,15}{2,10}", item, descripcion, precio);
Console.WriteLine("{0,5} {1,15}{2,10}", item, descripcion, precio);
Console.WriteLine("{0,5} {1,15}{2,10}", item, descripcion, precio);
Console.Read();

Esto nos daria como resultado algo como esto
Lindo verdad, asi podras generar pantallas mas agradables

jueves, 23 de julio de 2009

Ontología sobre Licencias Creative Commons

Empecemos por lo básico “El término ontología en informática hace referencia a la formulación de un exhaustivo y riguroso esquema conceptual dentro de uno o varios dominios dados; con la finalidad de facilitar la comunicación y la compartición de la información entre diferentes sistemas y entidades. Aunque toma su nombre por analogía, ésta es la diferencia con el punto de vista filosófico de la palabra ontología”( WIKIPEDIA), pero si queremos expresarlo en términos más simples una ontología es la representación de conocimiento a través de un lenguaje formal, y para poder representar dicho conocimiento podemos valernos de mapas conceptuales, diagramas de clases ó diagramas Entidad Relación.

El presente trabajo es una ontología sobre los tipos de licencias Creative Commons, el cual responde a la pregunta: ¿Como identificar un tipo de licencia Creative Commons empleado en una obra?, el cual nos servirá como herramienta de conocimiento para poder realizar esta tarea; también desprende algunos otros usos como tener la capacidad de conocer las diferentes conformaciones de este tipo de licencias.

Definamos antes de empezar a analizar el mapa conceptual de nuestra ontología que comprende Creative Commons.

Creative Commons
Las licencias Creative Commons se enmarcan dentro de las alternativas que surgen a raíz de la tendencia del libre acceso al conocimiento. Nacen como un reto a una necesidad obligatoria consignada por el derecho de autor, que si bien sigue vigente ha sido desbordado por los progresos tecnológicos, convirtiéndose sin desearlo en una barrera legal ante la necesidad de la sociedad de poder acceder a esos productos intelectuales, que aun cuando suene paradójico constituye a la vez un derecho. El objetivo principal de las licencias Creative Commons es esencialmente la de gestionar derechos, es decir liberar unos y conservar otros con la voluntad de sus titulares. Dando la posibilidad al autor según sus requerimientos de autorizar el uso de su producción intelectual y a la vez posicionándolo en el mundo entero (Creative Commons).


A continuación se listan los cambios realizados de mapas conceotuales en los que se ha representado el conocimiento. Tambien se puede tener acceso a las mismas a aquí ó se las puede visualizar una a una de la siguiente lista.
Los archivos con las ontologias desarrolladas con CMAPCOE pueden ser encontrados en:
Servidor: http://homam.ihmc.us:8080
Directorio: /USERS/UTPL-ECC/lecastillox/Creative Commons

Documentación aquí

  • WIKIPEDIA- Ontologia Informatica, http://es.wikipedia.org/wiki/Ontolog%C3%ADa_%28inform%C3%A1tica%29
  • Creative Commons, http://creativecommons.org

jueves, 26 de marzo de 2009

Los navegadores y ASP.Net

Muchas de las veces cuando desarrollamos aplicaciones bajo ASP.Net surgen muchas inquietudes y problemas ya que se piensa en los tipos de navegadores que el cliente puede usar, algunos prefieren IE, otros Mozilla Firefox, Safari y los más exóticos Crome y es cuando los desarrolladores tienen que elaborar las aplicaciones para que se auto configuren dependiendo del navegador, algunos prefieren escribir código ya sea C# o VB.Net algo como esto:

if (Request.Browser.Browser == "IE")
Label1.Text = "usted usa internet explorer como navegador";
else
Label1.Text = "Usted usa un navegador que no es IE";

El problema de esto es que tiene que ejecutarce en el servidor, y como ya sabran hay que optimizar el uso del servidor cuando se tenga que generar un determinado tipo de etiqueta para ser usado en un determinado tipo de cliente.

Tomando como ejemplo del código anterior, se podría presentar el siguiente ejemplo, supongamos que tenemos una aplicación web en la que los clientes deban usarla a través de IE ya que en otros navegadores surge inconvenientes por determinadas cuestiones ya sean javascripts hojas de estilos, etc., el desarrollador común optaría por escribir algo asi:

if (Request.Browser.Browser != "IE")
{
Label1.Text = "usted NO usa internet explorer como navegador";
Button1.Enabled = “false”;

}

Esto se podría eliminar usando únicamente código ASP empecemos examinando el código ASP de un Label

<asp:Label ID="Label1" runat="server"
Text="Aquí se escribe el texto OK" >
</asp:Label>

Como podemos observar se maneja un estilo de etiquetas que representan propiedades del constrol, como el ID que representa el identificador del control, el Text el cual es una propiedad para definir una cadena de caracteres.

Muy bien una vez que entendieron lo anterior examinemos el siguiente codigo

<asp:Label ID="Label1" runat="server" Text=""
ie:Text="Usted esta usando Internet Explorer"
mozilla:Text="Usted esta unsando Mozilla Firefox" >
</asp:Label>

Como podemos observar en la 2da, 3era y 4ta linea tenemos la propiedad TEXT en la segunda linea si nos fijamos esta el nombre de la propiedad antepuesto IE y MOZILLA (los cuales hacen referencia a Internet Explorer y Mozilla) esto le indicara al ASP que identifique el tipo de navegador y presente la que corresponder si ejecutamos el codigo podemos ver el resultado

Usted está usando Internet Explorer (en el caso de que su navegador sea IE)

No solo se puede hacer lo anterior para definir un tipo de texto, tambien se puede usar para otras propiedades si no me creen miren el siguiente codigo

<asp:Label ID="Label1" runat="server"
Text=""
ie:Text="IE"
mozilla:Text="Firefox"
ie:BackColor="Blue"
mozilla:BackColor="Red"
>

</asp:Label>

Y el resultado es

Si deseamos usarlo en otro tipo de control como un Button podemos hacerlo y para muestra el ejemplo

<asp:Button ID="Button1" runat="server"
Text="Button"
ie:Text="Internet Explorer"
mozilla:Text="Mozilla Firefox"
ie:Enabled="false"
mozilla:Enabled="true"
ie:BackColor="Orange"

/>

Espero que les sea de ayuda

lunes, 9 de marzo de 2009

miércoles, 4 de marzo de 2009

Acerca de mi

Mi nombre es Luis Enrique Castillo tengo 26 años y soy de la ciudad de Loja ubicada al sur del Ecuador, actualmente egresado de la carrera de Ingeniería en Sistemas Informáticos en la Universidad Técnica Particular de Loja y también estoy cursando la carrera de Administración de Empresas en la Universidad Nacional de Loja.
En el 2006 fuí nombrado por Microsoft del Ecuador como Microsoft Student Partner, he quedado como finalista de la región andina en el concurso de Imagine Cup 2006 y finalista nacional en el año 2007 en dicha competición, además he sido conferencista en algunos eventos y en este 2008 me certifique como Administrador de Servidores Linux otorgado por IBM.
He trabajado en .Net desde el 2003 hasta la actualidad y he desarrollado algunos proyectos bajo esta tecnología.
Curriculo

sábado, 28 de febrero de 2009

Azure Services Plataform


Hace algunos meses Microsoft lanzo Azure el cual era un compendio de servicios que ofrecia dentro de su línea de herramientas Web 2.0 en fin aquí les dejo un link para que puedan ingresar a Webcast, Potcast y laboratorios virtuales con un manuales muy buenos y la posibilidad de desarrollarlo en una maquina virtual hospedada en los servidores de Mirosoft.

http://www.microsoft.com/events/series/azure.aspx?tab=overview

lunes, 23 de febrero de 2009

Six ways to make Web 2.0 work

Web 2.0 tools present a vast array of opportunities—for companies that know how to use them.
FEBRUARY 2009 • Michael Chui, Andy Miller, and Roger P. Roberts

Technologies known collectively as Web 2.0 have spread widely among consumers over the past five years. Social-networking Web sites, such as Facebook and MySpace, now attract more than 100 million visitors a month. As the popularity of Web 2.0 has grown, companies have noted the intense consumer engagement and creativity surrounding these technologies. Many organizations, keen to harness Web 2.0 internally, are experimenting with the tools or deploying them on a trial basis.

jueves, 19 de febrero de 2009

Armando un Cluster

El término cluster se aplica a los conjuntos o conglomerados de computadoras construidos mediante la utilización de componentes de hardware comunes y que se comportan como si fuesen una única computadora. La tecnología de clusters ha evolucionado en apoyo de actividades que van desde aplicaciones de supercómputo y software de misiones críticas, servidores Web y comercio electrónico, hasta bases de datos de alto rendimiento, entre otros usos.


El cómputo con clusters surge como resultado de la convergencia de varias tendencias actuales que incluyen la disponibilidad de microprocesadores económicos de alto rendimiento y redes de alta velocidad, el desarrollo de herramientas de software para cómputo distribuido de alto rendimiento, así como la creciente necesidad de potencia computacional para aplicaciones que la requieran.


Simplemente, cluster es un grupo de múltiples ordenadores unidos mediante una red de alta velocidad, de tal forma que el conjunto es visto como un único ordenador, más potente que los comunes de escritorio.


Clusters son usualmente empleados para mejorar el rendimiento y/o la disponibilidad por encima de la que es provista por un solo computador típicamente siendo más económico que computadores individuales de rapidez y disponibilidad comparables.


De un cluster se espera que presente combinaciones de los siguientes servicios:

  1. Alto rendimiento
  2. Alta disponibilidad
  3. Equilibrio de carga
  4. Escalabilidad

La construcción de los ordenadores del cluster es más fácil y económica debido a su flexibilidad: pueden tener todos la misma configuración de hardware y sistema operativo (cluster homogéneo), diferente rendimiento pero con arquitecturas y sistemas operativos similares (cluster semi-homogéneo), o tener diferente hardware y sistema operativo (cluster heterogéneo), lo que hace más fácil y económica su construcción.

El clustering ha estado impulsando poder detrás de muchas de las supercomputadoras científicas más poderosas del mundo durante muchos años y ahora está siendo usado cada vez más como una forma efectiva en costos, a fin de proveer computación de alta performance y disponibilidad para una amplia variedad de cargas de trabajo comerciales, tales como business intelligence, diseño de ingeniería, análisis financiero, medios digitales y exploración de petróleo.

El clustering es la práctica de conectar múltiples procesadores o servidores para cooperar en cargas de trabajo complejas como un único recurso de computación unificada. Dado que se comporta como un único gran recurso, un sistema con cluster le ofrece muchos beneficios valiosos a un entorno de e-business moderno, incluyendo:


  • Alta capacidad de procesamiento- combinando el poder de múltiples servidores, los sistemas con cluster pueden resolver cargas de trabajo grandes y complejas. Un cliente pudo reducir el tiempo para realizar trabajos de ingeniería claves de días a horas, acortando así el tiempo al mercado para su nuevo producto.
  • Consolidación de recursos- Un único cluster puede acomodar múltiples cargas de trabajo y variar el poder de procesamiento asignado a cada carga de trabajo según se requiera; esto hace que los clusters sean ideales para la consolidación de los recursos y optimicen su utilización.
  • Uso óptimo de los recursos- Los sistemas individuales generalmente manejan una única carga de trabajo y deben ser adaptados en tamaño para acomodar picos de demandas que se esperan para esa carga; esto significa que en general pueden ejecutar bien por debajo de su capacidad, pero que pueden "fallar" si la demanda excede la capacidad, aun cuando otros sistemas estén inactivos. Dado que comparten un enorme poder de procesamiento a través de múltiples cargas de trabajo, los sistemas con cluster pueden manejar un pico de demanda - asimismo uno inesperado - aumentando temporalmente el compartir el procesamiento para esa carga de trabajo, obteniendo así las ventajas de una capacidad no utilizada.
  • Consolidación geográfica del servidor - Además de la consolidación de servidores que se describe más arriba, algunos clientes también comparten poder de procesamiento en el mundo; por ejemplo, desviando el procesamiento de transacciones US diurnas a sistemas en Japón que estén relativamente inactivos durante la noche.
  • Disponibilidad 24 x 7 con protección de failovers- Dado que el procesamiento se esparce a través de múltiples máquinas, los sistemas con cluster son altamente tolerantes a fallas: si un sistema falla, los otros siguen funcionando.
  • Recuperación de desastres- Los clusters pueden abarcar múltiples sitios geográficos, de modo que aun cuando todo un sitio sea víctima de una interrupción de la alimentación u otro desastre, las máquinas remotas continuarán funcionando.
  • Escalabilidad horizontal y vertical sin tiempo de inactividad- a medida que la empresa requiera crecer, al cluster se le puede agregar poder de procesamiento adicional sin interrumpir las operaciones.
  • Administración centralizada de los sistemas- IBM ofrece herramientas que permiten el despliegue, el mantenimiento y el monitoreo de clusters grandes y distribuidos desde un único punto de control.


Beneficios de la Tecnología Cluster

Las aplicaciones paralelas escalables requieren: buen rendimiento, baja latencia, comunicaciones que dispongan de gran ancho de banda, redes escalables y acceso rápido a archivos. Un cluster puede satisfacer estos requerimien
tos usando los recursos que tiene asociados a él.

Los clusters ofrecen las siguientes características a un costo relativamente bajo:
  • Alto Rendimiento.
  • Alta Disponibilidad.
  • Alta Eficiencia.
  • Escalabilidad.

La tecnología cluster permite a las organizaciones incrementar su capacidad de procesamiento usando tecnología estándar, tanto en componentes de hardware como de software que pueden adquirirse a un costo relativamente bajo.

Clasificación de los Clusters

El término cluster tiene diferentes connotaciones para diferentes grupos de personas. Los tipos de clusters, establecidos en base al uso que se dé a los clusters y los servicios que ofrecen, determinan el significado del término para el grupo que lo utiliza. Los clusters pueden clasificarse con base en sus características. Se pueden tener clusters de alto rendimiento (HPC – High Performance Clusters), clusters de alta disponibilidad (HA – High Availability) o clusters de alta eficiencia (HT – High Throughput).

Alto rendimiento: Son clusters en los cuales se ejecutan tareas que requieren de gran capacidad computacional, grandes cantidades de memoria, o ambos a la vez. El llevar a cabo estas tareas puede comprometer los recursos del cluster por largos periodos de tiempo.

Alta disponibilidad: Son clusters cuyo objetivo de diseño es el de proveer disponibilidad y confiabilidad. Estos clusters tratan de brindar la máxima disponibilidad de los servicios que ofrecen. La confiabilidad se provee mediante software que detecta fallos y permite recuperarse frente a los mismos, mientras que en hardware se evita tener un único punto de fallos.

Alta eficiencia: Son clusters cuyo objetivo de diseño es el ejecutar la mayor cantidad de tareas en el menor tiempo posible. Existe independencia de datos entre las tareas individuales. El retardo entre los nodos del cluster no es considerado un gran problema.

Componentes de un Cluster

En general, un cluster necesita de varios componentes de software y hardware para poder funcionar. A saber:

  • Nodos (Computadores que conforman el cluster)
  • Sistemas Operativos
  • Conexiones de Red
  • Middleware
  • Protocolos de Comunicación y servicios
  • Aplicaciones
  • Ambientes de Programación Paralela

Sistemas Clusters Implementados

Google: Durante el año 2003, el cluster Google llegó a estar conformado por más de 15.000 computadores personales. En promedio, una consulta en Google lee cientos de megabytes y consume algunos billones de ciclos del CPU.

Cluster X: En la lista “TOP 500” de noviembre de 2004 fue considerado el séptimo sistema más rápido del mundo; sin embargo, para julio de 2005 ocupa la posición catorce. Cluster X fue construido en el Tecnológico de Virginia en el 2003; su instalación fue realizada por estudiantes del Tecnológico. Está constituido por 2200 procesadores Apple G5 de 2.3 GHz. Utiliza dos redes: Infiniband 4x para las comunicaciones entre procesos y Gigabit Ethernet para la administración. Cluster X posee 4 Terabytes de memoria RAM y 176 Terabytes de disco duro, su rendimiento es de 12.25 TFlops. Se lo conoce también como Terascale.



Un buen ejemplo de un cluster implementado es el que se realizo en Virginia Tech aquí les dejo un video



En el siguiente video podemos ver como instalar y usar DEINO el cual nos permite implementar un pequeño cluster con MPI.
Para poder realizar dicho cometido procederemos a ingresar a la siguiente pagina web: http://mpi.deino.net/ y procedemos a descargar la ultima
version de deinompi(DeinoMPI.1.1.0.msi), esta distrubución es para uso único en plataformas Windows pero hay diferentes distribuciones que se pueden usar en Linux y OSX









Fuente:

http://www.ibm.com/ec/systems/clusters/about/index.phtml

http://es.wikipedia.org/wiki/Cluster_(inform%C3%A1tica)

http://mmc.igeofcu.unam.mx/mmc/Cluster/Bibliografia/?C=M;O=D

Interfaz de Paso de Mensajes - MPI

En el presente artículo queria explicarles en que consistia el MPI, pero navegando por Internet encontre este artículo en Wikipedia el cual me parecio el indicado para darles a conocer en que consiste el famoso MPI, espero que al leerlo logren entenderlo en realidad es algo muy simple; siempre y cuando se entienda que es y como funciona, al final del post encontraran unos links en los que pueden acceder a mas información y de la que en un futuro utilizaremos.

Fuente
: http://es.wikipedia.org/wiki/MPI

Empecemos definiendo MPI en ingles quiere decir Message Passing Interface que traducido al español significa Interfaz de Paso de Mensajes a final de cuentas es un estándar que define la sintaxis y la semántica de las funciones contenidas en una biblioteca de paso de mensajes diseñada para ser usada en programas que exploten la existencia de múltiples procesadores.

El paso de mensajes es una técnica empleada en programación concurrente para aportar sincronización entre procesos y permitir la exclusión mutua, de manera similar a como se hace con los semáforos, monitores, etc.

Su principal característica es que no precisa de memoria compartida, por lo que es muy importante en la programación para sistemas distribuidos.
Los elementos principales que intervienen en el paso de mensajes son el proceso que envía, el que recibe y el mensaje.

Dependiendo de si el proceso que envía el mensaje espera a que el mensaje sea recibido, se puede hablar de paso de mensajes síncrono o asíncrono. En el paso de mensajes asíncrono, el proceso que envía, no espera a que el mensaje sea recibido, y continúa su ejecución, siendo posible que vuelva a generar un nuevo mensaje y a enviarlo antes de que se haya recibido el anterior. Por este motivo se suelen emplear buzones, en los que se almacenan los mensajes a espera de que un proceso los reciba. Generalmente empleando este sistema, el proceso que envía mensajes solo se bloquea o para, cuando finaliza su ejecución, o si el buzón está lleno. En el paso de mensajes síncrono, el proceso que envía el mensaje espera a que un proceso lo reciba para continuar su ejecución. Por esto se suele llamar a esta técnica encuentro, o rendezvous. Dentro del paso de mensajes síncrono se engloba a la llamada a procedimiento remoto, muy popular en las arquitecturas cliente/servidor.

La Interfaz de Paso de Mensajes (MPI - Message Passing Interface) es un protocolo de comunicación entre computadoras. Es el estándar para la comunicación entre los nodos que ejecutan un programa en un sistema de memoria distribuida. Las implementaciones en MPI consisten en un conjunto de bibliotecas de rutinas que pueden ser utilizadas en programas escritos en los lenguajes de programación C, C++, Fortran y Ada. La ventaja de MPI sobre otras bibliotecas de paso de mensajes, es que los programas que utilizan la biblioteca son portables (dado que MPI ha sido implementado para casi toda arquitectura de memoria distribuida), y rápidos, (porque cada implementación de la biblioteca ha sido optimizada para el hardware en la cual se ejecuta).

Historia
La mayoría de los vendedores de computadoras concurrentes estaban involucrados con MPI, así como con investigadores de diferentes universidades, laboratorios del gobierno e industrias.
El proceso de estandarización comenzó en el taller de estándares para el paso de mensajes en un ambiente con memoria distribuida, patrocinado por el Centro de Investigación en Computación Paralela en Williamsburg, Virginia,Estados Unidos (Abril 29-30 de 1992).

Se llegó a una propuesta preliminar conocida como MPI1, enfocada principalmente en comunicaciones punto a punto sin incluir rutinas para comunicación colectiva y no presentaba tareas seguras.

El estándar final por el MPI fue presentado en la conferencia de Supercómputo en Noviembre de 1993, constituyéndose así el foro para el MPI.

En un ambiente de comunicación con memoria distribuida en la cual las rutinas de paso de mensajes de nivel bajo, los beneficios de la estandarización son muy notorios. La principal ventaja al establecer un estándar para el paso de mensajes es la portabilidad y el ser fácil de utilizar. MPI-1 apareció en 1994, el estándar MPI-2 fue lanzado en 1997

Fundamentos de MPI
Con MPI el número de procesos requeridos se asigna antes de la ejecución del programa, y no se crean procesos adicionales mientras la aplicación se ejecuta. A cada proceso se le asigna una variable que se denomina rank, la cual identifica a cada proceso, en el rango de 0 a p-1, donde p es el número total de procesos. El control de la ejecución del programa se realiza mediante la variable rank; la variable rank permite determinar que proceso ejecuta determinada porción de código. En MPI se define un comunicator como una colección de procesos, los cuales pueden enviar mensajes el uno al otro; el comunicator básico se denomina MPI_COMM_WORLD y se define mediante un macro del lenguaje C. MPI_COMM_WORLD agrupa a todos los procesos activos durante la ejecución de una aplicación.

Las llamadas de MPI se dividen en cuatro clases:
1. Llamadas utilizadas para inicializar, administrar y finalizar comunicaciones.
2. Llamadas utilizadas para transferir datos entre un par de procesos.
3. Llamadas para transferir datos entre varios procesos.
4. Llamadas utilizadas para crear tipos de datos definidos por el usuario.

La primera clase de llamadas permiten inicializar la biblioteca de paso de mensajes, identificar el número de procesos (size) y el rango de los procesos (rank). La segunda clase de llamadas incluye operaciones de comunicación punto a punto, para diferentes tipos de actividades de envío y recepción. La tercera clase de llamadas son conocidas como operaciones grupales, que proveen operaciones de comunicaciones entre grupos de procesos. La última clase de llamadas provee flexibilidad en la construcción de estructuras de datos complejos. En MPI, un mensaje está conformado por el cuerpo del mensaje, el cual contiene los datos a ser enviados, y su envoltura, que indica el proceso fuente y el destino. El cuerpo del mensaje en MPI se conforma por tres piezas de información: buffer, tipo de dato y count. El buffer, es la localidad de memoria donde se encuentran los datos de salida o donde se almacenan los datos de entrada. El tipo de dato, indica el tipo de los datos que se envían en el mensaje. En casos simples, éste es un tipo básico o primitivo, por ejemplo, un número entero, y que en aplicaciones más avanzadas puede ser un tipo de dato construido a través de datos primitivos. Los tipos de datos derivados son análogos a las estructuras de C. El count es un número de secuencia que junto al tipo de datos permiten al usuario agrupar ítems de datos de un mismo tipo en un solo mensaje. MPI estandariza los tipos de datos primitivos, evitando que el programador se preocupe de las diferencias que existen entre ellos, cuando se encuentran en distintas plataformas. La envoltura de un mensaje en MPI típicamente contiene la dirección destino, la dirección de la fuente, y cualquier otra información que se necesite para transmitir y entregar el mensaje. La envoltura de un mensaje en MPI, consta de cuatro partes: la fuente, el destino, el comunicator y una etiqueta. La fuente identifica al proceso transmisor. El destino identifica al proceso receptor. El comunicator especifica el grupo de procesos a los cuales pertenecen la fuente y el destino. La etiqueta (tag) permite clasificar el mensaje. El campo etiqueta es un entero definido por el usuario que puede ser utilizado para distinguir los mensajes que recibe un proceso. Por ejemplo, se tienen dos procesos A y B. El proceso A envía dos mensajes al proceso B, ambos mensajes contienen un dato. Uno de los datos es utilizado para realizar un cálculo, mientras el otro es utilizado para imprimirlo en pantalla. El proceso A utiliza diferentes etiquetas para los mensajes. El proceso B utiliza los valores de etiquetas definidos en el proceso A e identifica que operación deberá realizar con el dato de cada mensaje.

Llamadas utilizadas para inicializar, administrar y finalizar comunicaciones
MPI dispone de 4 funciones primordiales que se utilizan en todo programa con MPI. Estas funciones son MPI_Init, MPI_Comm_size, MPI_Comm_rank y MPI_Finalize. MPI_Init permite inicializar una sesión MPI. Esta función debe ser utilizada antes de llamar a cualquier otra función de MPI. MPI_Finalize permite terminar una sesión MPI. Esta función debe ser la última llamada a MPI que un programa realice. Permite liberar la memoria usada por MPI. MPI_Comm_size permite determinar el número total de procesos que pertenecen a un comunicator. MPI_Comm_rank permite determinar el identificador (rank) del proceso actual.

Llamadas utilizadas para transferir datos entre dos procesos
La transferencia de datos entre dos procesos se consigue mediante las llamadas MPI_Send y MPI_Recv. Estas llamadas devuelven un código que indica su éxito o fracaso. MPI_Send permite enviar información desde un proceso a otro. MPI_Recv permite recibir información desde otro proceso. Ambas funciones son bloqueantes, es decir que el proceso que realiza la llamada se bloquea hasta que la operación de comunicación se complete. Las versiones no bloqueantes de MPI_Send y MPI_Recv son MPI_Isend y MPI_Irecv, respectivamente. Estas llamadas inician la operación de transferencia pero su finalización debe ser realizada de forma explícita mediante llamadas como MPI_Test y MPI_Wait. MPI_Wait es una llamada bloqueante y retorna cuando la operación de envío o recepción se completa. MPI_Test permite verificar si la operación de envío o recepción ha finalizado, esta función primero chequea el estado de la operación de envío o recepción y luego retorna.

Llamadas utilizadas para transferir datos entre varios procesos
MPI posee llamadas para comunicaciones grupales que incluyen operaciones tipo difusión (broadcast), recolección (gather), distribución (scatter) y reducción. Algunas de las funciones que permiten realizar transferencia entre varios procesos se presentan a continuación. MPI_Barrier permite realizar operaciones de sincronización. En estas operaciones no existe ninguna clase de intercambio de información. Suele emplearse para dar por finalizada una etapa del programa, asegurándose de que todos los procesos han terminado antes de dar comienzo a la siguiente. MPI_Bcast permite a un proceso enviar una copia de sus datos a otros procesos dentro de un grupo definido por un comunicator. MPI_Scatter establece una operación de distribución, en la cual un dato (arreglo de algún tipo de datos) se distribuye en diferentes procesos. MPI_Gather establece una operación de recolección, en la cual los datos son recolectados en un sólo proceso. MPI_Reduce permite que el proceso raíz recolecte datos desde otros procesos en un grupo, y los combine en un solo ítem de datos. Por ejemplo, se podría utilizar una operación reducción, para calcular la suma de los elementos de un arreglo que se distribuyó en algunos procesos.
Llamadas utilizadas para crear tipos de datos definidos por el usuario
Para definir nuevos tipos de datos se puede utilizar la llamada MPI_Type_struct para crear un nuevo tipo o se puede utilizar la llamada MPI_Pack para empaquetar los datos.

Características de MPI
• Estandarización.
• Portabilidad: multiprocesadores, multicomputadores, redes, heterogéneos, ...
• Buenas prestaciones.
• Amplia funcionalidad.
• Existencia de implementaciones libres (mpich, LAM-MPI, ...)
La especificación detalla las funciones que se pueden utilizar, no el modo como se compilan y lanzan-ejecutan los programas, lo cual puede variar de una implementación a otra.
Siguiendo el modelo SPMD, el usuario escribirá su aplicación como un proceso secuencial del que se lanzarán varias instancias que cooperan entre sí.
Los procesos invocan diferentes funciones MPI que permiten
• iniciar, gestionar y finalizar procesos MPI
• comunicar datos entre dos procesos
• realizar operaciones de comunicación entre grupos de procesos
• crear tipos arbitrarios de datos

Funciones básicas
Cualquier programa paralelo con MPI puede implementarse con tan sólo 6 funciones, aunque hay muchas más funciones para aspectos avanzados. Todas ellas empiezan por MPI_ y obligan a que todos los programas escritos en MPI contengan la directiva:

#include "mpi.h"

Este fichero contiene las definiciones, macros y prototipos de función necesarios para compilar los programas MPI.

Antes de llamar a cualquier otra función MPI debe hacer una llamada a MPI_Init(); esta función sólo debe ser llamada una vez. Sus argumentos son punteros a los parámetros de la función main(), argc y argv. Esta función permite al sistema hacer todas la configuraciones necesarias para que la biblioteca MPI pueda ser usada. Después de que el programa haya acabado de utilizar la biblioteca MPI se debe hacer una llamada a MPI_Finalize(). La función MPI_Finalize() limpia todos los trabajos no finalizados dejados por MPI. Los programas MPI deben ser obligatoriamente inicializados y finalizados en MPI (MPI_Init, MPI_Finalize).
MPI ofrece la función MPI_Comm_rank(), la cual retorna el identificador de un proceso en su segundo argumento. Su sintaxis es:
int MPI_Comm_rank(MPI_Comm comunicador, int* identificador)
El primer argumento es el comunicador. Esencialmente un comunicador es una colección de procesos que pueden enviarse mensajes entre sí. Normalmente para diseñar programas básicos el único comunicador que se necesitará es MPI_COMM_WORLD. Está predefinido en MPI y consiste en todos los procesos que se ejecutan cuando el programa comienza.

Muchas de las construcciones que se emplean en los programas, dependen también del número de procesos que se ejecutan. MPI ofrece la función MPI_Comm_size() para determinar dicho número de procesos. Su primer argumento es el comunicador. En el segundo argumento retorna el número de procesos pertenecientes a dicho comunicador. Su sintaxis es:
int MPI_Comm_size(MPI_Comm comunicador, int* numprocs)
La función MPI_Get_processor_name() permite conocer el nombre del procesador donde está ubicado cada proceso. Esto puede ser útil para monitorizar los programas en redes heterogéneas. Conocer en qué máquina concreta se está ejecutando un proceso específico puede ser determinante para explicar su comportamiento, para lo cual puede apoyarse con las herramientas de monitorización . La sintaxis de dicha función es la siguiente:
int MPI_Get_processor_name(char* nombre, int* longnombre)

El parámetro nombre es una cadena (vector de caracteres) cuyo tamaño debe ser al menos igual a la constante MPI_MAX_PROCESSOR_NAME. En dicho vector quedará almacenado el nombre del procesador. El parámetro longnombre es otro parámetro de salida que informa de la longitud de la cadena obtenida.

El paso de mensajes bloqueantes se lleva a cabo en los programas por las funciones MPI_Send() y MPI_Recv() principalmente. La primera función envía un mensaje a un proceso determinado. La segunda recibe un mensaje de un proceso. Éstas son las funciones más básicas de paso de mensajes en MPI.

En MPI el entorno contiene la siguiente información:
1. El identificador del proceso receptor del mensaje.
2. El identificador del proceso emisor del mensaje.
3. Una etiqueta.
4. Un comunicador.

Fichero cabecera:
1. include
Formato de las funciones: codigo_error = MPI_nombre( parámetros ... )
Inicialización: int MPI_Init ( int *argc , char ***argv )
Comunicador: Conjunto de procesos que se intercomunican. Por defecto podemos utilizar MPI_COMM_WORD , en cuyo caso el grupo de procesos es el conjunto de procesos lanzados conjuntamente para resolver un problema
Identificación de procesos: MPI_Comm_rank ( MPI_Comm comm , int *rank)
Procesos en el comunicador: MPI_Comm_size ( MPI_Comm comm , int *size)
Finalización: int MPI_Finalize ( )
Mensajes: Un mensaje estará formado por un cierto número de elementos de un mismo tipo MPI.

Tipos MPI básicos:
MPI_CHAR signed char
MPI_SHORT signed short int
MPI_INT signed int
MPI_LONG signed long int
MPI_UNSIGNED_CHAR unsigned char
MPI_UNSIGNED_SHOT unsigned short int
MPI_UNSIGNED unsigned int
MPI_UNSIGNED_LONG unsigned long int
MPI_FLOAT float
MPI_DOUBLE double
MPI_LONG_DOUBLE long double
MPI_BYTE
MPI_PACKED

Tipos MPI derivados: los construye el programador.
Envío de un mensaje a otro proceso: int MPI_Send ( void *posicion_de_memoria , int contador , MPI_Datatype tipo , int destino , int etiqueta , MPI_Comm comunicador )
Recepción de un mensaje de otro proceso:
int MPI_Recv ( void *posicion_de_memoria , int contador , MPI_Datatype tipo , int origen , int etiqueta, MPI_Comm comunicador , MPI_Status *estado)
El receptor puede emplear MPI_ANY_TAG y/o MPI_ANY_SOURCE


Material Recomendado:
Cluster Programing with MPI (
http://w3.linux-magazine.com/issue/31/MPI_Cluster_Programming.pdf)
The Message Passing Interface (MPI) standard (http://www-unix.mcs.anl.gov/mpi/)

 
Made in Loja, Ecuador