S8_Programacion Paralela

Embed Size (px)

Citation preview

PROGRAMACION PARALELA

Arquitectura de Computadoras4PROGRAMACION PARALELA

DOCENTE: ING. CARLOS GUERRA CORDERO

INTEGRANTES: CHICOMA ROSALES FREDDY LADERO CALDERN DAVID

DEDICATORIA

A NUESTROS QUERIDOS PADRESPor brindarnos amor y afecto, y nos brindan su apoyo y confianza para alcanzar nuestras metas trazadas. Velan por nuestro desarrollo continuo como personas y como estudiantes.

A NUESTROS AMIGOS Por ayudarnos en nuestra evolucin como estudiantes y as poder mejorar la personalidad y aprender virtudes como la solidaridad y el compaerismo.

PRESENTACIN

Estimado Profesor:

Cumpliendo con las disposiciones y recomendaciones para el desarrollo del presente informe titulado:

Programacin Paralela

Esperamos que el esfuerzo realizado en el desarrollo de la presente informe haya logrado obtener los objetivos trazados, en caso de existir ciertas omisiones, apelamos a la compresin de su persona distinguido profesor con el fin de dispensar las mismas.

INDICE

DEDICATORIAPRESENTACIONCaptulo 8: PROGRAMACION PARALELA

Programacin Paralela Punto de PartidaModos de Programacina. Modo SPMD b. Modo MPMD Herramientas para obtener programas paralelos Alternativas de comunicacinEstilos de programacinAlternativas para crear y terminar procesos o hebrasEstructuras de programas paralelosa. Dueo- esclavo o granja de tareasb. Paralelismo de datos o descomposicin de datosc. Divide y vencersd. Segmentada o flujo de datosProceso de paralizacin1. Descomposicin en tareas2. Asignar tareas a procesos o hebras3. Escribir el cdigo paralelo4. Evaluacin de prestaciones

PROGRAMACION PARALELAProgramacin 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 carga de tareas (cdigo, datos) y asignacin a procesadores, as como sincronizacin y comunicacin.Para el programador lo ms sencillo es la utilizacin de compiladores que extraen paralelismo automticamente, pero estos compiladores no generan cdigo eficiente para cualquier programa.La utilizacin de mtodos que conducen de forma sistemtica a una versin paralela para una aplicacin para alcanzar una implementacin ms eficiente, legible y mantenible. A continuacin vamos a abordar estilos de programacin que se usan ampliamente en la computacin paralela, como paso de mensajes, variables compartidas o paralelismo de datos.Las facetas o partes del diseo de un programa paralelo se muestran a continuacin:1. Punto de partida 2. Modos de programacin paralela3. Herramientas para obtener programas paralelos4. Alternativas de comunicacin5. Estilos de programacin6. Estructuras de programas7. Alternativas para crear y terminar procesos y hebras8. Proceso de paralelizacin

Punto de PartidaCuando se plantea obtener una versin paralela de una aplicacin, se puede utilizar como punto de partida:

a. Un cdigo Secuencial que resuelve el problema y sobre este cdigo de alto nivel buscar la paralelizacion.Ejemplo:Si tenemos como objetivo paralelizar el clculo del nmero , podemos partir de un programa en C que calcule .La versin paralela va a depender de la descripcin del problema que se ha utilizado en la versin secuencial de partida.Ventaja: Se conoce el tiempo de ejecucin real de las diferentes funciones o tareas que consta la aplicacin, lo que facilita la distribucin equilibrada de la carga de trabajo entre procesadores. Permite encontrar las partes de la aplicacin que requieren ms esfuerzo de paralelizacin (Suponen ms tiempo).

b. Y por definicin de la aplicacin: buscar una descripcin del problema que admita paralelizacion.Para facilitar el trabajo, podemos apoyarnos en programas paralelos que aprovechen las caractersticas de la arquitectura y en bibliotecas de funciones paralelas.

Hay diversas bibliotecas paralelas que proporcionan funciones que se utilizan en aplicaciones que requieren altas prestaciones. Por ejemplo hay disponibles implementaciones paralelas en bibliotecas FFTw, BLAS y LAPACK, que realizan funciones matemticas, o ARPI3D, que implementa un modelo de prediccin del tiempo.

Modos de ProgramacinSe pueden distinguir dos modos de programacin:

a. Modo SPMD ( Single Program Multiple Data):Denominado tambin Paralelismo de Datos, todos los cdigos 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.

b. Modo MPMD ( Multiple Programs Multiple Data)Los cdigos que se ejecutan en paralelo se obtienen compilando programas independientes. En este caso la aplicacin a ejecutar (o cdigo secuencial inicial) se divide en unidades independientes. Cada unidad trabaja con un conjunto de datos y se asigna a un procesador distinto.

En la Figura 7.16 se expone un ejemplo que ilustra cmo obtener una versin SPMD a partir de un cdigo secuencial de un programa. En este ejemplo se utilizan procesos y hebras. El programador ha asignado 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. Suponemos que a los procesos se les como identificadores nmeros enteros consecutivos, comenzando desde 0. Los tres procesos ejecutaran el mismo cdigo SPMD, pero la sentencia Switch hace que cada uno ejecute solo una de las funciones. Por otra parte, el programador a distribuido las iteraciones del bucle FOR de func2 entre hebras. Para hacer esta distribucin, se requiere conocer, el numero de hebras entre las que se van a repartir las N iteraciones del bucle (ithread). En este ejemplo, el programador ha distribuido las iteraciones del ciclo de forma que iteraciones consecutivas se asignen a hebras con identificador consecutivo.

En los programas paralelos se pueden utilizar combinaciones MPMD y SPMD. La programacin dueo esclavo (master-slave), se puede considerar una variante del modo MPMD). En este modo, hay un programa dueo que se encarga de distribuir trabajo (tareas) entre procesos esclavos y recolectar los resultados que estos generan combinndolos en un solo resultado. Si todos los esclavos tienen el mismo cdigo, este dueo-esclavo seria una combinacin de los modos MPMD y SPMD.

Herramientas para obtener programas paralelos: Las herramientas para obtener programas paralelos deben permitir la realizacin de las siguientes tareas:

Crear y terminar procesos. Localizar paralelismo. Distribuir carga de trabajo entre procesos. Comunicacin y sincronizacin entre procesos. Asignacin de procesos a procesadores.

Alternativas para obtener un programa paralelo:a. Biblioteca de Funciones para programacin paralelaUtilizacin de un lenguaje secuencial, y una biblioteca de funciones, la cual requiere mayor implicacin del programador, con lo que se hace explicito el paralelismo. Esta alternativa que sita al programador en el nivel de abstraccin ms bajo. El cuerpo de los procesos y hebras se escribe con lenguaje secuencial. Ventajas: Los programadores estn familiarizados con los lenguajes secuenciales Las bibliotecas estn disponibles para todos los sistemas paralelos Las bibliotecas estn ms cerca al hardware y dan al programador un control a ms bajo nivel. Se pueden utilizar a la vez bibliotecas para programar con hebras y bibliotecas para programar con procesos.Ejemplos de bibliotecas son: Pthread, MPI, PVM y OpenMP.

b. Lenguajes paralelos y directivas del compilador

Lenguajes paralelos permiten ahorrar trabajo al programador en el proceso de paralelizacion incrementando el nivel de abstraccin en el que sita, aunque puede que solo aprovechen un tipo de paralelismo: paralelismo de tareas o de datos.

Los lenguajes paralelos facilitan estas tareas utilizando:

Construcciones propias del lenguaje, por ejemplo, FORALL en HPF para paralelismo de datos, y par en occam, para paralelismo de tareas.

Directivas del compilador, por ejemplo, en HPF se usa INDEPENDENT para paralelizar bucles, PROCESSORS para especificar el tamao y forma de la maquina, o DISTRIBUTE para especificar como los datos se asignan a la maquina virtual especificada por la directiva PROCESSORS.

Funciones de biblioteca, que implementan en paralelo algunas operaciones usuales.

Son ms fciles de escribir y de entender; son ms cortos que los programas basados en lenguajes secuenciales y bibliotecas.

c. Compiladores Paralelos

Los compiladores paralelos buscan automticamente el paralelismo implcito en un programa secuencial y lo hacen explicito, evitando la intervencin del programador.Para ello, realizan anlisis de dependencias entre bloques de cdigo: entre iteraciones de un ciclo o entre funciones.Ejemplo:Supongamos dos bloques de cdigo a analizar: B1 y B2, de forma que B1 se encuentre antes de B2 en el flujo secuencial del programa. Las dependencias que detecta el anlisis el anlisis entre estos dos bloques son:

Dependencia RAW (Read After Write): ocurre si el bloque B1 produce un dato que consume B2. Dependencia WAW (Write After Write): ocurre si B1 escribe en una posicin de memoria en la que tambin escribe B2. Dependencia WAR (Write After Read): ocurre si B1 lee una posicion de memoria que modifica B2.

Los compiladores paralelos estn limitados a aplicaciones que exhiben un paralelismo regular, como los clculos a nivel de bucle.

Alternativas de comunicacinLas herramientas para programacin paralela pueden ofrecer al programador, adems de la comunicacin entre dos procesos, uno productor y otro consumidor (comunicacin uno a otro), comunicaciones en las que intervienen mltiples 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 est colaborando en la ejecucin de un cdigo. En algunos casos no se utilizan para comunicar explcitamente datos, sino para sincronizar entre s 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 reordenan datos entre procesos, siguiendo patrones reconocibles (permutaciones) como: rotacin (por ejemplo se puede usar en reordenacin), intercambio (resolucin de ecuaciones por Gauss) y baraje (transposicin de matrices). Se difunden datos (difundir la media en el clculo de la desviacin tpica). Se reduce un conjunto de datos a un nico dato mediante una operacin: para sumar los elementos de una lista (por ejemplo para integracin numrica); clculo del mximo (por ejemplo resolucin de ecuaciones por Gauss) o del mnimo). Se realizan mltiples reducciones en paralelo con el mismo conjunto de datos, cada uno con diferente nmero de elementos (evaluacin de polinomios o la aproximacin de una funcin mediante un polinomio utilizando la formula de Newton). Se sincronizan mltiples procesos en un punto (barreras).Proporcionar al programador estos esquemas de comunicacin mediante funciones que hay que utilizar explcitamente o de forma ms implcita, puede suponer un incremento en la eficiencia (prestaciones/coste) del programa paralelo. Por un lado, si el programador tiene que especificar explcitamente la comunicacin entre tareas, el uso de estas funciones colectivas simplifica el esfuerzo de programacin y de mantenimiento posterior del programa (coste), ya que los programas requieren menos cdigo y son ms fciles de entender. Por otro lado, su uso puede incrementar las prestaciones si estn implementados aprovechando el soporte para estos servicios que ofrezca el sistema de comunicacin.Generalmente, se aplican las funciones colectivas a los procesos (P1, P2, P3,., Pn-1) dentro de un grupo, por eso a veces se les denomina comunicaciones uno a todos, en lugar de uno a muchos. En algunas herramientas se permite la posibilidad de enmascarar componentes de un grupo que no se desea que intervengan en una comunicacin colectiva (en procesadores matriciales se implementa el enmascaramiento en hardware).En la figura 7.18 se presenta una clasificacin de las funciones colectivas en cinco grupos:1. Figura 7.19Comunicacin mltiple uno-a-uno.- Se caracteriza porque hay componentes del grupo que envan (escriben) un nico mensaje (supongamos que un mensaje es un dato o una estructura de datos) y componentes que reciben (leen) un nico mensaje (figura 7.19). Si todos los componentes del grupo envan y reciben, se implementa una permutacin. Ejemplos de permutaciones son: la rotacin, el intercambio, barajes, funciones de encadenamiento del hipercubo, etc.

2. Comunicacin uno-a-todos.- Un proceso enva y todos los procesos reciben (figura 7.20). Hay variantes en las que el proceso que enva, no forma parte del grupo y otras en las que reciben todos los del grupo excepto el que enva. Dentro de este grupo estn:

a) Difusin: todos los procesos reciben el mismo mensaje.b) Dispersin (scatter): cada proceso receptor recibe un mensaje diferente.

Figura 7.20

3. Comunicacin todos a uno.- En este caso todos los procesos en el grupo envan un mensaje a un nico proceso (figura 7.21).

a) Reduccin: los mensajes enviados por los procesos se combinan en un solo mensaje mediante algn operador. La operacin de combinacin es usualmente conmutativa y asociativa, como por ejemplo la suma, multiplicacin, mximo, mnimo, u operaciones lgicas, como AND y OR.b) Acumulacin (gather): los mensajes se reciben de forma concatenada en el receptor (en una estructura vectorial). El orden en la que se concatenan depende generalmente del identificador del proceso.

Figura 7.21

4. Comunicacin todos-a-todos.- Todos los procesos del grupo ejecutan una comunicacin uno a todos (figura 7.22). Cada proceso recibe n mensajes, cada uno de un proceso diferente del grupo.

a) Todos- Difunden (all-broadcast): todos los procesos realizan una difusin. Usualmente las n transferencias recibidas por un proceso se concatenan en funcin del identificador del proceso que enva, de forma que todos los procesos reciben lo mismo.b) Todos-Dispersan (all-scatter): en este caso los procesos concatenan diferentes transferencias. En el ejemplo de la figura, se ilustra una transposicin de una matriz 4x4: el procesador Pi dispersa la fila i (xi0, xi1, xi2, xi3); tras la ejecucin, el procesador Pi tendr la columna i (x0i, x1i, x2i, x3i).

Figura 7.22

5. Comunicaciones colectivas compuestas.- Hay servicios que resultan de una combinacin de algunos de los anteriores, por ejemplo:a) Todos combinan o reduccin y extensin: el resultado de aplicar una reduccin se obtiene en todos los procesos, bien porque la reduccin se difunda una vez obtenida (reduccin y extensin), o bien porque se realicen tantas reducciones como procesos (todos combinan).b) Barrera: es un punto de sincronizacin en el flujo de control de un programa que todos los procesos de un grupo (no enmascarados) deben alcanzar para que cualquier proceso (no enmascarado) del grupo pueda continuar con la ejecucin de la instruccin que hay tras la barrera. La barrera se puede implementar a nivel software apoyndose en primitivas se sincronizacin de bajo nivel, como cerrojos, semforos o con apoyo de hardware.c) Recorrido (scan).- Todos los procesos envan un mensaje, recibiendo cada uno de ellos el resultado de reducir un conjunto de estos mensajes (figura 7.23). Con recorrido prefijo paralelo, el proceso P0 se queda con el dato que el mismo ha enviado; P1 recibe la reduccin de dos mensajes: P0 y P1, P2 recibe la reduccin de los mensajes de P0, P1, P2, y asi sucesivamente generalizando, Pi recibe el resultado de reducir los mensajes de P0, P1,. hasta Pi. Con sufijo paralelo, el proceso Pi recibe la reduccin de Pi, Pi+1,.., Pn-1.

Figura 7.23: recorrido (Scan)

En la tabla 7.6 se presentan algunos ejemplos de funciones para comunicacin colectiva en la biblioteca MPL. OpenMP tambin permite utilizar funciones colectivas.

Tabla 7.6. Algunas funciones colectivas en MPI

Uno-a-todosDifusin MPI_Bcast()

Dispersin MPI_Scatter()

Todos-a-unoReduccin MPI_Reduce()

Acumulacin MPI_Gather()

Todos-a-todosTodos difunden MPI_Allgather()

Servicios compuestosTodos combinan MPI_Allreduce()

Barreras MPI_Barrier()

Scan MPI_Scan()

Estilos de programacinAbordamos tres estilos de programacin que se utilizan actualmente en procesamiento paralelo: paso de mensajes, variables compartidas y paralelismo de datos. Las arquitecturas paralelas se diferencian en el estilo de programacin que ms favorece su implementacin hardware: paso de mensajes para multicomputadores, variables compartidas para multiprocesadores y paralelismo de datos para procesadores matriciales (SIMD). Con paso de mensajes se supone que cada procesador en el sistema tiene su espacio de direcciones propio. Los mensajes llevan datos de uno a otro espacio de direcciones ya adems se pueden aprovechar para sincronizar procesos. Los datos transferidos estarn duplicados en el sistema de memoria. Con variables compartidas, se supone que los procesadores en el sistema comparten el mismo espacio de direcciones.Al compartir este espacio, no se necesita transferir datos explcitamente, implcitamente se realiza la transferencia utilizando instrucciones del procesador de lectura y escritura en memoria. Para sincronizar, el programador utiliza primitivas que ofrece el software que se amparan en primitivas hardware para incrementar prestaciones. Con paralelismo de datos, las mismas operaciones se ejecutan en paralelo en mltiples unidades de procesamiento de forma que cada unidad aplica la operacin a un conjunto de datos distintos. Solo soporta paralelismo a nivel de bucle. La sincronizacin est implcita. Dispone de construcciones para la distribucin de datos entre los elementos de procesamiento.No obstante, podemos encontrar herramientas que permiten programar con paso de mensajes multiprocesadores. Estas herramientas implementan paso de mensajes en software apoyndose en el hardware para variables compartidas. Igualmente hay herramientas que nos permiten programar en multicomputadores usando variables compartidas, que implementan en software variables compartidas sobre el sistema d comunicacin para paso de mensajes. Dentro del estilo variables compartidas tambin se dispone de compiladores que extraen automticamente paralelismo a nivel de bucle hacindolo explicito a nivel de hebra, as como directivas del compilador. Hay implementaciones de lenguajes que soportan paralelismo de datos, tanto en multiprocesadores como en multicomputadores.1. Paso de mensajesPara redactar cdigo paralelo basado en paso de mensajes, se dispone de diversas herramientas software: lenguajes de programacin, como Ada (usando rendezvous) u Occam; o bibliotecas de funciones que actan de interfaz al sistema de comunicaciones, como MPI y PVM. Actualmente se utilizan ms las bibliotecas de funciones. Los fabricantes de supercomputadores suelen ofrecer implementaciones de lenguajes y bibliotecas para la programacin, que sacan partido de la arquitectura abstracta y concreta de sus maquinas. La parte 1 de MPI (Message Passing Interface) se desarrollo en 1994, y la parte 2, en 1996. En su desarrollo se tuvo en cuenta la experiencia con PVM (Parallel Virtual Machine); la versin 3 de PVM apareci en marzo de 1993. Se encuentran disponibles implementaciones gratuitas de MPI (MPI home); por ejemplo, la implementacin CHIMP-MPI, LAMP (LAM home) y MPICH (MPICH home). PVM dispone tambin de implementaciones gratuitas para linux y windows (PVM home).Las funciones bsicas de comunicacin que ofrecen las herramientas software para paso de mensajes han de permitir, al menos, comunicacin entre dos procesos (uno-a-uno). Para ello se utilizan dos funciones: una para enviar y otra para recibir (figuras 7.12 y 7.13): Send (destino, datos), funciona para enviar datos. Recieve (fuente, datos), funcin apara recibir datos.Generalmente, en la funcin para enviar, se especifica el proceso destino y la variable a enviar; y en la funcin de recepcin se especifica la fuente y la variable en la que se ubicaran los datos que se reciben.Nos podemos encontrar, por lo general, con transmisiones sncronas o asncronas. Si se implementa una transmisin sncrona, el proceso que ejecuta un send queda bloqueado hasta que el destino ejecute la funcin receive correspondiente; igualmente, el proceso que ejecuta receive queda bloqueado hasta que se realice el send correspondiente (figura 7.12). De esta forma los procesos fuente y destino se sincronizan antes de realizar la transferencia de datos.En una transmisin asncrona, send no deja bloqueado el proceso que lo ejecuta; generalmente se ofrece una implementacin de receive que deja bloqueado el proceso hasta que se realice el correspondiente send (figura 7.13). Este bloqueo del receive permite sincronizar procesos. Para el send puede ser no bloqueante es necesario utilizar un buffer en el que ubicar los datos que se envan al destino. Este buffer no es necesario en comunicaciones sncronas, en estas la transferencia de datos la realiza el sistema de comunicacin entre la variable del proceso fuente especificada en send y la variable del destino especificada en receive.Las herramientas de programacin pueden ofrecer implementaciones de receive no bloqueantes tiles para permitir que el proceso en espera de un mensaje, mientras este llega, pueda adelantar trabajo, en lugar de estar simplemente bloqueado sin hacer nada.Con el send-receive sncronos se implementan los que se denomina citas o rendez-vous, utilizados en Ada. En MPI y PVM la comunicacin ms utilizada es la que hemos denominado asncrona (send no bloqueante y receive bloqueante), pero tambin disponen de implementaciones de receive no bloqueantes. MPI tambin dispone de comunicacin sncrona. Adems MPI y PVM tiene funciones que implementan comunicaciones colectivas. Entre las funciones colectivas se incluye la barrera.Casi todos los computadores paralelos disponen de implementaciones MPI, tambin sistemas con memoria compartida.2. Variables compartidasHay diversas herramientas software para redactar cdigo paralelo basado en variables compartidas: lenguajes de programacin, como Ada 95 (tipos protegidos) o java: bibliotecas de funciones, como Pthread (POSIX-Thread) u OpenMP, y alternativas que usan lenguaje secuencial mas directivas dl compilador, como OpenMP. Los propios fabricantes ofrecen compiladores secuenciales con extensiones de directivas propias para programar sus maquinas.POSIX-Pthread es un estndar, introducido en 1996 por el comit de estndares del IEEE, basado en funciones. OpenMP es una biblioteca de funciones, directivas y variables, desarrollado por un grupo representativo de vendedores de hardware y software [OpenMP home]. Primero se defini una interfaz para Fortran en 1997, y en 1998 se defini la interfaz para C/C++.La comunicacin entre procesos se realiza accediendo a variables compartidas, por tanto, mediante instrucciones de lectura y de escritura en memoria . Las hebras de un proceso creadas con el SO, pueden compartir inmediatamente variables globales, no asi los procesos creados por el SO, ya que estos tienen espacio de direcciones independientes. En estos casos es necesario utilizar llamadas al sistema que explcitamente permiten compartir segmentos de datos por parte de los procesos.Las herramientas software ofrecen mecanismos para implementar sincronizacin: cerrojos, semforos, variables condicionales, monitores u otras construcciones que implementan secciones crticas o accesos a variables en exclusin mutua. Estos mecanismos sitan al programador en diferente nivel de abstraccin. Asi, por ejemplo, los cerrojos utilizan para implementar semforos, y los cerrojos junto con las variables condicionales se pueden utilizar para implementar monitores. La posibilidad de cometer error en la programacin (como interbloqueos) aumenta cuanto menor es el nivel de abstraccin de la primitiva utilizada. Hay que tener en cuenta tambin que las restricciones en la programacin aumentan conforme se suben de este nivel.Con respecto a la sincronizacin, en Ada 95 se aadieron los tipos protegidos, que son similares a los monitores; con POSIX-Thread se dispone de cerrojos, semforos y variables condicionales. OpenMP dispone de cerrojos y barreras, y construcciones para implementar secciones crticas, o acceso a variables atmico. Tambin permite utilizar funciones colectivas. Open MP tiene directivas que le permiten implementar paralelismo de datos como en HPF (directiva for). Adems, tambin dispone de directivas para implementar paralelismo de tareas (directiva section), y especificar cdigo a ejecutar solo por hebra padre (directiva single).Casi todos los computadores disponen de implementaciones OpenMP, desde los PC con procesadores multihebra simultnea (Pentium 4) hasta los supercomputadores.3. Paralelismo de datosEn este estilo de programacin 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 con 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, y construcciones para contribuir los datos (carga de trabajo) entre los elementos de procesamiento. El programador no tiene que ocuparse de las sincronizaciones: estn implcitas, es el compilador el que las genera. Estas construcciones son, o se traducen a, funciones de bibliotecas paralelas y/o directivas del compilador.Los lenguajes con paralelismo de datos, como C* (C start), aparecieron ligados a procesadores matriciales. Estas maquinas son arquitecturas SIMD. Desde su aparicin en 1960 los procesadores matriciales se han encontrado dentro de la gama de los supercomputadores, pero en 1997 dejaron de aparecer en la lista TOP500. No obstante, actualmente, la mayor parte de los computadores de altas prestaciones tienen compiladores para lenguajes con paralelismo de datos, como Fortran 90 y HPF.Fortran 90, basado en Fortran 77, permite al programador implementar paralelismo de datos utilizando operaciones con vectores y matrices. La primera versin de HPF apareci en 1992, es una ampliacin de Fortran 90, en la que se puede utilizar comunicaciones implcitas [A (I) = A (I - 1)] ; paralelizar bucles con la construccin FORALL del lenguaje o con la directiva INDEPENDENT; distribuir los datos entre los procesadores usando directivas (PROCESSORS, DISTRIBUTE); usar funciones de reduccin que a partir de un vector devuelven un escalar, funciones para reordenacin de datos en un vector; y otras funciones de biblioteca que ejecutan operaciones con estructuras (TRANSPOSE). La posibilidad de distribuir datos hace que HPF sea apropiado para sistemas con memoria distribuida.

Alternativas para crear y terminar procesos o hebrasLas herramientas para programacin paralela ofrecen diferentes procedimientos para crear y terminar procesos o hebras desde el punto de vista del usuario, que estn relacionadas con el modelo o modelos de programacin concretos que ofrecen al programador. Algunas herramientas solo admiten algunas alternativas.Por una parte, las hebras de un proceso se crean dinmicamente (en tiempo de ejecucin), mientras que los procesos se pueden crear de forma esttica o dinmica. En la creacin dinmica, los procesos se crean por parte de un proceso de la aplicacin en tiempo de ejecucin. En la creacin dinmica, el nmero de procesos o hebras que hay que crear se puede decidir en tiempo de ejecucin. La creacin dinmica de los procesos introduce una penalizacin en tiempo durante la ejecucin de la aplicacin, mayor que en la creacin de hebras. En la alternativa esttica, no hay ningn proceso que cree a otro. En este caso, el numero de procesos que se van a ejecutar se conoce de antemano.Por otra parte, desde el punto de vista del programador, la creacin de un conjunto de procesos (hebras) puede ser simultnea o no, y la terminacin puede ser sncrona (con el padre o entre todos los procesos) o asncrona. Entre estas alternativas se encuentran:

PadreCrear Hijos

Creacin Dinmica Creacin Esttica

A.- Creacin dinmica no simultnea y terminacin sncrona. Esta alternativa, permitida por diversas herramientas, se basa en dos funciones: FORK y JOIN como se muestra en siguiente figura. Cuando un programa ejecuta la funcin FORK crea dinmicamente un nuevo proceso (hebra) para que realice alguna tarea que se necesita. Cuando el padre precisa utilizar el resultado calculado por el hijo ejecuta un JOIN. Se quedara esperando en JOIN hasta que el hijo acabe (sincronizacin con el hijo). Como puede haber varios hijos creados, JOIN necesita como parmetro el identificador del hijo. En la figura se puede ver un ejemplo del modelo FORK JOIN en POSIX THREAD. La funcin PTHREAD_CREATE() crea una hebra que ejecuta el cdigo de la funcin FUNC1, con un argumento &ARG. En TID devuelve al padre el identificador del hijo. Este identificador del hijo. Este identificador se usara para referenciar al hijo en el programa padre. En la figura se usa en la funcin JOIN (PTHREAD_JOIN()), para que le padre espere a que la hebra con identificador TID termine.

ForkFork...JoinjoinT2T1Pthread_create(&tid,NULL,func1,&arg)......Pthread_join(tid,*status)func1(&arg){Return(*status);}PrincipalPrincipal

B.- Creacin simultnea y terminacin asncrona.En esta alternativa, el programador crea mltiples procesos (hebras) simultneamente, de forma que al terminar no hay ningn tipo de sincronizacin. Las herramientas de programacin permiten al programador especificar la creacin dinmica de mltiples procesos a la vez mediante la llamada a alguna funcin de biblioteca SPAWN (en PVM o MPI), la creacin de hebras mediante directivas (OpenMP) o construcciones del lenguaje. Mientras los hijos se ejecutan pueden comunicarse o sincronizarse entre si o con el padre. En la figura se puede ver como ejemplo una creacin de procesos en PVM. La uncin PVM_SPAWN() crea NPROC procesos que ejecutan el programa NOMBRE (modo SPMD). El segundo argumento de la funcin son los parmetros de entrada de NOMBRE; en este caso no tiene parmetros de entrada. La funcin devuelve en la lista PIDS los identificadores de los procesos creados. Estos identificadores se pueden utilizar en el programa NOMBRE para que cada proceso ejecute una unidad de cdigo diferente dentro de NOMBRE. En MPI-2, con MPI_Comn_SPAWN_Multiple, se pueden crear simultneamente procesos con distinto cdigo (MPMD) y procesos con el mismo cdigo pero distintos parmetros de entrada. Si consideramos una creacin ESTATICA, desde la consola PYM se puede crear de forma esttica mltiples procesos copias del mismo cdigo utilizando SPAWN. Con SPAWN 4 NOMBRE, se crean 4 copias de nombre. La creacin esttica de procesos no se describe en el estndar MPI, depende de la implementacin concreta. En la implementacin LAM de MPI [LAM home], se crean de forma esttica mltiples procesos simultneamente con MPIRUM C 4 Nombre (Cuatro 4 copias de NOMBRE).

SpawnT2T1Int nproc=2Pvm_spawn(nombre,char(**)0.0,, nproc,pids);Pids[1]Main(){pvm_exit(),Return(0);}PrincipalPrincipalPids[0]Main(){pvm_exit(),Return (0);}

C.- Creacin no simultnea y terminacin asncronaLlamadas varias veces a funciones SPAWN se pueden crear dinmicamente procesos en distintos momentos, que pueden ejecutar distinto cdigo. Hay mecanismos que permiten la comunicacin y la sincronizacin entre estos procesos, incluido el padre. En la figura se puede ver una creacin de procesos en PVM que sigue esta alternativa. Con dos llamadas a PVM_SPAWN() se crea (nproc=1), un procesos que va ejecutar el programa NOMBRE1 y otro que ejecuta NOMBRE2. En MPI es ms aconsejable utilizar MPI_Comn_SPAWN_Multiple. Tambin se puede crear de forma esttica mltiples procesos que ejecuten distinto cdigo pero que pertenezcan a la misma aplicacin, ejecutando mltiples veces SPAW en la consola PVM o MPIRUM en LAM MPI.

SpawnSpawnT2T1Pvm_spawn(nombre1,char(**)0.0,, %pids[0]);Pvm_spawn(nombre2,char(**)0.0,, %pids[0]);Pids[0]Main(){pvm_exit(),Return(0);}PrincipalPrincipalPids[1]Main(){pvm_exit(),Return(0);}

D.- Creacin simultanea y Terminacin sncrona.En esta alternativa el programador puede crear mltiples procesos (hebras) simultneamente, de forma que al terminar se sincronizan entre si y con el padre, o bien el padre debe esperar a que todos los hijos terminen antes de continuar. El programador especifica la creacin dinmicamente mediante directivas del compilador (OpenMP o HPF) o construcciones del lenguaje FORALL. En la figura se puede ver un ejemplo con OpenMP. La sincronizacin de los procesos (hebras) al terminar hace la programacin menos propensa a errores, pero mientras esperan estn ocupando un procesador sin realizar trabajo til. PVM y MPI permiten tambin la sincronizacin de los procesos en un grupo, el programador para ello debe utilizar explcitamente en los cdigos que ejecutan los procesos la funcin barrera (MPI_BARRIER, PVM_BARRIER) en el punto donde se desea la sincronizacin. En la figura, la funcion OMP_NUM_THREADS(3) fija el numero de hebras que se va a utilizar en una ejecucin paralela a 3. La directiva #pragma omp parallel for crea 2 hebras y reparte la ejecucin de las N iteraciones de ciclo for entre las dos hebras creadas y el padre. En total el ciclo se ejecuta en paralelo por 3 hebras. Las tres hebras se sincronizan al terminar.

Forall{S1;S2;}...S1S2S1S2T2T1Omp_set_num_threads(3);#pragma omp parallel for(i=1;i