Después de una larga sed de paralelizar bucles altamente regulares en la programación numérica orientada a arrays, OpenMP Architecture Review Board (ARB) presentó OpenMP en 1997 . En los lanzamientos posteriores, el entusiasta equipo de OpenMP le agregó muchas características, incluida la paralelización de tareas, soporte para aceleradores, reducciones definidas por el usuario y mucho más. La última versión de OpenMP 5.0 se realizó en noviembre de 2018.
Open Multi-processing (OpenMP) es una técnica de paralelizar una sección (s) de código C/C++/Fortran. OpenMP también se ve como una extensión de los lenguajes C/C++/Fortran al agregarles funciones de paralelización. En general, OpenMP utiliza un modelo portátil y escalable que brinda a los programadores una interfaz simple y flexible para desarrollar aplicaciones paralelas para plataformas que van desde la computadora de escritorio normal hasta las supercomputadoras de gama alta.
HILO VS PROCESO
El sistema operativo crea un proceso para ejecutar un programa con recursos dados (memoria, registros); generalmente, diferentes procesos no comparten su memoria con otro. Un subproceso es un subconjunto de un proceso y comparte los recursos de su proceso principal, pero tiene su propia pila para realizar un seguimiento de las llamadas a funciones. Múltiples subprocesos de un proceso tendrán acceso a la misma memoria.
Arquitecturas de memoria paralela
Antes de profundizar en OpenMP, revivamos las arquitecturas de memoria paralela básicas.
Estos se dividen en tres categorías;
- Memoria compartida: OpenMP viene bajo el concepto de memoria compartida. En esto, diferentes CPU (procesadores) tendrán acceso a la misma ubicación de memoria. Dado que todas las CPU se conectan a la misma memoria, el acceso a la memoria debe manejarse con cuidado.
- Memoria distribuida: aquí, cada CPU (procesador) tendrá su propia ubicación de memoria para acceder y usar. Para que se comuniquen, todos los sistemas independientes se conectarán entre sí mediante una red. MPI se basa en una arquitectura distribuida.
- Híbrido: Híbrido es una combinación de arquitecturas compartidas y distribuidas. Un escenario simple para mostrar el poder de OpenMP sería comparar el tiempo de ejecución de un programa C/C++ normal y el programa OpenMP.
Pasos para la instalación de OpenMP
- PASO 1: Comprobar la versión GCC del compilador
gcc --version
GCC brinda soporte para OpenMP a partir de su versión 4.2.0. Entonces, si el sistema tiene un compilador GCC con una versión superior a 4.2.0, entonces debe tener las funciones de OpenMP configuradas con él.
Si el sistema no tiene el compilador GCC, podemos usar el siguiente comando
sudo apt install gcc
Para soporte más detallado para la instalación, podemos consultar aquí
- PASO 2: Configuración de OpenMP
Podemos verificar si las características de OpenMP están configuradas en nuestro compilador o no, usando el comandoecho |cpp -fopenmp -dM |grep -i open
Si OpenMP no aparece en el compilador, podemos configurarlo usando el comando
sudo apt install libomp-dev
- PASO 3: Configuración del número de subprocesos
En OpenMP, antes de ejecutar el código, podemos inicializar el número de subprocesos que se ejecutarán con el siguiente comando. Aquí, establecemos la cantidad de subprocesos que se ejecutarán en 8 subprocesos.export OMP_NUM_THREADS=8
Ejecutando el primer código en OpenMP
// OpenMP header #include <omp.h> #include <stdio.h> #include <stdlib.h> int main(int argc, char* argv[]) { int nthreads, tid; // Begin of parallel region #pragma omp parallel private(nthreads, tid) { // Getting thread number tid = omp_get_thread_num(); printf("Welcome to GFG from thread = %d\n", tid); if (tid == 0) { // Only master thread does this nthreads = omp_get_num_threads(); printf("Number of threads = %d\n", nthreads); } } }
Este programa imprimirá un mensaje que será ejecutado por varios subprocesos.
Compile: gcc -o gfg -fopenmp geeksforgeeks.c Execute: ./gfg