Lenguajes y Framework Disponibles Actualmente para la Programación Paralela

By | 29 julio, 2019

Presentación

Se presentan populares herramientas para el desarrollo de software en programación paralela. Se describe su paradigma en cuanto arquitectura física y computacional. Profundiza conocimientos sobre el paralelismo y define componentes multiplataforma para el parallel computing , su funcionamiento marcando prioridades la lista de procesos que deben ejecutarse. La programación paralela tiene un enfoque general de sub división de un gran problema en mínimas partes con el objetivo de resolver el problema general. Se muestra el enfoque de diferentes lenguajes API y librerías y capa o niveles donde interactúan, ya con software programados bajo el paradigma de la programación serial o enfocada para ejecución de un proceso a la vez en la linea de ejecución. Mucho de estos componentes de desarrollo de software son API y librerías con diferentes enfoque siempre con el objetivo de manejar la ejecución dividiendo en varios pequeños procesos para llevar a cabo un programa en paralela y lograr la tarea total.

Este trabajo expone algunas de las herramientas de software para la programación en paralelo, se definen muestran sus componentes, características y paradigmas. La programación paralela es una filosofía con un enfoque de cooperación entre procesadores activos y con memoria compartida para interactuar y lograr una solución. Están explícitamente en algunas técnicas de comunicación para lograr la comunicación entre procesos o multiprocesadores, aplicando o no sincronización para cumplir su tarea, así mismo implementan estrategias de tolerancia a fallas. Muchos de los lenguajes conocidos y populares como java, python, C o C++, tienen implementaciones sobre ellos para aplicar la programación paralela, otras implementaciones aplican extensiones y librerías para dar soporte a este paradigma, una de esas extensiones es FortranM que a pesar que fortran es un lenguaje ya no tan popular y soportado por estos días posee este proyecto enfocado a la programación paralela, el cual es muy aplicado en el campo científico como lo son el campo de la meteorología el estudio de mareas oceánicas, y cadenas de estudio genéticos. Proyectos como los mencionados en el articulo son aplicados para mejorar el rendimiento y resolver problemas que tratándolos con desarrollos de software tradicional seriales tomaran mucho tiempo o grande inversiones económicas con la intención de obtener una solución en un tiempo y rendimiento acorde.

CUDA

CUDA (arquitectura de dispositivo unificado de computo) es una plataforma de computo paralelo y modelo de programación inventado por NVIDIA, este incrementa dramáticamente el rendimiento y procesamiento en los gráficos en el GPU (unidad gráfica de procesamiento). NVIDIA fue consciente del potencial que suponía acercar este enorme rendimiento a la comunidad científica en general y decidió investigar la forma de modificar la arquitectura de sus GPUs para que fueran completamente programables para aplicaciones científicas además de añadir soporte para lenguajes de alto nivel como C y C++. De este modo, en Noviembre de 2009, NVIDIA introdujo para sus tarjetas gráficas la arquitectura CUDA TM (Compute Unified Device Architecture), una nueva arquitectura para cálculo paralelo de propósito general, con un nuevo repertorio de instrucciones y un nuevo modelo de programación paralela, con soporte para lenguajes de alto nivel, y constituidas por cientos de núcleos que pueden procesar de manera concurrente miles de hilos de ejecución. En esta arquitectura, cada núcleo tiene ciertos recursos compartidos, incluyendo registros y memoria. La memoria compartida integrada en el propio chip permite que las tareas que se están ejecutando en estos núcleos compartan datos sin tener que enviarlos a través del bus de memoria del sistema. La plataforma de cálculo paralelo CUDA R proporciona unas cuantas extensiones de C y C++ que permiten implementar el paralelismo en el procesamiento de tareas y datos con diferentes niveles de granularidad. El programador puede expresar ese paralelismo mediante diferentes lenguajes de alto nivel como C, C++ y Fortran o mediante estándares abiertos como las directivas de OpenACC. En la actualidad, la plataforma CUDA se utiliza en miles de aplicaciones aceleradas en la GPU y en miles de artículos de investigación publicados.

MILLIPEDE

Es un sistema de ejecución genérico para la ejecución de lenguajes de programación paralelos en ambientes distribuido. En este proyecto un conjunto de constructores son los encargados de identificar los lenguajes. Estos constructores son implementados en la capa superior de un cluster de estaciones de trabajo con el objetivo de correr un lenguajes de programación paralelo especifico en este ambiente distribuido, todo esto es necesario en el compilador o un preprocesador de este mapa de código de lenguajes paralelos para los constructores de sistema de ejecución. Incluso algunas mediciones del mismo MILLIPEDE pueden estar presentes en los constructores.

COLECCIÓN CONCURRENTE (CNC)

Colección concurrente (CnC), es un modelo de programación paralela con una semántica de ejecución que es influenciada por flujo de data dinámico, procesamiento de stream y espacio de tuplas. El modelo se construyo en el pasado en los laboratorios de Hewlett Packard en TStreams. El modelo esta compuesto principalmente por tres componentes llamados colección de punto o paso, colección de datos y colección de control. Una colección de paso es la encargada del procesamiento consumiendo datos y devolviendo resultados. Una colección de datos son un conjunto de datos indexadas por etiquetas y pueden ser accedida por operaciones de put y get, una vez se utilice una operación put, la data no puede ser sobre escrita, es requerido que no pueda cambiar su valor. Una colección de control es una fabrica de pasos instanciados. Una operación de put en una colección de control con una etiqueta de control generara una colección de pasos donde la etiqueta de control es pasada como parámetro. Esta colección y sus asociaciones son definidas estéticamente como un gráfico CnC en el cual un nodo es un paso, colección de articulo o data y una linea directa implementa una aparición put, get o predefinidas. En este modelo cada componente como colección de paso, colección de datos o colección de control, son definidas estéticamente, pero cada colección estática es un conjunto de instancias dinámicas creadas por el programa en ejecución.

Una colección de paso, es un conjunto especifico de instrucciones de procesamiento procesados con el envió de diferentes parámetros. Una colección de control es llamada para controlar la colección de paso añadiendo una instancia a la colección de control cada vez que se llame a la colección de paso. Por ejemplo, un paso es instanciado cuando es ejecutado su input, como consecuencia eventualmente puede ser instanciado otro control y ası́ instanciar controles sucesivos.

Estos pasos leen (get) y escriben (put) dinamicamente datos instanciados. El objetivo de la ejecución de los pasos siempre mantiene la relación de su productor y su consumidor. Una CnC completa es graficada solo cuando colecciones de datos, controles y pasos se encuentran relacionada entre si.

MPI INTERFAZ DE PASO DE MENSAJES

MPI (Message Passing Interface) es un estándar que define la sintaxis y la semántica de las funciones contenidas en una biblioteca de paso de mensajes diseñada para ser usada en programas que exploten la existencia de múltiples procesadores.

El paso de mensajes es una técnica empleada en programación concurrente para aportar sincronización entre procesos y permitir la exclusión mutua.

Su principal característica es que no precisa de memoria compartida, por lo que es muy importante en la programación de sistemas distribuidos. En la plataforma de los Supercomputadores LUSITANIA y LUSITANIA II se puede utilizar cuando se ejecute un trabajo en más de un nodo.

No es un nuevo lenguaje de programación, es una librerı́a de funciones a la que podemos llamar desde C ó Fortran entre otros lenguajes. Esta basada en paso de mensajes, la forma más potente y aceptada para programar sistemas paralelos y permite abstraer la gran cantidad de detalles que la programación paralela conlleva. Su ventaja más inmediata es su implementación y portabilidad a una gran variedad de sistemas: desde máquinas con memoria compartida (Origin2000) hasta una red de estaciones de trabajo.

Aunque existen otros enfoques de la programación en paralelo (directivas de memoria compartida, como OpenMP), el paso de mensajes es considerado por algunos como el ensamblador de la programación paralela, por el grado de acercamiento a la estructura paralela de nuestro programa, manteniéndonos a salvo de los problemas de implementación en cada tipo de máquina.

APACHE HADOOP

Apache Hadoop desarrolla software para computación distribuida, escalable y segura. Hadoop es un framework que permite el procesamiento distribuido de grandes conjuntos de datos a través de grupos de ordenadores que utilizan modelos de programación sencillos. Está diseñado para ser instalado en un solo servidor o miles de ellos, cada uno, con su propio procesador y almacenamiento.

En lugar de depender del hardware para ofrecer alta disponibilidad, la propia biblioteca está diseñado para detectar y controlar los errores en la capa de aplicación, por lo que, la alta disponibilidad de los datos está por encima del hardware y es independiente de los errores que se puedan producir en el mismo.

A grandes rasgos se puede decir que Hadoop está compuesto por dos partes

  • Se ocupa del almacenamiento de datos de distintos tipos (HDFS).
  • Realiza las tareas de procesamiento de los datos de manera distribuida (MapReduce).

Hadoop esta basado en una arquitectura maestro-esclavo o Master-Slave

  • El maestro en HDFS se les conoce como NameNode y se encargan de conocer como se encuentran los datos almacenados por el cluster.
  • Los esclavos en HDFS se les conoce como DataNodes y se encargan de almacenar fı́sicamente los datos en el cluster.

La arquitectura de Hadoop basada en el sistema de archivos distribuidos mediante el nodo máster y múltiples nodos slave (maestro/esclavo) resulta claramente ventajosa para procesar grandes cantidades de datos. Gracias a su estructura distribuida HDFS (Hadoop Data File System) es capaz de almacenarlos y tratarlos de un modo eficiente, pudiendo procesar con rapidez ingentes cantidades de información, lo que convierte a este sistema de código abierto en una herramienta idónea para llevar a cabo análisis en clave de Big Data.

Su arquitectura basada en el procesamiento y almacenamiento distribuido hacen de él una buena solución para almacenar y procesar el flujo continuo de datos, frente a los que las tradicionales bases de datos relacionales (RDBMS) poco pueden hacer. Sin embargo, lejos de ser una sustitución de éstos, se revelan como un valioso complemento.

En la práctica, puede afirmarse que Hadoop reúne todos los requisitos para dar respuesta a necesidades de procesamiento de datos que se almacenan diariamente con vistas a realizar consultas, análisis y, en fin, con el objetivo último de extraer valor estratégico.La escalabilidad, alta disponibilidad y buen funcionamiento del sistema, incluso cuando falla el servidor, tres de sus características esenciales, derivan de su particular arquitectura, convirtiéndolo en un sistema de tratamiento y almacenamiento de datos muy flexible, rápido y robusto. Su funcionamiento, en suma, se acerca bastante al ideal de consistencia, disponibilidad y tolerancia a fallos, conocido como teorema CAP (por sus siglas en inglés) del profesor Eric A. Brever, proporcionando ventajas como las siguientes:

  • Hadoop almacena y analiza volúmenes de datos gigantescos, de petabytes (un millón de gigabytes) a un menor costo, pues su arquitectura permite funcionar en clúster, dotándolo de sencillez y flexibilidad a la hora de añadir un nodo.
  • Rapidez: la HDFS hace posible analizar o hacer consultas en cuestión de minutos u horas, pero no en tiempo real.
  • Trabaja con datos heterogéneos, tanto datos estructurados como no estructurados, posibilitando analizarlos e incluso cruzar bases de datos.
  • Robustez y fiabilidad: Map Reduce de Hadoop hace posible que el buen funcionamiento no se altere por posibles fallos ante una posible caída de nodos.

El paradigma de MapReduce se basa en enviar el proceso computacional al sitio donde residen los datos que se van a tratar, los cuales se coleccionan en un cluster Hadoop. Cuando se lanza un proceso de MapReduce se distribuyen las tareas entre los diferentes servidores del cluster y, es el propio framework Hadoop quien gestiona el envió y recepción de datos entre nodos. Mucha de la computación sucede en los nodos que tienen los datos en local para minimizar el tráfico de red. Una vez se han procesado todos los datos, el usuario recibe el resultado del cluster. Basicamente Hadoop se ocupa de todo.

Se puede decir que MapReduce es un modelo de programación para computación distribuida basado en Java, pero que también se puede desarrollar en otros lenguajes de programación. Contiene dos fases, aunque la segunda se subdivide en otras dos:

  • Map.
  • Reduce: barajado de datos y reduce.

Si un programa está desarrollado correctamente, puede perfectamente escalar en cuanto a tratamiento de datos de 1MB a 1TB sin ningún problema.

OPENMP

OpenMP (Open Multi-Processing) es una interfaz de programación de aplicaciones (API) para la programación multiproceso de memoria compartida en múltiples plataformas. También podrı́a definirse como un modelo de programación portable y escalable que proporciona a los programadores una interfaz simple y flexible para el desarrollo de aplicaciones paralelas para las plataformas que van desde las computadoras de escritorio hasta los supercomputadores. OpenMP es una especificación para una implementación portable de paralelismo en FORTRAN y C/C++, provee directivos de compilador, rutinas de biblioteca que se pueden usar para controlar paralelismo.

GLENDA

Diseñado para soportar una programación paralela fácil. Glenda sigue el modelo de Linda. Linda es una marca registrada de Scientific Computing Associates. Glenda se construye utilizando el software de la máquina virtual paralela (PVM, Parallel Virtual Machine) del Laboratorio Nacional de Oak Ridge, la Universidad de Tennessee y la Universidad de Emory como su núcleo de comunicaciones. Por consiguiente, se beneficia del ajuste cuidadoso aplicado a PVM por varios fabricantes de computadoras y es portátil a la misma colección de máquinas. Glenda está diseñada como un modelo para la programación paralela sin que requiera especı́ficamente ninguna arquitectura en particular. Es posible utilizar glenda tanto para el paralelismo de grano fino como para el de grano grueso. Sin embargo, los entornos paralelos más prácticos hoy en dı́a son las máquinas SIMD que no parecen ser adaptables a las máquinas Glenda o MIMD que operan eficientemente. Por ello Glenda aunque puede ser implementado para obtener gran granularidad se implementa un paralelismo de medio o baja granularidad generalmente.

LINDA

Linda es un lenguaje de coordinación inventado por David. Gelernter en la Universidad de Yale, Linda cuando se combina con un lenguaje de computación (como C) produce un lenguaje de programación paralelo de alto nivel para MIMD maquinas Linda se basa en una asociación virtual compartida Memoria asociados por objetos llamados tuplas. Las personas que no creen en el lenguaje han afirmado durante mucho tiempo que los programas de Linda no podían ser eficiente en arquitecturas de memoria distribuida.

CHAPEL

Chapel es un lenguaje de programación diseñado para la computación paralela productiva en sistemas a gran escala. El diseño y la implementación de Chapel ha sido contemplado teniendo en cuenta la portabilidad, lo que permite que Chapel se ejecute en computadoras de escritorio multinúcleo y portátiles, clusters de productos básicos y la nube, además de las supercomputadoras de gama alta para las que fue diseñada. El diseño y desarrollo de Chapel está siendo liderado por Cray Inc. en colaboración con colaboradores del mundo académico, centros de computación, la industria y la comunidad de código abierto.

Chapel se está desarrollando de forma abierta en GitHub bajo la licencia Apache v2.0. La implementación hace uso de otros paquetes de código abierto de terceros bajo sus propias licencias. Chapel surgió de la entrada de Cray en el programa de sistemas de computación de alta productividad (HPCS) liderado por DARPA. Actualmente estamos realizando un esfuerzo de cinco años para endurecer ese prototipo inicial en una implementación de calidad de producto.

Chapel soporta un modelo de ejecución multiproceso a través de abstracciones de alto nivel para paralelismo de datos, paralelismo de tareas, concurrencia y paralelismo anidado. El tipo de configuración regional de Chapel permite a los usuarios especificar y razonar acerca de la ubicación de los datos y las tareas en una arquitectura de destino para sintonizar la localidad y la afinidad. Chapel soporta agregados de datos de vista global con implementaciones definidas por el usuario, lo que permite que las operaciones en estructuras de datos distribuidos se expresen de manera natural. En contraste con muchos lenguajes paralelos anteriores de nivel superior, Chapel está diseñado en torno a una filosofı́a de resolución múltiple, que permite a los usuarios escribir inicialmente un código muy abstracto y luego agregar más detalles de manera incremental hasta que estén tan cerca de la máquina como lo requieran sus necesidades. Chapel admite la reutilización de códigos y la creación rápida de prototipos a través del diseño orientado a objetos, la inferencia de tipos y las características para la programación genérica. El código existente se puede integrar en los programas de Chapel (o viceversa) a través de las funciones de interoperabilidad.

Chapel fue diseñada desde sus principios en lugar de extender un lenguaje existente. Es un lenguaje imperativo de bloques estructurados, diseñado para ser fácil de aprender para los usuarios de C, C ++, Fortran, Python, Java, Matlab y similares. Mientras que Chapel se basa en conceptos y sintaxis de muchos idiomas anteriores, sus caracterı́sticas paralelas están más directamente influenciadas por ZPL, Fortran de alto rendimiento (HPF) y las extensiones Cray MTA TM / Cray XMT TM a C y Fortran.

TITANIUM

Titanium es un dialecto explícitamente paralelo de Java desarrollado en UC Berkeley para admitir computación científica de alto rendimiento en multiprocesadores a gran escala, que incluyen supercomputadoras masivamente paralelas y clústeres de memoria distribuida con uno o más procesadores por nodo. Otros objetivos lingüísticos incluyen seguridad, portabilidad y soporte para construir estructuras de datos complejas.

Los principales complementos a Java son:

  • Modelo de control SPMD explícitamente paralelo.
  • Arreglos multidimensionales flexibles y eficientes.
  • Tipos incorporados para representar puntos multidimensionales, rectángulos y dominios generales.
  • Iteración de bucle desordenada para permitir una optimización agresiva.
  • Clases inmutables definidas por el usuario (a menudo llamadas clases “ligeras” o “valor”).
  • Administración de memoria basada en zonas (ademas de la recolección de basura java estándar).
  • Sistema de tipo aumentado para expresar o inferir localidades y compartir propiedades de estructuras de datos distribuidas.
  • Prevención en tiempo de compilación de puntos muertos en la sincronización de barreras.
  • Biblioteca de operaciones útiles de sincornización paralela y colectivos.
  • Sobrecarga del operador.
  • Plantillas (clases parametrizadas).
  • Soporte de aplicaciones en varios idiomas.

Titanium pueden ejecutarse sin modificaciones en uniprocesadores, máquinas de memoria compartida y máquinas de memoria distribuida; puede ser necesario un ajuste de rendimiento para organizar las estructuras de datos de una aplicación para memoria distribuida, pero la portabilidad funcional permite el desarrollo en máquinas de memoria compartida y uniprocesadores.

Titanium es esencialmente un superconjunto de Java 1.4 y hereda todas las propiedades de expresividad, facilidad de uso y seguridad de ese lenguaje. Titanium aumenta las características de seguridad de Java al proporcionar una sincronización comprobada que evita ciertas clases de errores de sincronización. Para admitir estructuras de datos complejas, Titanium utiliza el mecanismo de clase orientado a objetos de Java junto con el espacio de direcciones global para permitir grandes estructuras compartidas. La instalación de matriz multidimensional de Titanium agrega soporte para cálculos jerárquicos y adaptativos basados en cuadrícula de alto rendimiento.

En Titanium como proyecto, la investigación de compiladores se centra en el diseño de técnicas de análisis de programas y en la optimización de las transformaciones para los programas Titanium, y en el desarrollo de un compilador y un sistema de tiempo de ejecución que explote estas técnicas. Debido a que Titanium es un lenguaje explícitamente paralelo, se necesitan nuevos análisis incluso para las transformaciones de movimiento de código estándar. El compilador analiza tanto las construcciones de sincronización como los accesos de variables compartidas. Las transformaciones incluyen optimizaciones de caché, comunicación superpuesta, identificación de referencias a objetos en el procesador local y reemplazo de la sobrecarga de administración de memoria en tiempo de ejecución con la verificación estática. Nuestra implementación actual traduce los programas de Titanium completamente en C, donde los compiladores binarios nativos los compila en C y luego los vincula a las bibliotecas de tiempo de ejecución de Titanium (no hay JVM).

La implementación actual se ejecuta en una amplia gama de plataformas, incluidos uniprocesadores, multiprocesadores de memoria compartida, clústeres de memoria distribuida de uniprocesadores o SMP que utilizan una variedad de interconexiones de clústeres (InfiniBand, Myrinet, Quadrics, Dolphin, Ethernet) y un número de supercomputador específico arquitecturas (IBM SP, Cray X1, Blue Gene, CrayXT3, Origin 2000). Los backends de memoria distribuida se implementan utilizando GASNet, una interfaz de co-municación de alto rendimiento independiente de la red e independiente del idioma, diseñada específicamente para los idiomas del espacio de direcciones global, como Titanium. Titanium está especialmente adaptado para escribir aplicaciones paralelas científicas basadas en cuadrícula, y varias de estas aplicaciones principales se han escrito y continúan desarrollándose.

En conclusión en esta investigación acerca de estos proyectos ya sean librerías, extensiones de lenguajes o lenguajes propiamente. Todos y cada uno son soportados por arquitecturas distribuidas, cluster y supercomputadoras, siempre con el enfoque a la implementación de procesamiento en multinucleo, para resolver grandes problemas de manera eficiente y ordenada. Estudiando la programación paralela, describimos esta como un paradigma con diferencias a la programación estructurada o serializada, ya que, para la aplicación se debe estudiar los recursos disponibles y llevar a un nivel de procesamiento con granuralidad ideal para lograr rendimiento balanceado y tolerante a fallas. La programación paralela presenta un reto muy interesante porque con las técnicas utilizadas dentro de este paradigma, se presenta el futuro por el volumen de datos que tenemos en plataformas digitales al día de hoy y sigue creciendo día a día.

Para cualquier arquitectura ó solución que se encuentre, existe una etapa de análisis fundamental en la que se debe conocer el problema que se presenta, por ello, esta importante etapa trata de seleccionar aplicación de diseño, tecnología e implementación idónea de acuerdo a recursos y soluciones enfocado en el problema y solución buscada, comparando las posibilidades y herramientas disponibles. Para así brindar la mejor solución posible.

Referencias

Deja un comentario