Articulo de referencia

paralelismo de datos

Ejecución de trabajos secuencial frente a ejecución de trabajos en paralelo de datos El paralelismo de datos es la paralelización en múltiples procesadores en entornos de comput...

Ejecución de trabajos secuencial frente a ejecución de trabajos en paralelo de datos

El paralelismo de datos es la paralelización en múltiples procesadores en entornos de computación paralela . Se centra en distribuir los datos entre diferentes nodos, que operan sobre ellos en paralelo. Se puede aplicar a estructuras de datos regulares como arreglos y matrices, trabajando con cada elemento en paralelo. Se diferencia del paralelismo de tareas , que es otra forma de paralelismo.

Una tarea de procesamiento paralelo de datos en un array de n elementos se puede dividir equitativamente entre todos los procesadores. Supongamos que queremos sumar todos los elementos del array y que el tiempo para una sola operación de suma es Ta unidades de tiempo. En el caso de la ejecución secuencial, el tiempo que tardará el proceso será de n × Ta unidades de tiempo, ya que suma todos los elementos del array. Por otro lado, si ejecutamos esta tarea como una tarea de procesamiento paralelo de datos en 4 procesadores, el tiempo se reduciría a ( n /4) × Ta + unidades de tiempo de sobrecarga de fusión. La ejecución paralela resulta en una aceleración de 4 con respecto a la ejecución secuencial. La localidad de las referencias de datos juega un papel importante en la evaluación del rendimiento de un modelo de programación de procesamiento paralelo de datos. La localidad de los datos depende de los accesos a memoria realizados por el programa, así como del tamaño de la caché.

Historia

La explotación del concepto de paralelismo de datos comenzó en la década de 1960 con el desarrollo de la máquina Solomon. [ 1 ] La máquina Solomon, también llamada procesador vectorial , se desarrolló para acelerar el rendimiento de las operaciones matemáticas trabajando con una gran matriz de datos (operando con múltiples datos en pasos de tiempo consecutivos). La concurrencia de operaciones de datos también se explotó operando con múltiples datos al mismo tiempo usando una sola instrucción. Estos procesadores se denominaron "procesadores de matriz". [ 2 ] En la década de 1980, se introdujo el término [ 3 ] para describir este estilo de programación, que se usó ampliamente para programar Connection Machines en lenguajes de paralelismo de datos como C* . Hoy en día, el paralelismo de datos se ejemplifica mejor en las unidades de procesamiento gráfico (GPU), que utilizan ambas técnicas de operar con múltiples datos en el espacio y el tiempo usando una sola instrucción.

La mayoría del hardware de procesamiento paralelo de datos solo admite un número fijo de niveles de paralelismo, a menudo solo uno. Esto significa que dentro de una operación paralela no es posible iniciar más operaciones paralelas de forma recursiva, y que los programadores no pueden aprovechar el paralelismo de hardware anidado. El lenguaje de programación NESL fue un primer intento de implementar un modelo de programación de paralelismo de datos anidado en máquinas paralelas planas, e introdujo, en particular, la transformación de aplanamiento que convierte el paralelismo de datos anidado en paralelismo de datos plano. Este trabajo fue continuado por otros lenguajes como Data Parallel Haskell y Futhark , aunque el paralelismo de datos anidado arbitrario no está ampliamente disponible en los lenguajes de programación de paralelismo de datos actuales.

Descripción

En un sistema multiprocesador que ejecuta un único conjunto de instrucciones ( SIMD ), el paralelismo de datos se logra cuando cada procesador realiza la misma tarea sobre datos distribuidos diferentes. En algunos casos, un único hilo de ejecución controla las operaciones sobre todos los datos. En otros, diferentes hilos controlan la operación, pero ejecutan el mismo código.

Por ejemplo, consideremos la multiplicación y la suma de matrices de forma secuencial, como se explica en el ejemplo.

Ejemplo

A continuación se muestra el pseudocódigo secuencial para la multiplicación y suma de dos matrices, donde el resultado se almacena en la matriz C. El pseudocódigo para la multiplicación calcula el producto escalar de dos matrices A y B , y almacena el resultado en la matriz de salida C.

Si los siguientes programas se ejecutaran secuencialmente, el tiempo que se tardaría en calcular el resultado sería deO(norte3){\displaystyle O(n^{3})}(suponiendo que las longitudes de fila y columna de ambas matrices son n) yO(norte){\displaystyle O(n)}para la multiplicación y la suma respectivamente.

// Multiplicación de matrices for ( int i = 0 ; i < A . rowLength (); i ++ ) { for ( int k = 0 ; k < B . columnLength (); k ++ ) { int sum = 0 ; for ( int j = 0 ; j < A . columnLength (); j ++ ) { sum += A [ i ][ j ] * B [ j ][ k ] ; } C [ i ][ k ] = sum ; } }
// Adición de arreglos for ( int i = 0 ; i < c . size (); i ++ ) { c [ i ] = a [ i ] + b [ i ] ; }

Podemos aprovechar el paralelismo de datos en el código anterior para ejecutarlo más rápido, ya que la aritmética es independiente del bucle. La paralelización del código de multiplicación de matrices se logra mediante OpenMP . Una directiva de OpenMP, "omp parallel for", indica al compilador que ejecute el código del bucle for en paralelo. Para la multiplicación, podemos dividir las matrices A y B en bloques a lo largo de filas y columnas respectivamente. Esto nos permite calcular cada elemento de la matriz C individualmente, haciendo así la tarea paralela. Por ejemplo: A[mxn] punto B[nxk] se puede terminar enO(norte){\displaystyle O(n)}en lugar deO(metronortek){\displaystyle O(m*n*k)}cuando se ejecuta en paralelo utilizando procesadores m*k .

Paralelismo de datos en la multiplicación de matrices
// Multiplicación de matrices en paralelo #pragma omp parallel for schedule ( dynamic , 1 ) collapse ( 2 ) for ( int i = 0 ; i < A.rowLength (); i ++ ) { for ( int k = 0 ; k < B.columnLength ( ); k ++ ) { int sum = 0 ; for ( int j = 0 ; j < A.columnLength ( ) ; j ++ ) { sum += A [ i ][ j ] * B [ j ] [ k ] ; } C [ i ] [ k ] = sum ; } }

Como se puede observar en el ejemplo, se requerirán muchos procesadores a medida que aumente el tamaño de las matrices. Si bien la prioridad es minimizar el tiempo de ejecución, al incrementarse el tamaño de la matriz, surgen otras limitaciones, como la complejidad del sistema y sus costos asociados. Por lo tanto, limitando el número de procesadores, podemos aplicar el mismo principio y dividir los datos en fragmentos más grandes para calcular el producto de dos matrices. [ 4 ]

Para la suma de arreglos en una implementación de procesamiento paralelo de datos, supongamos un sistema más sencillo con dos unidades centrales de procesamiento (CPU) A y B. La CPU A podría sumar todos los elementos de la mitad superior de los arreglos, mientras que la CPU B podría sumar todos los elementos de la mitad inferior. Dado que ambos procesadores trabajan en paralelo, la suma de arreglos tardaría la mitad del tiempo que si se realizara la misma operación en serie con una sola CPU.

El programa expresado en pseudocódigo a continuación —que aplica alguna operación arbitraria, foo, a cada elemento de la matriz— dilustra el paralelismo de datos: [ nb 1 ]

si CPU = "a" entonces límite_inferior := 1 límite_superior := redondeo(d.longitud / 2) de lo contrario si CPU = "b" entonces límite_inferior := redondeo(d.longitud / 2) + 1 límite_superior := d.longitud para i desde límite_inferior hasta límite_superior en 1 hacer foo(d[i])

En un sistema SPMD ejecutado en un sistema de 2 procesadores, ambas CPU ejecutarán el código.

El paralelismo de datos enfatiza la naturaleza distribuida (paralela) de los datos, en contraposición al procesamiento (paralelismo de tareas). La mayoría de los programas reales se sitúan en algún punto intermedio entre el paralelismo de tareas y el paralelismo de datos.

Pasos para la paralelización

El proceso de paralelizar un programa secuencial se puede dividir en cuatro pasos discretos. [ 5 ]

Paralelismo de datos frente a paralelismo de tareas

Paralelismo de datos frente a paralelismo de modelos

[ 6 ]

Datos mixtos y paralelismo de tareas

El paralelismo de datos y tareas puede implementarse simultáneamente combinándolos para la misma aplicación. Esto se denomina paralelismo mixto de datos y tareas. El paralelismo mixto requiere algoritmos de planificación sofisticados y soporte de software. Es el mejor tipo de paralelismo cuando la comunicación es lenta y el número de procesadores es elevado. [ 7 ]

El paralelismo de tareas y datos mixtos tiene muchas aplicaciones. Se utiliza particularmente en las siguientes aplicaciones:

  1. El paralelismo de datos y tareas se aplica en la modelización climática global. Los cálculos paralelos de grandes conjuntos de datos se realizan mediante la creación de cuadrículas de datos que representan la atmósfera y los océanos de la Tierra, y el paralelismo de tareas se emplea para simular el funcionamiento y el modelo de los procesos físicos.
  2. En la simulación de circuitos basada en temporización , los datos se dividen entre diferentes subcircuitos y el paralelismo se logra mediante la orquestación de las tareas.

Entornos de programación paralela de datos

Actualmente se dispone de una variedad de entornos de programación paralela de datos, entre los que destacan los siguientes:

  1. Interfaz de paso de mensajes : Es una interfaz de programación de paso de mensajes multiplataforma para computadoras paralelas. Define la semántica de las funciones de la biblioteca para permitir a los usuarios escribir programas portátiles de paso de mensajes en C, C++ y Fortran.
  2. OpenMP : [ 8 ] Es una interfaz de programación de aplicaciones (API) que admite modelos de programación de memoria compartida en múltiples plataformas de sistemas multiprocesador. Desde la versión 4.5, OpenMP también puede dirigirse a dispositivos distintos de las CPU típicas. Puede programar FPGA, DSP, GPU y más. No se limita a las GPU como OpenACC.
  3. CUDA y OpenACC : CUDA y OpenACC (respectivamente) son plataformas API de computación paralela diseñadas para permitir que un ingeniero de software utilice las unidades de cálculo de las GPU para el procesamiento de propósito general.
  4. Threading Building Blocks y RaftLib : Ambos son entornos de programación de código abierto que permiten el paralelismo mixto de datos y tareas en entornos C/C++ a través de recursos heterogéneos.

Aplicaciones

El paralelismo de datos encuentra aplicaciones en diversos campos, desde la física, la química y la biología hasta la ciencia de los materiales y el procesamiento de señales. Las ciencias lo emplean para simular modelos como la dinámica molecular [ 9 ] , el análisis de secuencias de datos genómicos [ 10 ] y otros fenómenos físicos. Entre los principales impulsores del paralelismo de datos en el procesamiento de señales se encuentran la codificación de vídeo, el procesamiento de imágenes y gráficos, y las comunicaciones inalámbricas [ 11 ] , por mencionar algunos.

computación intensiva en datos

La computación intensiva en datos es una clase de aplicaciones de computación paralela que utilizan un enfoque de procesamiento paralelo de datos para procesar grandes volúmenes de datos, generalmente del orden de terabytes o petabytes , y que se conocen comúnmente como big data . Las aplicaciones de computación que dedican la mayor parte de su tiempo de ejecución a los requisitos computacionales se consideran de computación intensiva, mientras que las aplicaciones se consideran de datos intensivos si requieren grandes volúmenes de datos y dedican la mayor parte de su tiempo de procesamiento a la entrada/salida y manipulación de datos. [ 12 ]

Véase también

Notas

  1. Algunos datos de entrada (por ejemplo, cuandod.lengthse evalúa a 1 yroundse redondea hacia cero [esto es solo un ejemplo, no hay requisitos sobre qué tipo de redondeo se utiliza]) harán quelower_limitsea mayor queupper_limit, se supone que el bucle saldrá inmediatamente (es decir, ocurrirán cero iteraciones) cuando esto suceda.

Referencias

  1. "La computadora Solomon" .
  2. "SIMD/Vector/GPU" (PDF) . Consultado el 7 de septiembre de 2016 .
  3. Hillis, W. Daniel y Steele, Guy L. , Algoritmos de procesamiento paralelo de datos, Communications of the ACM, diciembre de 1986
  4. Barney, Blaise. "Introducción a la computación paralela" . computing.llnl.gov . Archivado del original el 10 de junio de 2013. Consultado el 7 de septiembre de 2016 .
  5. ^ Solihin, Yan (2016). Fundamentos de la Arquitectura Paralela . Boca Ratón, FL: CRC Press. ISBN 978-1-4822-1118-4.
  6. "Cómo paralelizar el aprendizaje profundo en GPUs Parte 2/2: Paralelismo de modelos" . Tim Dettmers . 09/11/2014 . Consultado el 13/09/2016 .
  7. "Netlib" (PDF) .
  8. "OpenMP.org" . openmp.org . Archivado del original el 5 de septiembre de 2016. Consultado el 7 de septiembre de 2016 .
  9. Boyer, L. L; Pawley, G. S (1988-10-01). "Dinámica molecular de cúmulos de partículas que interactúan con fuerzas por pares utilizando una computadora masivamente paralela". Journal of Computational Physics . 78 (2): 405– 423. Bibcode : 1988JCoPh..78..405B . doi : 10.1016/0021-9991(88)90057-5 .
  10. Yap, TK; Frieder, O.; Martino, RL (1998). "Computación paralela en el análisis de secuencias biológicas". IEEE Transactions on Parallel and Distributed Systems . 9 (3): 283– 294. Bibcode : 1998ITPDS...9..283Y . CiteSeerX 10.1.1.30.2819 . doi : 10.1109/71.674320 . 
  11. Singh, H.; Lee, Ming-Hau; Lu, Guangming; Kurdahi, FJ; Bagherzadeh, N.; Filho, EM Chaves (2000-06-01). "MorphoSys: un sistema reconfigurable integrado para aplicaciones de procesamiento paralelo de datos y computación intensiva" . IEEE Transactions on Computers . 49 (5): 465– 481. Bibcode : 2000ITCmp..49..465S . doi : 10.1109/12.859540 . ISSN 0018-9340 . 
  12. Manual de Computación en la Nube , "Tecnologías intensivas en datos para la computación en la nube", por AM Middleton. Manual de Computación en la Nube. Springer, 2010.