Atribution: https://en.wikipedia.org/wiki/User:Raul654
Un gabinete de Blue Gene/L, clasificado como el cuarto mejor superordenador del mundo de acuerdo a la clasificación TOP500 en 11/2008. Blue Gene/L es un procesador masivamente paralelo. Foto tomada por: Raul654

 

En años recientes la industria de los procesadores se enfrentaban a un verdadero reto que tenían que resolver: el aumento de la velocidad de los procesadores sin que esto repercutiera en el calor que estos generaban. En esos tiempos se llegaron a generar procesadores prototipos de Pentium 4 corriendo a 5.2GHz. Sin embargo, estos prototipos llegaron a demostrar lo difícil que sería enfriarlos. Por lo que la industria rápidamente se decantó por una solución, la tecnología multicore. Multicore, se refiere a varios núcleos dentro de un mismo procesesador, que funcionan como varios procesadores dentro de un mismo chip. Esto incrementaba el rendimiento, reducía el calor que generaban y a su vez reducía la energía que ocupaban los chips de un sólo núcleo.

Si bien ya existían computadoras con varios procesadores con una memoria compartida, el chip multicore acercó esta tecnología al usuario común, por lo que la programación paralela se está volviendo cada día más una materia para cualquier programador. ¿Pero qué es la programación paralela? La programación paralela es una forma de computación donde varios cálculos son efectuados de manera simultánea, bajo el principio de que cada problema puede ser separado en partes para su tratamiento. Este tiempo de programación es válido para equipos que tienen procesadores con varios núcleos (multicore) y computadoras con varios procesadores de memoria compartida. Sin embargo, se ha agregado un nuevo nivel de dificultad a la programación, donde las sincronización entre las subtareas y las condiciones de carreras introducen nuevos tipos de errores en los programas y nuevos retos para realmente obtener buenos resultados en ciertos problemas. También es importante considerar la llamada ley de Amdahl donde se plantea que los programas paralelos tienen un límite de mejoramiento marcado por las partes del mismo que no pueden ser paralelizados.

En 1967 Amdahl propuso la siguiente observación: “la mejora obtenida en el rendimiento de un sistema debido a la alteración de uno de sus componentes está limitada por la fracción de tiempo que se utiliza dicho componente”.

 

Para implementar este tipo de programación se ha implementado librerías que facilitan el trabajo paralelo, como son POSIX Threads, OpenMP y MPI (Message Passing Interface). Sin embargo también existen lenguajes de programación que implementan de manera automática la paralelización, pero con resultados limitados. Ejemplos de estos lenguajes de paralelizado implícito es Parallel Haskell.

Una opción muy importante para poder comenzar a programar en paralelo y desarrollar plicaciones de alto rendimiento es OpenMP, una librería nativa en C y Fortran que nos permite programar en paralelo de una manera fácil, pero a la vez potente. Veamos un pequeño ejemplo que busca los números primos en un intervalo de 0 a x.

#include<stdio.h>
#include<stdlib.h>
#include<omp.h>

int es_primo(num)
{
    int j, primo;
    for(j=1; j<=num; j++)
    {
        if((num % j)== 0 && num != j && j != 1)
            return 0;
    }
    return 1;        
};

int main(int argc, char **argv)
{
    int i, num;
    num = 1000000;
    printf("Son números primos: ");
#pragma omp parallel for
    for(i=1; i<=num; i++)
    {
        if(es_primo(i))
            printf("%d,  ", i);
    }
    printf("\n");
    return 0;
}

La programación en paralelo implica principalmente la generación de algoritmos paralelos, para aprovechar toda la potencia del hardware. Es por eso que el programador de hoy debe interrnarse cada vez más en el interesante mundo de la programación paralela y OpenMP es una perfecta herramienta para realizar esto.

Para más información puede consultar el manual Programación Paralela de la FES Cuautitán o en la página oficial de OpenMP http://openmp.org/wp/