CATEDRA CARRERA: PARADIGMA y LENGUAJES DE PROGRAMACIÓN LICENCIATURA EN SISTEMAS DE INFORMACION FACULTAD DE CIENCIAS EXACTAS QUIMICAS Y NATURALES UNIVERSIDAD NACIONAL DE MISIONES Año 2017 2do Cuatrimestre
PARADIGMA y LENGUAJES DE PROGRAMACIÓN UNIDAD I: Programación Concurrente Algoritmos concurrentes, distribuidos y paralelos. Motivación y aspectos de la programación distribuida UNIDAD II: Metodología de programación paralela. Descomposición, asignación de procesadores. Modelos de sistemas paralelos. Modelos de programación paralela. Evaluación de rendimiento. UNIDAD III: Programación paralela. Computación orientada a redes. Variantes de sistemas cliente/servidor. La interfaz MPI. Programación en hebras con OpenMP. Introducción a la programación de hardware gráfico paralelo: CUDA
PARADIGMA y LENGUAJES DE PROGRAMACIÓN UNIDAD IV: Programación Funcional El paradigma funcional. Tipos de datos. Intervalos. Operadores Listas. Árboles. Evaluación perezosa. Estrategia y técnicas de la evaluación perezosa. Introducción al lenguaje Haskell UNIDAD V: Programación Lógica. El paradigma Lógico. Sintaxis y semántica. Lógica de primer Orden. Grafos, evaluación de expresiones. Unificación. Clausula Horn resolución SLD. Introducción al lenguaje Prolog.
UNIDAD I: Programación Concurrente La concurrencia es el acaecimiento de varios sucesos al mismo tiempo. Desde el punto de vista de la programación concurrente, se dice que dos sucesos son concurrentes si uno sucede entre el comienzo y el fin de otro.
UNIDAD I: Programación Concurrente La forma de ejecutar un programa concurrente puede variar en función del hardware disponible: Multiprogramación Sistemas con un único procesador. Los procesos deben compartir el tiempo de cómputo.
UNIDAD I: Programación Concurrente Multiproceso Sistemas donde hay varios procesadores. Es posible asignar diferentes procesadores a diferentes procesos.
Programación Concurrente IMPORTANTE: Notar que aunque se disponga de varios procesadores, es posible que el número de procesos de los programas que deben ejecutarse en ellos sobrepase el número de procesadores disponibles. En tal caso, podría necesitarse multiprogramación incluso aunque existiera multiproceso.
Programación Concurrente
En las ciencias de la computación, un algoritmo paralelo, es el que puede ser ejecutado por partes en el mismo instante de tiempo por varias unidades de procesamiento, para finalmente unir todas las partes y obtener el resultado.
Ejercicio: Realiza el producto escalar de dos vectores de forma paralela. El producto escalar de dos vectores se define la sumatoria del producto entre los elementos del vector
Solución:
Ejercicio: Crear un algoritmo que calcule todos los números primos entre 1 y 100
Ejercicio: Crear un algoritmo que calcule todos los números primos entre 1 y 100 Se podría dividir los números originales en subconjuntos y calcular los primos para cada uno de los subconjuntos de los números originales; al final, uniríamos todos los resultados y tendríamos la solución final del algoritmo.
Algunos algoritmos son fácilmente divisibles en partes, por el contrario, a veces los problemas no son tan fácilmente paralelizables (Metodologías)
Instrucciones atómicas e intercalación Los procesos se definen de forma similar a un procedimiento. Un proceso puede recibir parámetros, tanto por valor como por referencia. Estos últimos pueden ser compartidos por diferentes procesos (si la misma referencia es pasada a todos ellos). Por ejemplo, el siguiente fragmento de código en PascalFC define un proceso que escribe por pantalla el valor de una variable:
Instrucciones atómicas e intercalación Una vez definido un proceso es posible declarar una o varias variables de tipo proceso en la sección de declaración de variables del programa principal. En el ejemplo anterior, se podría considerar declarar dos variables de tipo proceso print, p1 y p2 de la siguiente manera:
Instrucciones atómicas e intercalación En ejecución, se crearán dos procesos que ejecutarán la misma secuencia de instrucciones. Éste no tiene porqué ser siempre el caso, y como se verá más adelante un programa puede contener procesos que ejecutan acciones diferentes. P.P. P1 P2
Instrucciones atómicas e intercalación Es importante notar que el orden en el que aparecen los procesos dentro de este bloque no es importante: los procesos se iniciarán en orden aleatorio. La ejecución del bloque no termina hasta que todos los procesos hayan terminado. A continuación se presenta el programa completo: P.P. P2 P1
Instrucciones atómicas e intercalación
Instrucciones atómicas e intercalación Cuando se desarrollan programas concurrentes es especialmente importante conocer la secuencia de instrucciones que se ejecutan. En el ejemplo anterior, el hecho de que los procesos p1 y p2 se ejecuten concurrentemente quiere decir que sus instrucciones pueden ejecutarse en cualquier orden. En principio, dado que cada uno de ellos ejecuta solamente una instrucción, podría pensarse que el programa sólo puede producir dos salidas diferentes:
Instrucciones atómicas e intercalación Sin embargo, este programa puede producir en total cuatro salidas diferentes: Como se puede observar, en las dos últimas ejecuciones se intercalan las salidas de los procesos. Esto se debe a que la instrucción write, cuando recibe dos (o más) argumentos, se ejecuta realmente como dos (o más) instrucciones de escritura.
Instrucciones atómicas e intercalación En cambio, la instrucción write con un sólo argumento se ejecuta como una instrucción atómica.
Instrucciones atómicas e intercalación Las instrucciones atómicas son aquellas que son ejecutadas completamente antes de que se ejecute cualquier otra instrucción de cualquier otro proceso del programa. Por tanto, podemos estar seguros de que la cadena Soy el proceso se escribirá completamente en pantalla antes de que cualquier otra instrucción puede ejecutarse.
Instrucciones atómicas e intercalación La única manera de saber qué resultados puede producir un programa paralelo es estudiar todas las posibles intercalaciones, es decir, todas las posibles secuencias de instrucciones atómicas de los procesos que se pueden dar. En el programa anterior, el número de intercalaciones es relativamente pequeño, pero en programas más grandes esta opción puede no ser viable. Programación Paralela
Instrucciones atómicas e intercalación A la hora de construir algoritmos paralelos es especialmente importante, conocer qué instrucciones del lenguaje son realmente instrucciones atómicas y cuáles no.
Con algoritmos paralelos es más rápido tratar grandes tareas de computación que mediante técnicas secuenciales.
Esta es la forma en que se trabaja en el desarrollo de los procesadores modernos, ya que es más difícil incrementar la capacidad de procesamiento con un único procesador que aumentar su capacidad de cómputo mediante la inclusión de unidades en paralelo, logrando así la ejecución de varios flujos de instrucciones dentro del procesador. VS.
Pero hay que ser cauto con la excesiva paralelización ya que cada algoritmo paralelo tiene una parte secuencial y debido a esto, los algoritmos paralelos puedes llegar a un punto de saturación (Ley de Amdahl). Por todo esto, a partir de cierto nivel de paralelismo, añadir más unidades de procesamiento puede sólo incrementar el costo (planificación, comunicación).
El coste o complejidad de los algoritmos secuenciales se estima en términos del espacio (memoria) y tiempo (ciclos de procesador) que requiera. Los algoritmos paralelos también necesitan optimizar la comunicación entre diferentes unidades de procesamiento. Esto se consigue mediante la aplicación de dos paradigmas de programación y diseño de procesadores distintos: Memoria compartida. Paso de mensajes.
La técnica memoria compartida necesita del uso de semáforos o cerrojos en los datos para impedir que se modifique simultáneamente por dos procesadores, por lo que se produce un costo extra en ciclos de CPU. También obliga a serializar alguna parte del algoritmo. La técnica paso de mensajes usa canales y mensajes pero esta comunicación añade un costo, memoria adicional para las colas y los mensajes, así como la latencia en el mensaje.
Algoritmos distribuidos Una subclase de los algoritmos paralelos, son los algoritmos distribuidos. Estos están diseñados para trabajar en entornos tipo clusters y de computación distribuida, donde se usan otras técnicas, fuera del alcance de los algoritmos paralelos clásicos.
Algoritmos distribuidos Por lo general son procesadores geográficamente situados en diferentes lugares o un conjunto de maquinas independientes conectadas por una red. Estas entidades concurrentes tienen las siguientes características: - No comparten memoria - Sincronización en torno a comunicación - Son sistemas altamente escalables
Algoritmos distribuidos Conexión de ordenadores mediante red de interconexión. Multicomputadores. Cada ordenador con su memoria local y su propio espacio de direcciones. Como ejemplos de implementación de programas distribuidos podemos citar a los modelos de paso de mensajes con primitivas de comunicación send/receive:
Algoritmos distribuidos Conexión de ordenadores de uso convencional (monoprocesador o multiprocesador) mediante una red de interconexión de alta velocidad donde el conjunto se ve como un único ordenador.
Algoritmos distribuidos Otra propuesta de programación distribuida es Modelo RMI (Remote method invocation), que permite al programador invocar procedimientos remotos.
GUIA TP UNIDAD I Ejercicio 1 a) Que diferencia existe entre la multiprogramación y el multiproceso? b) Describa que es una instrucciones atómica y que es la intercalación? c) Considera a:=a+1 una instrucción atómica? Justifique la respuesta. d) Que podría pasar si dos procesos ejecutaran en paralelo la instrucción a:=a+1. Ejercicio 2 Investigar como instalar lenguaje PascalFC en su sistema operativo. Lectura recomendada por la cátedra: página del Ing. John Coppens http://jcoppens.com/soft/pfc2/
GUIA TP UNIDAD I Ejercicio 3 a) Implemente el ejercicio de la diapositiva 10 en PascalFC b) Al ejecutarlo varias veces que sucede con la salida del mismo? Ejercicio 4 Investigar: a) Que son los Semáforos en la programación paralela? b) Para que sirven? c) Cuales son sus instrucciones y para que se utiliza cada una? Ejercicio 5 Investigue e implemente una solución en PascalFC con semáforos al problema de la salida detectada en el ejercicio 3.
REFERENCIAS Libro Francisco Gortázar Bellas y otros. Lenguajes de Programación y Procesadores. Capitulo 3.5 Aula Virtual Daniel Guerrero Martínez. Universidad de Granada España. Disponible en: http://lsi.ugr.es/jmantas/pdp/teoria/descargas/pdp_tema1_introduccion.pdf Página del Ing. John Coppens. Disponible en: http://jcoppens.com/soft/pfc2/