PRÁCTICAS ARQUITECTURA DE COMPUTADORES Curso 2006-2007 / Segundo cuatrimestre Dpto. de Electrónica y Sistemas. Facultad de Informática. La Coruña 1. 1.1. Resolución de sistemas de ecuaciones lineales Objetivos En las dos primeras prácticas de la asignatura se abordó la paralelización de programas secuenciales utilizando la librerı́a de paso de mensajes PVM. El objetivo que se perseguı́a era poner de manifiesto las dificultades asociadas a la programación de máquinas paralelas (sincronización de procesos, intercambio de información entre procesos,...). Ası́mismo se perseguı́a que el estudiante se familiarizase con el manejo de la librerı́a de paso de mensajes PVM y el entorno XPVM. En esta tercera práctica el estudiante deberá profundizar en el proceso de paralelización de programas secuenciales para adquirir una visión global de dicho proceso independientemente de la arquitectura de la máquina paralela utilizada (memoria compartida, memoria distribuida). Al finalizar la práctica, el estudiante deberá ser capaz de comparar las distintas aproximaciones tanto desde un punto de vista técnico (facilidad de desarrollo, portabilidad, eficiencia del programa paralelo, grado de modificación del código fuente original) como empresarial (coste, disponibilidad de recursos hardware, disponibilidad de tiempo). 1.2. Problema a resolver Resolver el sistema de ecuaciones lineales Ax = b, siendo A una matriz cuadrada N ∗ N, utilizando la implementación del método de Gauss que se muestra en la Figura 1. Se pide desarrollar dos versiones de este algoritmo: Versión paralela para una red de estaciones de trabajo (multicomputador, memoria distribuida) utilizando la librerı́a de paso de mensajes PVM. Versión paralela para un sistema multiprocesador de memoria compartida utilizando las directivas de paralelización de OpenMP. Estas versiones deben estar optimizadas de forma que se extraiga el máximo rendimiento de la arquitectura de cada una de las máquinas. 1.3. Metodologı́a El proceso de desarrollo de programas paralelos a partir de programas secuenciales se puede descomponer en tres fases: 1. Análisis de dependencias: En esta fase se realiza un análisis detallado del comportamiento del programa secuencial centrándose en las dependencias de datos subroutine gauss(ab, x, N) integer N real ab(N,N+1), x(N) integer i, j, ifila, icol, ipv real pivote, factor do ipv = 1,N if(abs(ab(ipv,ipv)) .lt. 1.e-5) then print *, "pivote mal" return endif pivote = ab(ipv,ipv) do j=ipv,N+1 ab(ipv,j) = ab(ipv,j)/pivote enddo do ifila = 1,N if(ifila .ne. ipv) then factor=ab(ifila,ipv) do icol = ipv,N+1 ab(ifila,icol)=ab(ifila,icol)-factor*ab(ipv,icol) enddo endif enddo enddo return end Figura 1: Implementación del método de resolución de sistemas de ecuaciones lineales de Gauss. y de control que aparecen durante la ejecución del mismo. Las dependencias permiten al programador determinar el orden en que se tienen que ejecutar las sentencias del programa a fin de preservar su semántica. 2. Diseño de la estrategia óptima de paralelización: En general, las dependencias presentes en un programa permiten reordenar las sentencias de varias formas. La tarea del programador consiste en: (a) identificar el reordenamiento óptimo en términos de balanceo de la carga entre los procesadores y de minimización de la sobrecarga debida al intercambio de información entre los procesadores (e.g., paso de mensajes, mecanismo de coherencia caché, acceso a memorias remotas); y (b) identificar los puntos de sincronización necesarios para preservar la semántica del programa secuencial. 3. Implementación del programa paralelo: En esta fase se selecciona la herramienta (e.g., PVM, OpenMP) que se utilizará para la programación de las distintas máquinas paralelas (red de estaciones de trabajo, cluster de procesadores, SGI Origin 200, HP Superdome, SUN HPC4500,...). Es tarea del programador desarrollar un programa eficiente teniendo en cuenta las caracterı́sticas técnicas de la herramienta utilizada. Teniendo en cuenta las fases descritas anteriormente, el estudiante deberá llevar a cabo las siguientes tareas: 1. Utilizar las condiciones de Bernstein para analizar las dependencias que aparecen durante la ejecución secuencial del programa de la Figura 1 y ası́ identificar las secciones de código que se pueden ejecutar en paralelo. Elaborar un informe (máximo 2 carillas de un folio A4) que indique explı́citamente las secciones que no se pueden ejecutar en paralelo y las dependencias que lo impiden. 2 2. Estudiar las distintas posibilidades de reparto de la carga de trabajo y proponer dos estrategias, una en la que la carga esté balanceada y otra en la que esté desbalanceada. Presentar los resultados en un informe de una carilla de un folio A4. 3. Implementar dos versiones del programa paralelo que utilicen la estrategia que presenta balanceo de carga utilizando: a) Librerı́a de paso de mensajes PVM y una red de estaciones de trabajo. b) OpenMP y un multiprocesador de memoria compartida. Elaborar un informe (máximo 2 carillas de un folio A4) que contenga un diagrama de actividad de la versión PVM, un diagrama de actividad de la versión OpenMP, y una tabla comparativa de las ventajas e inconvenientes de las herramientas PVM y OpenMP. 1.4. Evaluación La entrega de la práctica está dividida en dos fases. En la primera fase, el estudiante presentará los resultados del análisis del programa secuencial y del diseño de las estrategias de paralelización. En la segunda fase, se exigirá un conocimiento detallado de las implementaciones paralelas del algoritmo de Gauss usando PVM y OpenMP. La evaluación se realizará bien por el procedimiento de defensa oral bien mediante un examen de prácticas. El estudiante podrá obtener una bonificación sobre la nota final de la asignatura si entrega las prácticas antes de las fechas indicadas en la siguiente tabla: Grupo prácticas Análisis&Diseño (2 sesiones) Implementación (6 sesiones) Jueves Viernes 29 marzo 2007 30 marzo 2007 31 mayo 2007 25 mayo 2007 Los códigos desarrollados por el estudiante deberán cumplir las siguientes restricciones: La matriz del sistema y el vector de términos independientes se obtendrán de dos ficheros “a.dat” y “b.dat” con el formato siguiente: “a.dat” N a11 a21 a12 a22 aN 1 aN 2 “b.dat” N b1 b2 ... bN ... a1N ... a2N ... ... aN N 3 El resultado se imprimirá en pantalla con el formato siguiente: x1 x2 ... xN El código de los programas paralelos debe estar bien estructurado, diseñando procedimientos especı́ficos para realizar las comunicaciones y las computaciones. 4