Un par de años atras cuando leia en Slashdot acerca de que una nueva computadora habia logrado superar el mitico #1 del top500, me imaginaba «wow si tuviera esa computadora mi vida seria más facil y realizaria mis tareas más rapido» . . . y estaba totalmente equivocado. Si yo hubiera tenido esa computadora mis tareas ni siquiera se podrian realizar ahi, dado que no todas las aplicaciones son «clusterizables».
Aunque el principio basico del funcionamiento de una computadora es el procesamiento de datos (que son información al adquirir valor semantico para nosotros). La naturaleza misma de los datos dictaminara de que forma se van a procesar. Por ejemplo en las investigaciones asistidas por simulaciones computarizadas lo que se procesa son miles de datos de ejemplo o como parte de un estudio, para generar muchos más datos y predecir comportamientos. Caso contrario en el procesamiento de imagenes de alta definición donde lo que se procesa es una sola unidad de información de un enorme tamaño.
Las investigaciones asistidas por computadora generalmente se utilizan en campos que nada tienen que ver con la informatica y al igual que lo que imaginaba, un investigador sin capacitación y/o experiencia previa llegaria a la misma conclusion que tuve en base a falacias: Si procesa más, mi trabajo actual se procesara más rapido. Al igual que un administrador de sistemas que pelea con sus usuarios por problemas de comprension transmitidos a el via Help Desk. Un «desarrollador de aplicaciones concurrentes y paralelizables» se enfrenta con el mismo dilema «la incomprensión del diseño de cluster y las tareas que este puede realizar».
En la entrega anterior, explicaba que tipos de cluster existen. Sin embargo un cluster nos va a ser util SI y solo SI nuestras aplicaciones estan preparadas para ejecutarse en el. La diferencia entre una maquina costosa de ultima generación con un cluster formado con varias computadoras de hace dos años no radica en la capacidad de RAM, disco o de FLOPS de procesamiento que en teoria pueden ser los mismos. La diferencia radica en la forma que pueden procesar la información.
No es lo mismo un gran procesador procesando una tarea a gran velocidad que varios procesadores que procesan muchos más datos pero con menor velocidad. Y este factor determina si una aplicación es «clusterizable». Para lo cual elaboré una pequeña serie de preguntas que me diran si mi tarea califica como «aprobada para realizarse en clusters» y elegir el tipo de cluster a utilizar.
Primer criterio: ¿Los datos deben procesarse de una manera totalmente secuencial?
Este pareciera ser el criterio obvio pero a su ves el más importante. Aunque la mayoria de tareas se pueden programar de manera paralela o en hilos simples, no todas las tareas son pensadas para ser realizadas de forma paralela. Tareas como calculos físicos son paralelizables si se escribe el programa a manera de que los calculos se dividan en calculos más pequeños que compartan información. Pero algo tan básico como reproducción de video no es paralelizable ya que todos los cuadros que lo componen deben ser procesados de manera secuencial en un corto periodo de tiempo (y esto provoca que necesitemos procesadores más caros para ver peliculas HD 😛).
Si ya hemos analizado esto y nuestra respuesta es SI. Debemos elegir que tipo de cluster vamos a ocupar. Esto para tener un marco de trabajo claro y realizar nuestras busquedas.
Segundo criterio: ¿Necesito procesar muchos datos o atender muchas peticiones?
No es lo mismo procesar una gran cantidad de datos que atender peticiones medianas a distintos usuarios. Si lo que nosotros queremos es tener «más poder» para «atender más y más usuarios» lo que nosotros buscamos es un entorno de HA donde la tarea no necesariamente debe de ser paralelizable sino simplemente ejecutarse en varios nodos del cluster a manera de replica.
Segundo criterio: ¿Los calculos a realizar son independientes?
Lo que diferencia a un cluster HPC y HTC a grandes rasgos es si los calculos van a ser independientes y luego el resultado de los mismos se va a procesar en un producto final o si los calculos son solo pequeñas unidades de un calculo mayor y necesitan compartir entradas y salidas unos con otros.
Las preguntas para decidirnos por uno o por otro podrian ser:
¿Necesito ejecutar varias instancias de la aplicacion con distintas entradas?
¿Necesito procesar datos que se pueden dividir en pequeñas colecciones, procesarse y luego el resultado se puede unir de manera sencilla?
Si la respuesta a alguna de estas dos preguntas es SI, entonces el cluster a elección es un cluster HTC, el cual a su vez tambien califica para un entorno de Grid Computing automaticamente. Ya que las tareas a ejecutarse son independientes y el resultado final puede ser obtenido en base a los resultados individuales de cada tarea ejecutandose en cada uno de los nodos del cluster/nodos del Grid.
Pero es mas facil entenderlo con dibujitos 🙂
Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; es-ES; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7
Esta bien, creo que esto se te da mejor que postear o «identiquear» sobre la filosofia de tu vida.
Saludos.