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