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:
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:
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:
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.
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.