Sei sulla pagina 1di 30

PROGRAMACION PARALELA

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.

Tabla 7.4 paralela

Facetas de estudio dentro de la programacion

(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

(8) Proceso de paralelizacion

7.4.1 PUNTO DE PARTIDA


Cuando se plantea obtener una version paralela de una aplicacin, se puede utilizar como punto de partida un codigo secuencial que resuelve el problema, y sobre este codigo de alto nivel buscar el paralelismo. Podria ocurrir en algun caso que el programa secuencial inicial no admita una paralelizacion inmediata. Una ventaja de esa opcion es que se puede saber el tiempo de ejecucion real de las diferentes funciones o tareas de que consta la aplicacin a las que hay que dedicar un mayor esfuerzo de paralelizacion, por se las que suponen un mayor tiempo. Adicionalmente, para facilitar el trabajo, podemos

7.4.2 MODOS DE PROGRAMACION


Se podrian distingir principalmente, dos modos de programacion: SPMD (tambien denominado a veces paralelismo de datos), todos los codigos que se ejecutan en paralelo se obtienen compilando el mismo programa. Cada copia trabaja con un conjunto de datos distintos, y se ejecuta en un procesador diferente. MPMD (paralelismo de tareas o funciones), los codigos que se ejecutan en paralelo se obtienen compilando programas independientes. En este caso la aplicacin a ejecutar se divide en unidades independientes. Cada unidad trabaja con un

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).

7.4.3 HERRAMIENTAS PARA OBTENER PROGRAMAS PARALELOS


Las herramientas para obtener programas paralelos deberian permitir de forma explicita (el trabajo lo haria el programador) o implicita (el trabajo lo haria la propia herramienta) la realizacion de las tareas se veran en la tabla 7.5. Hay varias alternativas para obtener un programa paralelo. La que requiere mayor implicacion del programador utiliza lenguaje secuencial, y una biblioteca de funciones, con la que el programador hace explicito el paralelismo. Esta alternativa que situa al programador en el nivel de abstraccion mas bajo.

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.

7.4.4 ALTERNATIVAS DE COMUNICACION


Las herramientas para programacion paralela pueden,ademas de la conicacion entre procesos, uno productor y otro consumidor (comunicacin uno a uno), comunicaciones en las que intervienen multiples procesos (uno a muchos, muchos a uno, muchos a muchos). Estos servicios colectivos se implementan para comunicar a los procesos que forman parte del grupo que esta colaborando a la ejecucion de un codigo. En algunos casos no se utiliza para comunicar explicitamente datos, sino para sincronizar entre si a componentes del grupo.

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.

7.4.5 ESTILOS DE PROGRAMACION


Abordaremos 3 estilos de programacion que se utilizan actualmente en procesamiento paralelo: Paso de mensajes Variables compartidas Paralelismo de datos PASO DEMENSAJES Para redactar un codigo en paso de mensajes, se dispone de diversas herramientas sofware: lenguajes de programacion,como Ada (usando rendezvous) u Occam

Bibliotecas de funciones, que actuan de interface

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

7.4.6 ALTERNATIVAS PARA CREAR Y TERMINAR PROCESOS O HEBRAS


Las herramientas para programacion para programacion paralela ofrecen difetentes procedimientos para terminar o crear procesos o hebras desde el punto de vista usuario, que estan relacionadas con el modelo de programacion. Por una parte, las hebras de un proceso se crean dinamicamente (en tiempo de ejecucion), mientras que los procesos se pueden crear de forma estatica o dinamica. En la creacion dinamica, los procesos se crean por parte de un proceso de la aplicacin en tiempo de ejecucion.

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.

7.4.7 ESTRUCTURAS DE PROGRAMAS PARALELOS


Analizando la estructura (grafo) de las tareas (unidades de trabajo de la aplicacion) y de los procesos (unidades de codigo en ejecucion) de multiples programas paralelos se puede encontrar que hay ciertos patrones que se repiten en distintos programas y dentro de un programa. En estas estructuras las relaciones entre las tareas o entre procesos representan comunicaciones. En estas estructuras estan: Dueo-esclavo Paralelismo de datos Divide y venceras

7.4.8 PROCESO DE PARALELIZACION


Para obtener una version paralela de una aplicacin con una biblioteca de funciones con directivas o con un lenguaje de programacion, se podrian seguir los siguientes pasos: 1. Descomponer 2. Asignar 3. Redactar 4. Evaluar

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.

ASIGANAR TAREAS A PROCESOS O HEBRAS


En esta etapa realizamos la asiganacion de las tareas del grafo de dependencias a procesos y a hebras. Por lo general para una misma aplicacin no resukta conveniente asignar mas de un proceso o hebra por procesador. La granulidad de los procesos y de las hebras dependera del numero de procesadores cuanto mayor sea su numero menos tareas se asiganara a cada procesador , tambien depende de la comunicacin y sincronizacion. La asignacion deberia repartir la carga de trabajo optimizando la comunicacin y sincronizacion, de forma que todos los procesadores empiezen y terminen a la vez.

ESCRIBIR EL CODIGO PARALELO


El codigo va depender del estilo del programador que se utilice (variables compartidas, paso de mensajes, paralelismo de datos) el modo de programacion (SPMD o MPMD) el punto de partida, de la herramienta de software ,etc. Habra que aadir o utilizar el el programa de funciones, directivas o construcciones de lenguajes q haga falta para : Crear y terminar procesos Localizar paralelismo Asignar la carga de trabajo Comunicar y sincronizar diferentes procesos

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.

Potrebbero piacerti anche