Arquitecturas Paralelas IF - EHU Arquitecturas Paralelas 8. Paralelización de bucles. Reparto de tareas. - Introducción - Paralelización de bucles - Mecanismos.

Slides:



Advertisements
Presentaciones similares
DATSI, FI, UPM José M. Peña Programación en C DATSI, FI, UPM José M. Peña Programación en C.
Advertisements

Computadores de alta velocidad (la lista top500).
Complejidad Computacional
Configuración de Control
Tema 15. Contraste de hipótesis: Planteamiento de las hipótesis
TEMA 1 Introducción a la Programación Concurrente
Razonamiento basado en memoria
Planificación de Monoprocesadores
Planificador de Procesos
CLASE 3 SOFTWARE DEL MICROPROCESADOR
ARQUITECTURA DE COMPUTADORES - PERFORMANCE
Programando con OpenMP*
Programación Básica con NQC Pedro F. Toledo – Patricio Castillo 18/08/2006.
Planificación con Prioridades Fijas
UPC Tema: ESPACIO VECTORIAL Rn
PROGRAMACIÓN PARALELA Tema 5: Análisis de algoritmos paralelos
PROCESADORES SUPERESCALARES
Tema 1.- Aritmética. 1.-Usar el algoritmo de Euclides para calcular el máximo común divisor de a y b y expresarlo en función de a y b para: a) a= 56,
Arquitecturas Paralelas 12-13
CICLOS EN C – PARTE 2.
DIAGRAMAS DE FLUJO Y PSEUDOCÓDIGO
DIAGRAMAS DE FLUJO Y PSEUDOCÓDIGO
La minimización de los costes
Funcionamiento, programación
Pipelines: Riesgos.
Preguntas tipo test (Tema I)
Programación dinámica (1)
PASOS PARA CONSTRUIR UN
PROGRAMACIÓN DE SISTEMAS DE MEMORIA COMPARTIDA (SMP):
UPV-EHU / ATC Arquitecturas Paralelas Sincronización de procesos en sistemas SMP - Introducción - Exclusión mutua - Sincronización mediante eventos.
ALGORITMOS 2 DIGITALES II
Ejemplo: Creación y mutación de procesos
Arreglos (vectores, matrices, ….)
CONCURRENCIA. PLANIFICACIÓN DE PROCESOS EN SISTEMAS EN TIEMPO REAL Juan Antonio Fernández Madrigal, 2004 Departamento de Ingeniería de Sistemas y Automática.
Técnicas Digitales III Ejemplo de multiprocesamiento - Semáforo Universidad Tecnológica Nacional Facultad Regional San Nicolás.
Tema 3. Optimización de Código
SUCESIONES Y PROGRESIONES.
EJERCICIOS RESUELTOS 1. Geométricos 3. De análisis de parámetros
Administración del Procesador
Clases y objetos La unidad fundamental de programación OO son las clases. Conjunto de métodos y semántica Qué se va a hacer POO Clase: que define la implementación.
Ordenación, Clasificación

Estructuras de control
Tema 10: Gestión de Memoria
Semana 5 Subprogramas..
PROGRAMACION CONCURRENTE
PROGRAMACIÓN PARALELA Tema 4: Metodología de la programación
P rogramación de S istemas P aralelos IF - EHU PROGRAMACIÓN DE SISTEMAS PARALELOS 2010 Agustin Arruabarrena – Javier Muguerza.
Unidad III Administración de procesos
Programación de Memoria Compartida
Profesor: Rodrigo Sanhueza Figueroa
Pipelining Predicción dinámica de brincos. Universidad de SonoraArquitectura de Computadoras2 Introducción En base a la historia de la instrucción, predecir.
Programación de Memoria Compartida
Programación Básica con NQC Patricio A. Castillo Pizarro 25/08/2007.
Material de apoyo Unidad 4 Estructura de datos
Planificación de Procesos
Planificación y Gestión de procesos
Capítulo 7 Gestión de memoria.
Programación de Sistemas
Programación Básica con “NQC” Pedro F. Toledo – Patricio Castillo 18/08/2006.
Arquitecturas Paralelas
APRENDIZ: SANDRA L. CAICEDO C. ORDEN: 20194
Rendimiento de la CPU y sus factores
Unidad 2 – Gestión de Procesos
Por: Mario Felaco Mercedes Martinez Sistemas Operativos III Ene-Mar 2007.
UTFSM - Sistemas Operativos
Estructuras de Decisión
PROCESADOR.- El procesador es el cerebro del sistema, encargado de procesar toda la información. Básicamente, es el "cerebro" de la computadora. Prácticamente,
Ciclos de Repeticion Yoel Gutierrez Unidad 6. Contenido DefinicionExplicacionEjemplosReferencias.
Ciclos condicionales y exactos Estructura de control de ciclos
Transcripción de la presentación:

Arquitecturas Paralelas IF - EHU Arquitecturas Paralelas 8. Paralelización de bucles. Reparto de tareas. - Introducción - Paralelización de bucles - Mecanismos de sincronización - Optimizaciones principales - Reparto de las iteraciones - Secciones paralelas

A rquitecturas P aralelas IF - EHU P. Bucl. 28  Identificar qué tareas pueden ejecutarse en paralelo y cuáles no (análisis de dependencias). Sincronizar los procesos. Repartir los procesos a los procesadores.  Objetivo: ejecutar los programas P veces más rápido; caso particular: bucles.  Hacerlo de manera eficiente. Introducción

A rquitecturas P aralelas IF - EHU P. Bucl. 38  Tipos de paralelismo (1) (a) Paralelismo de datos do i = 1, 1000 do i = 1001, 2000 do i = 2001, 3000 A(i) = func(i)A(i) = func(i)A(i) = func(i) enddoenddoenddo P0 P1 P2 do i = 1, 3000 A(i) = func(i) enddo Introducción

A rquitecturas P aralelas IF - EHU P. Bucl. 48  Tipos de paralelismo (1) (b) Paralelismo de función Introducción P0P1 F1 F2 F3 F4

A rquitecturas P aralelas IF - EHU P. Bucl. 58  Tipos de paralelismo (2) ▪ grano fino (fine grain) tareas “pequeñas” / mucha comunicación ▪ grano medio ▪ grano grueso (coarse grain) tareas “grandes”/ poca comunicación ▪  grado de paralelismo Introducción

A rquitecturas P aralelas IF - EHU P. Bucl. 68  ¿Dependencias entre tareas? Sincronización - global (barreras) - punto a punto (eventos) Introducción P0P1 F1 F2 F3 F4

A rquitecturas P aralelas IF - EHU P. Bucl. 78  Dos modelos ▪ Maestro-esclavo Un thread master genera P threads para ser ejecutados en paralelo, que “mueren” al terminar su tarea. ▪ SPMD (Single-Program-Multiple-Data) Se ejecutan P copias iguales independientes. Las tareas se diferencian mediante el pid del proceso. Introducción

A rquitecturas P aralelas IF - EHU P. Bucl. 88  Paralelización de bucles grano fino / medio reparto de iteraciones del bucle análisis de dependencias  Hacerlo de manera eficiente. ¿El programador o el compilador? Introducción

A rquitecturas P aralelas IF - EHU P. Bucl. 98  Salvo casos muy obvios, la paralelización del código (análisis de dependencias, reparto de tareas, etc.) sigue siendo responsabilidad del programador. Por ello, vamos a ver algunas de las opciones más habituales a la hora de paralelizar bucles de manera eficiente. Introducción

A rquitecturas P aralelas IF - EHU P. Bucl. 108  Se necesita que una fracción importante del código pueda ejecutarse en paralelo. ¡No olvides la ley de Amdahl!  Paralelizar (como vectorizar) código implica cambiar el orden original de las instrucciones del bucle. Por tanto, tenemos que analizar las dependencias entre las instrucciones del bucle. Introducción

A rquitecturas P aralelas IF - EHU P. Bucl. 118 Ejemplo: do i = 0, N-1 A(i) = A(i) + 1 enddo P0: L0 +0 S0 P1: L1 +1 S1 P2: L2 +2 S2 …... En paralelo Introducción L0 +0 S0 L1 +1 S1 L2 +2 S2...

A rquitecturas P aralelas IF - EHU P. Bucl. 128 Introducción: depend. dependencia RAW i: A =... j:= A antidependencia WAR i:= A... j: A = dependen. de salida WAW i: A =... j: A = i j dependencias verdaderas dependencias de nombre

A rquitecturas P aralelas IF - EHU P. Bucl. 138 Bucles + Grafo de dependencias + Distancia de la dependencia do i = 2, N-2 1 A(i) = B(i) C(i) = A(i-2) + A(i+1) enddo A(2) = B(2) + 2 C(2) = A(0) + A(3) A(3) = B(3) + 2 C(3) = A(1) + A(4) A(4) = B(4) + 2 C(4) = A(2) + A(5) A(5) = B(5) + 2 C(5) = A(3) + A(6) 1 2 A, 2 A, 1 Introducción: depend.

A rquitecturas P aralelas IF - EHU P. Bucl. 148 do i = 2, N-31 1 A(i) = B(i) C(i) = A(i-2) 3 D(i+1) = C(i) + C(i+1) 4 B(i+1) = B(i) D(i+30) = A(i) enddo A, 0 A, 2 C, 0 C, 1 D, 29 B, 1 Introducción: grafos de dep.

A rquitecturas P aralelas IF - EHU P. Bucl Espacio de iteraciones do i = 2, N-1 do j = 1, N-2 1 A(i,j) = A(i,j-1) * 2 2 C(i,j) = A(i-2,j+1) + 1 enddo 1 2 A 2,-1 A 0,1 i j Introducción: grafos de dep.

A rquitecturas P aralelas IF - EHU P. Bucl. 168  Test de dependencias: únicamente para funciones lineales del índice del bucle. do i = L1, L2 X(a*i+b) = = X(c*i+d) enddo ? L1 L2 i a*i+b c*i+d i1 i2 Introducción: test de dep. d - bd - b MCD(c,a)  Z → no hay depend.

A rquitecturas P aralelas IF - EHU P. Bucl. 178  Paralelizar el código significa repartir tareas (iteraciones de un bucle) a procesadores. Pero hay que respetar las dependencias de datos. El problema principal son las dependencias de distancia > 0, y sobre todo aquellas que forman ciclos en el grafo de dependencias. Paralelización de bucles

A rquitecturas P aralelas IF - EHU P. Bucl. 188  Siempre es posible ejecutar un bucle en P procesadores, añadiendo sincronización para asegurar que se respetan las dependencias de datos… … lo que no significa que siempre sea sensato hacerlo, pues hay que tener en cuenta el coste global: cálculo + sincronización (comunicación). Paralelización de bucles

A rquitecturas P aralelas IF - EHU P. Bucl. 198 Objetivos:  Repartir las iteraciones de un bucle entre los procesadores, para que se ejecuten “a la par”.  Siempre que se pueda, que se ejecuten de manera independiente, sin necesidad de sincronizar (dependencias de distancia 0).  En función de las características del sistema (comunicación, reparto de tareas…) intentar que las tareas tengan un cierto tamaño. Paralelización de bucles

A rquitecturas P aralelas IF - EHU P. Bucl. 208  Tal vez sólo se pueda utilizar un número limitado de procesadores.  Atención al rendimiento (p. e., problemas en la cache). Paralelización de bucles

A rquitecturas P aralelas IF - EHU P. Bucl. 218 > Ejemplos Paralelización de bucles P0P1 P2 P3 do i = 0, N-1 A(i) = A(i) + 1 B(i) = A(i) * 2 enddo

A rquitecturas P aralelas IF - EHU P. Bucl. 228 Paralelización de bucles > Ejemplos P0P1 P2 P3 ? do i = 0, N-2 A(i) = B(i) + 1 B(i+1) = A(i) * 2 enddo

A rquitecturas P aralelas IF - EHU P. Bucl. 238 Paralelización de bucles > Ejemplos P0 P1 do i = 0, N-3 A(i+2) = A(i) + 1 enddo

A rquitecturas P aralelas IF - EHU P. Bucl. 248 Paralelización de bucles > Ejemplos do i = 0, N-1 do j = 1, M-1 A(i,j) = A(i,j-1) + 1 enddo P0P1P2P3

A rquitecturas P aralelas IF - EHU P. Bucl. 258 Paralelización de bucles > Ejemplos P0 P1 P2 P3 do i = 0, N-1 do j = 1, M-1 A(i,j) = A(i,j-1) + 1 enddo

A rquitecturas P aralelas IF - EHU P. Bucl. 268  Si todas las dependencias son de distancia 0 (las iteraciones son independientes), éstas se pueden repartir como se quiera entre los procesadores, sin tener que sincronizarlas: doall.  Si hay dependencias entre iteraciones, pero todas van hacia adelante, se pueden sincronizar mediante barreras: forall (o doall + barrier).  Si las dependencias forman ciclos, hay que utilizar sincronización punto a punto: doacross. Paralelización de bucles

A rquitecturas P aralelas IF - EHU P. Bucl. 278  Las iteraciones son independientes, por lo que el reparto puede hacerse como se quiera: doall. Bucles doall do i = 0, N-1 C(i) = C(i) * C(i) A(i) = C(i) + B(i) D(i) = C(i) / A(i) enddo doall i = 0, N-1 C(i) = C(i) * C(i) A(i) = C(i) + B(i) D(i) = C(i) / A(i) enddoall C, 0C, 0 A, 0 i =

A rquitecturas P aralelas IF - EHU P. Bucl. 288  Hay dependencias entre iteraciones, pero todas van “hacia adelante”: forall.  Cada dependencia puede sincronizarse con una barrera: los procesos esperan a que todos hayan ejecutado una determinada instrucción antes de pasar a ejecutar la siguiente.  Hay más sincronización que la estrictamente necesaria, pero es sencillo de implementar. Bucles forall

A rquitecturas P aralelas IF - EHU P. Bucl. 298 Bucles forall do i = 1, N-1 C(i) = C(i) * C(i) A(i) = C(i) + B(i) D(i) = C(i-1) / A(i) enddo forall i = 1, N-1 C(i) = C(i) * C(i) A(i) = C(i) + B(i) BARRERA (...) D(i) = C(i-1) / A(i) endforall i = barrera C, 0C, 0 A, 0 C, 1C, 1

A rquitecturas P aralelas IF - EHU P. Bucl. 308 Bucles forall do i = 1, N-1 C(i) = C(i) * C(i) A(i) = C(i) + B(i) D(i) = C(i-1) / A(i) enddo i = barrera doall i = 1, N-1 C(i) = C(i) * C(i) A(i) = C(i) + B(i) enddoall [ BARERRA (...) ] doall i = 1, N-1 D(i) = C(i-1) / A(i) enddoall C, 0C, 0 A, 0 C, 1C, 1

A rquitecturas P aralelas IF - EHU P. Bucl. 318  Las dependencias forman ciclos: doacross, sincro- nización punto a punto (productor / consumidor).  Sincronización de las dependencias mediante vectores de eventos: post(vA,i) → vA(i) := 1 wait(vA,i) → esperar a que vA(i) = 1  Si vA(i) = 0, aún no se ha ejecutado la iteración i de la instrucción que se está sincronizando. Bucles doacross

A rquitecturas P aralelas IF - EHU P. Bucl. 328 do i = 2, N-2 A(i) = B(i-2) + 1 B(i+1) = A(i-2) * 2 enddo 1 2 A,2 B, i= doacross i = 2, N-2 wait (vB,i-3) A(i) = B(i-2) + 1 post (vA,i) wait (vA,i-2) B(i+1) = A(i-2) * 2 post (vB,i) enddoacross Bucles doacross

A rquitecturas P aralelas IF - EHU P. Bucl. 338 do i = 2, N-2 A(i) = B(i-2) + 1 B(i+1) = A(i-2) * 2 enddo doacross i = 2, N-2 wait (vB,i-3) A(i) = B(i-2) + 1 post (vA,i) wait (vA,i-2) B(i+1) = A(i-2) * 2 post (vB,i) enddoacross 1 2 A,2 B,3, 3, 3 Bucles doacross P0 P1 P2

A rquitecturas P aralelas IF - EHU P. Bucl. 348  No siempre hay que ejecutar en paralelo do i = 0, N-2 A(i) = B(i) + C(i) B(i+1) = A(i) / 2 enddo doacross i = 0, N-2 wait (vB,i-1) A(i) = B(i) + C(i) B(i+1) = A(i) / 2 post (vB,i) enddoacross 1 2 A,0 B,1 1 2 p w 1 2 p w 1 … ?? Bucles doacross

A rquitecturas P aralelas IF - EHU P. Bucl. 358  Vectores de eventos en dos dimensiones Bucles doacross P0 P1 P2 P3 do i = 0, N-2 do j = 0, N-2 A(i+1,j+1) = A(i+1,j) + 1 B(i,j) = A(i,j) enddo doacross i = 0, N-2 do j = 0, N-2 A(i+1,j+1) = A(i+1,j) + 1 post (vA,i,j) wait (vA,i-1,j-1) B(i,j) = A(i,j) enddo enddoacross

A rquitecturas P aralelas IF - EHU P. Bucl. 368  Antidependencias / Dependencias de salida Si son entre procesos, hay que sincronizarlas. do i = 0, N-3 A(i) = B(i+2) / A(i) B(i) = B(i) + C(i) enddo doacross i = 0, N-3 A(i) = B(i+2) / A(i) post (vB,i) wait (vB,i-2) B(i) = B(i) + C(i) enddoacross 1 2 B,2 LD B(i+2) post... wait ST B(i) Otras dependencias

A rquitecturas P aralelas IF - EHU P. Bucl. 378  Instrucciones de tipo if do i = 1, N-1 if (B(i) > 0) then A(i) = A(i) + B(i) C(i) = A(i-1) / 2 endif enddo doacross i = 1, N-1 if (B(i) > 0) then A(i) = A(i) + B(i) post (vA,i) wait (vA,i-1) C(i) = A(i-1) / 2 endif enddoacross else post (vA,i) endif 1 2 A,1 0 Instrucciones if

A rquitecturas P aralelas IF - EHU P. Bucl. 388  Cómo sincronizar las instrucciones mediante vectores de eventos ( post/wait ) - inicialización - tamaño (memoria) - ojo con la falsa compartición mediante contadores Mecanismos de sincron.

A rquitecturas P aralelas IF - EHU P. Bucl. 398  Contadores de sincronización (uno por cada depen- dencia) -las instrucciones van “acabando” en orden estricto, e incrementan el contador. - cA = j han terminado todas las iteraciones hasta la j, y no la j +1. i = vA(i) = cA = 2 Contadores de sincron.

A rquitecturas P aralelas IF - EHU P. Bucl. 408  Para sincronizar una dependencia mediante un contador: -tras ejecutar la iteración i, esperar a que el valor del contador sea i-1 (es decir, a que se haya ejecutado esa instrucción hasta la iteración i-1). wait (cA,i-1) → esperar a que cA = i-1 - incrementar el contador, para indicar que también se ha ejecutado la iteración i. post (cA,i) → cA := cA + 1 (cA := i) Contadores de sincron.

A rquitecturas P aralelas IF - EHU P. Bucl. 418 doacross i = 3, N-1 wait (vD,i-3) C(i) = C(i) * D(i-3) post (vC,i) A(i) = C(i) + B(i) wait (vC,i-1) D(i) = C(i-1) / A(i) post (vD,i) enddoacross do i = 3, N-1 C(i) = C(i) * D(i-3) A(i) = C(i) + B(i) D(i) = C(i-1) / A(i) enddo C, 0 A, 0 C,1 D, doacross i = 3, N-1 wait (cD,i-3) C(i) = C(i) * D(i-3) wait (cC,i-1) post (cC,i) A(i) = C(i) + B(i) D(i) = C(i-1) / A(i) wait (cD,i-1) post (cD,i) enddoacross Contadores de sincron.

A rquitecturas P aralelas IF - EHU P. Bucl. 428 doacross i = 3, N-1 C(i) = C(i) * D(i-3) wait (cC,i-1) post (cC,i) A(i) = C(i) + B(i) D(i) = C(i-1) / A(i) enddoacross Minimizar la sincronización P C, 0 A, 0 C,1 D,3 do i = 3, N-1 C(i) = C(i) * D(i-3) A(i) = C(i) + B(i) D(i) = C(i-1) / A(i) enddo Contadores de sincron

A rquitecturas P aralelas IF - EHU P. Bucl. 438 forall i =... [ 1 ] barrera(...) [ 2 ] [ 3 ] barrera(...) [ 4 ] endforall doacross i =... [ 1 ] post (vA,i) wait (vA,i-1) [ 2 ] post (vC,i) [ 3 ] wait (vC,i-2) [ 4 ] enddoacross doacross i =... [ 1 ] wait (cA,i-1) post (cA,i) [ 2 ] wait (cC,i-1) post (cC,i) [ 3 ] [ 4 ] enddoacross A, 1 C, 2 B,0 A,0 4 Ejemplo

A rquitecturas P aralelas IF - EHU P. Bucl Deshacer la definición de constantes y las variables de inducción. 1. Eliminar todas las dependencias que no son intrínsecas al bucle. Por ejemplo: do i = 0, N-1 X = A(i) * B(i) C(i) = SQRT(X) D(i) = X - 1 enddo doall i = 0, N-1 X(i) = A(i) * B(i) C(i) = SQRT(X(i)) D(i) = X(i) - 1 enddoall convertir X en una variable privada Principales optimizaciones

A rquitecturas P aralelas IF - EHU P. Bucl Fisión del bucle. Si una parte del bucle hay que ejecutarla en serie, romper el bucle convenientemente y ejecutar lo que sea posible en paralelo. do i = 1, N-1 A(i) = A(i-1) / 2 D(i) = D(i) + 1 enddo do i = 1, N-1 A(i) = A(i-1) / 2 enddo doall i = 1, N-1 D(i) = D(i) + 1 enddoall Principales optimizaciones

A rquitecturas P aralelas IF - EHU P. Bucl Ordenar las dependencias (hacia adelante). do i = 1, N-1 A(i) = D(i-1) / 2 D(i) = C(i) + 1 enddo forall i = 1, N-1 D(i) = C(i) + 1 BARRERA (...) A(i) = D(i-1) / 2 endforall 1 2 D, 1 2………….1 2………1 2…….1 1…2.. ?? Principales optimizaciones

A rquitecturas P aralelas IF - EHU P. Bucl Alinear las dependencias: peeling. do i = 1, N-1 A(i) = B(i) C(i) = A(i-1) + 2 enddo 1 2 A, 1 doall i = 1, N-2 A(i) = B(i) C(i+1) = A(i) + 2 enddoall C(1) = A(0) + 2 A(N-1) = B(N-1) Principales optimizaciones

A rquitecturas P aralelas IF - EHU P. Bucl. 488 do i = 2, N-1 A(i) = B(i) C(i) = A(i-1) + A(i-2) enddo 1 2 A, 2 A, 1 C(2) = A(1) + A(0) C(3) = B(2) + A(1) doall i = 2, N-3 A(i) = B(i) X(i+1) = B(i+1) C(i+2) = X(i+1) + A(i) enddoall A(N-2) = B(N-2) A(N-1) = B(N-1) do i = 2, N-1 A(i) = B(i) X(i) = B(i) C(i) = X(i-1) + A(i-2) enddo Principales optimizaciones 1’1’ 2 A, 2 X, 1 1

A rquitecturas P aralelas IF - EHU P. Bucl Generar hilos independientes do i = 0, N-3 A(i+1) = B(i) + 1 B(i+2) = A(i) * 3 C(i) = B(i+2) - 2 enddo B(2) = A(0) * 3 C(0) = B(2) - 2 doall k = 0, 2 do i = pid, N-4, 3 A(i+1) = B(i) + 1 B(i+3) = A(i+1) * 3 C(i+1) = B(i+3) – 2 enddo enddoall A(N-2) = B(N-3) B,0 B,2 A, Principales optimizaciones

A rquitecturas P aralelas IF - EHU P. Bucl Minimizar la sincronización do i = 2, N-1 B(i) = B(i) + 1 C(i) = C(i) / 3 A(i) = B(i) + C(i-1) D(i) = A(i-1) * C(i-2) E(i) = D(i) + B(i-1) enddo B,0 B,1 A,1 4 5 C,1C,1 C,2 D,0 doacross i = 2, N-1 B(i) = B(i) + 1 C(i) = C(i) / 3 post (vC,i) wait (vC,i-1) A(i) = B(i) + C(i-1) post (vA,i) wait (vA,i-1) D(i) = A(i-1) * C(i-2) E(i) = D(i) + B(i-1) enddoacross i= Principales optimizaciones

A rquitecturas P aralelas IF - EHU P. Bucl Tratamiento de bucles: intercambio. Principales optimizaciones do i do_par j do_par i do j do_par i do_par j do i

A rquitecturas P aralelas IF - EHU P. Bucl. 528 Ejemplo: do i = 1, N-1 do j = 0, N-1 A(i,j) = A(i-1,j) + 1 enddo do i = 1, N-1 doall j = 0, N-1 A(i,j) = A(i-1,j) + 1 enddoall enddo Principales optimizaciones j= i=

A rquitecturas P aralelas IF - EHU P. Bucl. 538 Ejemplo: doall j = 0, N-1 do i = 1, N-1 A(i,j) = A(i-1,j) + 1 enddo enddoall do i = 1, N-1 do j = 0, N-1 A(i,j) = A(i-1,j) + 1 enddo Principales optimizaciones j= i=

A rquitecturas P aralelas IF - EHU P. Bucl Tratamiento de bucles: cambio de sentido. j=0 1 2 i= do i = 1, 100 do j = 0, 2 A(i,j) = A(i,j) - 1 D(i) = A(i-1,j+1) * 3 enddo do j = 2, 0, -1 doall i = 1, 100 A(i,j) = A(i,j) - 1 D(i) = A(i-1,j+1) * 3 enddoall enddo Principales optimizaciones

A rquitecturas P aralelas IF - EHU P. Bucl. 558 do j = 1, 2N-1 doall i = max(1,j-N+1), min(j,N) A(i,j-(i-1)) = A(i-1,j-(i-1)) + A(i,j-1-(i-1)) enddoall enddo 9.Skew do i = 1, N do j = 1, N A(i,j) = A(i-1,j) + A(i,j-1) enddo Principales optimizaciones

A rquitecturas P aralelas IF - EHU P. Bucl Otras optimizaciones típicas Aumento del tamaño de grano y reducción del overhead de la paralelización. -Juntar dos bucles en uno (¡manteniendo la semántica!): fusión. -Convertir un bucle de dos dimensiones en otro de una sola dimensión: colapso o coalescencia. … Principales optimizaciones

A rquitecturas P aralelas IF - EHU P. Bucl. 578  ¿Cómo se reparten las iteraciones de un bucle entre los procesadores? Si hay tantos procesadores como iteraciones, tal vez una por procesador.  Pero si hay menos (lo normal), hay que repartir. El reparto puede ser: estático: en tiempo de compilación. dinámico: en ejecución. Reparto de iteraciones

A rquitecturas P aralelas IF - EHU P. Bucl. 588  El objetivo: intentar que el tiempo de ejecución de los trozos que se reparten a cada procesador sea similar, para evitar tiempos muertos (load balancing).  En todo caso, OJO con las dependencias (sincronización), el tamaño de grano, la localidad de los accesos y el coste del propio reparto. Reparto de iteraciones

A rquitecturas P aralelas IF - EHU P. Bucl. 598  Planificación estática Qué ejecuta cada procesador se decide en tiempo de compilación. Es por tanto una decisión prefijada. Cada proceso tiene una variable local que lo identifica, pid [0..P-1]. Dos opciones básicas: reparto consecutivo y reparto entrelazado. Reparto de iteraciones

A rquitecturas P aralelas IF - EHU P. Bucl No añade carga a la ejecución de los threads. - Pero no asegura el equilibrio de la carga entre los procesos. -Permite cierto control sobre la localidad de los accesos a cache. ▪ Consecutivo ▪ Entrelazado principio = pid * N/P fin = (pid+1) * N/P – 1 do i = principio, fin... enddo do i = pid, N, P... enddo Reparto de iteraciones

A rquitecturas P aralelas IF - EHU P. Bucl. 618  Equilibrio en el reparto de carga estático (fijo) Tej asignación dinámica de una nueva tarea Tej do i = 1, 80 if (A(i) > 0) calcular() enddo Reparto de iteraciones

A rquitecturas P aralelas IF - EHU P. Bucl. 628  Planificación dinámica Para intentar mantener la carga equilibrada, las tareas se van escogiendo en tiempo de ejecución de un cola de tareas. Cuando un proceso acaba con una tarea (un trozo del bucle) se asigna un nuevo trozo. Dos opciones básicas: los trozos que se van repartiendo son de tamaño constante o son cada vez más pequeños. Reparto de iteraciones

A rquitecturas P aralelas IF - EHU P. Bucl. 638 Las iteraciones se reparten una a una, o por trozos de tamaño Z.  Self / Chunk scheduling Añade carga a la ejecución de los threads. Hay que comparar ejecución y reparto. LOCK (C); mia = i; i = i + Z; Z = 1  self UNLOCK (C); while (mia <= N-1) endwhile do j = mia, min(mia+Z-1, N-1)... enddo LOCK (C) mia = i; i = i + Z; UNLOCK (C) Reparto de iteraciones

A rquitecturas P aralelas IF - EHU P. Bucl. 648 Los trozos de bucle que se reparten son cada vez más pequeños según nos acercamos al final.  Guided / Trapezoidal ▪ Guided :parte proporcional de lo que queda por ejecutar: Z s = (N – i) / P (entero superior) que equivale a: Z i = Z i-1 (1 - 1/P) Reparto de iteraciones

A rquitecturas P aralelas IF - EHU P. Bucl. 658 ▪ Trapezoidal : reduciendo el trozo anterior en una constante: Z i = Z i-1 - k op. de planificación Z1Z1 ZnZn 1 n 2 i k Z2Z2 Reparto de iteraciones

A rquitecturas P aralelas IF - EHU P. Bucl. 668  En general, el reparto dinámico busca un mejor equilibrio en el reparto de carga, pero: - hay que considerar la carga que se añade (overhead), en relación al coste de las tareas que se asignan. - hay que considerar la localidad en los accesos a los datos y los posibles problemas de falsa compartición. Reparto de iteraciones

A rquitecturas P aralelas IF - EHU P. Bucl. 678  Ejemplo de reparto (1.000 iteraciones, 4 procesadores) : ▪ chunk (Z = 100) (10) ▪ guided quedan: … se reparten : … (22) ▪ trapezoidal (Z 1 = 76, Z n = 4 >> k = 3) … (25) Reparto de iteraciones

A rquitecturas P aralelas IF - EHU P. Bucl. 688  Paralelismo a nivel de procedimiento o función: F2 F3 F1 F4 F5 - modelo Fork / Join - Parallel sections Fork F1 F2 Join Fork F3 F4 Join F5 doall k = 0, 1 if (pid = 0) then F1 if (pid = 1) then F2 endoall [barrera] doall k = 0, 1 if (pid = 0) then F3 if (pid = 1) then F4 endoall F5 Secciones paralelas

último tema… ¡el año que viene! Arquitecturas Paralelas IF - EHU P. Bucl. | Secciones paralelas  Paralelismo a nivel de procedimiento o función: - Modelo Fork / Join - Parallel sections F2 F3 F1 F4 F5 Fork F1 F2 Join Fork F3 F4 Join F5 doall k = 0, 1 if (pid=0) then F1 if (pid=1) then F2 endoall [hesia] doall k = 0, 1 if (pid=0) then F3 if (pid=1) then F4 endoall F5