Acerca de mi

Soy Javier Ferrer González.

Actualmente trabajo como desarrollador web backend en Uvinum, estoy finalizando el Grado en Ingeniería Informática en la FIB-UPC y doy clases en el Máster de Programación Web de Alto Rendimiento de LaSalle BCN.

En este blog encontrarás posts sobre internet, programación y reflexiones variadas.

Si quieres saber más acerca de mi, aquí tienes mi Currículum y el formulario de contacto.
Acerca de mi

Paralelizar c++ con OpenMP: (I) Introducción

OpenMP es una API para C++ que, a base de unas simples instrucciones basadas en #pragmas, nos permite paralelizar nuestras aplicaciones de forma bastante limpia.

Creo que es un paradigma de programación bastante interesante y del que hay relativamente poco material en internet, con lo que, como ya avancé en el análisis de las posibilidades de paralelización en PHP y JavaScript, voy a intentar dedicarle una serie de posts.

En qué consiste OpenMPLogo OpenMP

Aquí tenemos un algoritmo básico en C++: simplemente recorremos un vector y devolvemos el número de veces que aparece como valor una determinada key:

Pues bien, si hacemos uso de la directiva de OpenMP específica para bucles for:

Estamos consiguiendo una paralelización geométrica mediante una sola línea. Ahora bien, analicemos un poco en profundidad en qué consiste esta paralelización, cláusula a cláusula, para poder entender todo lo que está pasando ahí:

  • La sentencia se establece en un #pragma: Esta es la forma de decirle al compilador que, si sabe, interprete lo que viene a continuación “a su manera”, es decir: quién traduce la sentencia de OpenMP es el propio compilador en tiempo de compilación.
  • omp: Esta es la palabra clave que identifica todas las directivas de OpenMP, obligatoria siempre.
  • parallel: Para entender esto, primero debemos hacer una apreciación a nivel conceptual muy importante: Una de las mayores ventajas de OpenMP es que puedes delegar en él la gestión de la pila de threads, es decir, nuestra responsabilidad (por ahora) únicamente se basa en decirle qué porción del código es paralelizable, olvidándonos así de la gestión de tareas e hilos.
    Así entonces, lo único que le debemos indicar a OpenMP es cuándo inicializar la pila/team de threads. Como anteriormente no lo habíamos hecho, lo debemos hacer antes de la instrucción en la que le indicamos el bucle for (si no, ejecutaría el bucle de forma secuencial), así que simplemente incluiremos esta cláusula (parallel) después del omp anterior.
  • for: Indica que el bucle for que sigue a la declaración del #pragma, debe ser paralelizado.
    Aquí me gustaría destacar una restricción muy importante: Para que un bucle for pueda ser paralelizado, debe contener una condición de fin conocida a priori (por ejemplo, no podemos usar el típico booleano a modo de bandera).
  • reduction(+:count): Lo que hará la librería será repartir el número total de iteraciones del bucle entre los distintos hilos. Esto provoca que, por ejemplo, si hay 100 iteraciones y 4 hilos, cada uno de ellos compruebe 25 iteraciones, con lo que al acabar, “tendremos 4 variables count“, cada una con la suma de las ocurrencias de key  en su parte del vector correspondiente. Así entonces, la cláusula reduction, lo que hace es unir estas 4 variables count en una única utilizando la operación de suma para acumular el resultado de todas ellas.

Conclusión sobre la paralelización

Como programadores, considero que debemos cambiar nuestro enfoque a la hora de tratar con la gestión de threads.

Si con un procesador capaz de ejecutar dos hilos, entendemos que debemos optimizar nuestras aplicaciones para no desaprovechar la potencia de cálculo (creando así un hilo paralelo), ¿qué sentido tiene un programa que abre un sólo par de threads, en un procesador capaz de ejecutar 64?

Es en este punto donde entra en juego la paralelización independiente de la arquitectura, tal y como se puede ver en el ejemplo anterior :).

Share this Story

Posts relacionados

2 Comments

  1. Antonio Bertó

    30 octubre, 2013 at 0:31

    Interesante, me ha gustado la explicación ya que siempre lo hacen desde un punto de vista muy técnico y poco comprensible. Me gustaría ver la segunda y tercera parte de la introducción a OpenMP. Gracias por la información.

    Saludos!

    Responder

  2. […] el post sobre paralelización mediante OpenMP, ya introduje el concepto de programación paralela independiente de la arquitectura. En este post […]

    Responder

Deja un comentario

Subscríbete por email

Recibe las noticias que se publiquen en tu buzón:

Google+

Facebook