Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
La programacin paralela, respecto a la programacin secuencial, genera un conjunto de problemas nuevos al programador: Divisin en unidades de computo independientes(tareas). Agrupacin de tareas o cargas de trabajo(codigos, datos) Asignacin a procesadores, as como sincronizacin y comunicacin. Actualmente las herramientas y mtodos para facilitar el desarrollo de programas paralelos eficientes, legibles o mantenibles, es un campo de
Aqu solo se va abordar estilos de programacion que se usan ampliamente en computacion paralela, como el paso de mensajes, variables compartidas o paralelismo de datos.
En esta seccion pretendemos dar una vision de distintas facetas de la programacion paralela y de distintas alternativas dentro de estas. Las facetas o partes que vamos a abordar dentro del diseo de un programa paralelo se muestran en la tabla 7.4.
(1) Punto de partida (2) Modos de programacion paralela MPMD y (3) Herramientas para obtener programas paralelos (4) Alternativas de comunicacin (5) Estilos de programacion parelela (6) Estructuras de programacion paralela (7) Alternativas para crear y terminar procesos-hebras
En la figura 7.16 se expone un ejemplo de cmo ontener una version SPMD ah podemos observar como el programador a asignado a cada una de las funciones del programa (Func1, Func2, Func3) a un proceso diferente usando una variable IPROC que almacena el identificador del proceso y una sentencia SWITCH. Los tres procesos ejecutaran el mismo codigo SPMD, pero la sentencia SWITCH hace que cada uno ejecute solo una de las funciones. El programador a distribuido las iteraciones de bucle FOR de Func2 entre hebras, para esto se requiere conocer, el numero de hebras entre las que se van a repartir las N iteraciones del bucle (NTHREAD), y el identificador de la hebra que ejecuta el codigo (ITHREAD).
En el otro extremo, se situal los compiladores paralelos que buscan automaticamente el paralelismo implicitoen un programa secuencial y lo hacen explicito, evitando la intervencion del programador.
BOBLIOTECA DE FUNCIONES PARA PROGRAMACION PARALELA Con esta alternativa el programador utiliza un lengiaje secuencial y una biblioteca de funciones. El cuerpo de los procesos y hebras se escribe en lenguaje secuencial. El programador explicitamente se encarga de distribuir las tareas entre los procesos usabdo el lenguaje secuencial: Crear o gestionar procesos Implementar la comunicacin y la sincronizacion Utlizando funciones de la biblioteca y tambien puede elegir la distribucion de los procesos entre procesadores.
Podemos ver varias ventajas de las bibliotecas de funciones: Los programadores estan familiarizados con lenguajes secuenciales, no tienen que aprenderlos, los usan en la programacion de sus aplicaciones secuenciales. Las bibliotecas estan disponibles para todos los sistemas paralelos (multiprocesos, multicomputadores, incluido el cluster) Las bibliotecas estan mas cercanas al hardware y dan al programador un control a mas bajo nivel. Se puede utilizar a la vez bibliotecas para programar con hebras y bibliotecas para programar con procesos.
LENGUAJES PARALELOS Y DIRECTIVAS DEL COMPLILADOR Generalmente, los lenguajes paralelos y el uso de lenguajes secuenciales con directivas situan al programador con un lenguaje de abstraccion superior que las bibliotecas de funciones, ahorrando o facilitando al programador el trabajo de paralelizar, aunque puede que solo aproveche un tipo de paralelismo de tareas o de datos. Ambos pueden evitar o facilitar al programador alguna de las tareas del la tabla 7.5.
COMPILADORES PARALELOS Se pretende que un compilador paralelo, a partir de una version secuencial, extraiga automaticamente paralelismo a nivel de bucle (paralelismo de datos) y de funcion (paralelismo de tareas). Para ellos se realiza analisis de dependencias entre bloques de codigo, entre iteraciones de un cicloo entre funciones. Las dependencias que detecta el analisis entre bloques son: RAW (read after write) WAW (write after write) WAR (write after read) Las dependencias waw y war son evitadas cambiando la asignacion de memoria, tambien se pueden eliminar algunas raw.
Hay patrones de comunicacin que se repiten en diferentes algoritmos paralelos, especialmente aquellos que aprovechan paralelismo de datos. Asi hay algoritmos en los que: Se ordenan los datos entre procesos , siguiendo patrones reconocibles (permutaciones) como: rotacion (por ejemplo se puede utilizar en ordenacion), intercambio (resolucion de ecuaciones por Gauss) y baraje (transposicion de matrices). Se didubden datos (difundir la medida en el calculo de la desviacion tipica). Se realizan multiples reducciones en paralelo con el mismo comando de datos, cada uno con diferente numero de elemtos.
La figura 7.18 nos presenta una clasificacion de las funciones colectivas en 5 grupos.
al sistema de comunicaciones Las funciones basicas de comunicacin que ofrece las herramientas de software para paso de mensajes han de permitir, al menos comunicacin entre 2 procesos (uno a uno) para ellos se utilizan 2 funciones uno para enviar y otro para recibir. Send (destino, datos), funcion para enviar datos Receive (fuente,datos), funcion para recibir datos
VARIABLES COMPARTIDAS Hay varias herramientas de software para redactar un codigo paralelo basado en variables compartidas: Lenguajes de programacion, como Ada95 o java Bibliotecas de funciones, como Pthread (POSIX-Thread) u OpenMP Los propios fabricantes ofrecen compiladores secuenciales con extensiones de directivas propias para programar sus maquinas. La comunicacin entre procesos se realiza accediendo a variables compartidas, por lo tanto, mediante instrucciones de lectura y escritura en memoria. Las herramientas software ofrecen mecanismos para implementar sincronizacion: cerrojos, semaforos , variables condicionales. Estos mecanismos situal al
PARALELISMP DE DATOS En este estilo de programacion se aprovecha el paralelismo de datos inherente a aplicaciones en las que los datos se organizan en estructuras (vectores o matrices). El programador escribe un programa en construcciones que permiten aprovechar el paralelismo de datos: Construcciones para paralelizar bucles Construcciones que especifican operaciones en la que los operandos son estructuras y no escalares Construcciones para distribuir los datos (carga de trabajo) entre los elentos de procesamiento El programador no tiene que preocuparse de las sincronizaciones, estan implicitas en el compilador
La creacion dinamica de los procesos introduce una penalizacion en tiempo durante la ejecucion de la aplicacin, mayor que en la creacion de hebras. Cuando se crea un proceso estatico, no hay ningun proceso que cree a otro. En este caso, el numero de procesos que se van a ejecutar se conoce como de antemano. Por otra parte, desde el punto de vista del programador la creacion de un conjunto de procesos (hebras) puede ser simultanea o no, y la terminacion puede ser sincrona (con el padre o entre todos los procesos) o asincrona.
Descomposicion de tareas
En esta etapa el programador busca unidades de trabajo en la aplicacin que se pueden ejecutar en paralelo, es decir que sean independientes. Si partimos del codigo secuencial, para extarer paralelismo nos podemos situar en 2 niveles de abstraccion NIVEL DE FUNCION analizando las dependencias entre las funciones del codigo, encontramos las que son independientes por lo tanto se pueden ejecutar en paralelo NIVEL DE BUCLE analizando las iteraciones de los bucles dentro de una funcion, podemosenconmtrar si son o pueden ser independientes, con esto se puede detectar paralelismo de datos.
Evaluacion de prestaciones
Si las prestaciones alcanzadas no son las que se requiren, se debe volver a etapas anteriores del proceso de implementacion . Probablemente se retrocedera mas pasos mientras mayor sea la necesidad de mejor de prestaciones.