Ir al contenido

Método de Foster (PCAM)

Ian Foster (Designing and Building Parallel Programs, 1995). Dos abstracciones:

  • Task = programa + memoria local + puertos de entrada/salida.
  • Channel = cola de mensajes que conecta la salida de un task con la entrada de otro: define la dependencia.
  1. Particionar — dividir datos y tareas en muchas primitive tasks.
    • Descomposición del dominio: divide la data (la más grande / más accedida) y luego asigna tareas.
    • Descomposición funcional: divide la tarea y luego decide qué data usa cada pieza.
    • Reglas: #tareas ≥ un orden de magnitud mayor que #procesos; tareas de tamaño parecido; #tareas crece con nn.
  2. Comunicar — definir canales (es overhead: no existe en la versión secuencial). Local (pocos vecinos) o global. Buscar comunicación balanceada y concurrente.
  3. Aglomerar — agrupar tareas para bajar overhead (las que se comunican mucho, las que no pueden ser concurrentes, pares envío/recibo) y garantizar escalabilidad.
  4. Mapear — asignar tareas a procesos: maximizar utilización y minimizar comunicación. Balanceo estático (distribución fija) o dinámico (número variable de tareas por proceso).

Foster paso a paso: P → C → A → M

Compara aglomerar por franjas de filas vs bloques 2D: mismo cómputo, distinta comunicación.

etapa 0/4
Inicio
Problema: stencil de 5 puntos sobre una malla N×N (cada celda se actualiza con sus 4 vecinos).
tareas—
canales—
carga por proceso—
frontera (filas / bloques)24 / 16

Ejemplo resuelto: suma de n=1012n=10^{12} números

Sección titulada «Ejemplo resuelto: suma de n=1012n=10^{12}n=1012 números»

Datos: una suma = 10−910^{-9} s; envío/recibo 10−810^{-8} s/Byte; cada proceso puede sumar a lo más 10910^9 números.

  • P: suma de a pares → 1012−110^{12}-1 tareas primitivas.
  • C: 1012−210^{12}-2 canales (topología lineal).
  • A: 10510^5 números por tarea → 10710^7 canales.
  • M: cada proceso suma 10910^9 números → 10310^3 canales.
Ts=1012⋅10−9=1000 sTp=109⋅10−9+103⋅10−9+103⋅8⋅10−8≈1.00008 sT_s=10^{12}\cdot10^{-9}=1000\text{ s}\qquad T_p=10^9\cdot10^{-9}+10^3\cdot10^{-9}+10^3\cdot8\cdot10^{-8}\approx1.00008\text{ s}

Conclusión: el mapeo final no cambia, pero la topología sí afecta el tiempo; aquí la diferencia es mínima porque el problema es compute bound (domina el término de cómputo 109⋅10−9=110^9\cdot10^{-9}=1 s).

Aplique Foster al suavizado de un array de nn píxeles con tt iteraciones: Uit=Ui−1t−1+Uit−1+Ui+1t−13U_i^t=\dfrac{U_{i-1}^{t-1}+U_i^{t-1}+U_{i+1}^{t-1}}{3}. Cada proceso puede manejar a lo más 4 MB; cada píxel es un float. (1.1) Pasos de Foster. (1.2) Fronteras del dominio y de subdominios. (1.3) TsT_s, TpT_p con 10−910^{-9} s/op y 10−810^{-8} s/Byte.

Antes de ver la solución, mira el algoritmo funcionando: cada iteración intercambia los bordes entre vecinos (halo) y luego calcula localmente.

Suavizado 1D con intercambio de halo (PD01)

Uit=13(Ui−1t−1+Uit−1+Ui+1t−1)U_i^{t}=\tfrac13\left(U_{i-1}^{t-1}+U_i^{t-1}+U_{i+1}^{t-1}\right) · cada iteración: ① intercambio de celdas fantasma entre vecinos → ② cómputo local.

fase 0/12
P0 · 6 pxP1 · 6 pxP2 · 6 pxP3 · 6 px01234567891011121314151617181920212223
iteración0/6
mensajes / iteración6
ops / proceso / iter.≈ 18
¿igual al secuencial?sí ✓
Con los datos del PD01 (tc=10−9t_c=10^{-9}, tw=10−8t_w=10^{-8} s/B) y, por ejemplo, n=107, t=103n=10^7,\ t=10^3: Ts=3nt tcT_s=3nt\,t_c = 30 s, Tp=t[3nptc+8tw]T_p=t\left[3\tfrac{n}{p}t_c+8t_w\right] = 7.5 s ⇒ S = 4, E = 1.
El halo es O(1) por proceso (2 floats) mientras el cómputo es O(n/p): la razón comunicación/cómputo baja al crecer n/p.
Ver solución (1.1 Foster)
  • Partición: descomposición de dominio; tarea primitiva = un valor UitU_i^t ⇒ malla n×tn\times t (cada fila depende de la anterior).
  • Comunicación: cada (i,t)(i,t) necesita 3 valores de t−1t-1: patrón local tipo stencil 1D, sin comunicación global.
  • Aglomeración: bloques contiguos de ss píxeles por proceso; solo se comunican los bordes (halo). Límite de memoria: smax=4 MB4 B=220s_{max}=\dfrac{4\,\text{MB}}{4\,\text{B}}=2^{20} píxeles.
  • Mapeo: p=⌈n/s⌉p=\lceil n/s\rceil procesos en topología lineal: PkP_k solo habla con Pk−1P_{k-1} y Pk+1P_{k+1}.
Ver solución (1.2 fronteras)
  • Frontera del dominio (i=1i=1, i=ni=n): celda fantasma replicada (U0=U1U_0=U_1, Un+1=UnU_{n+1}=U_n) o promedio de solo 2 valores.
  • Frontera de subdominios: intercambio de halo en cada iteración: enviar el píxel de borde al vecino y recibir el suyo en una celda auxiliar. Los procesos extremos solo intercambian con un lado.
Ver solución (1.3 T_s, T_p y métricas)

3 operaciones por píxel (2 sumas + 1 división):

Ts=3 n t tcTp=t[3nptc+8 tw]T_s=3\,n\,t\,t_c\qquad T_p=t\left[3\frac np t_c+8\,t_w\right]

(cada proceso intercambia 1 float = 4 B con 2 vecinos por iteración). Métricas derivadas:

S=3n tc3nptc+8twE=3n tc3n tc+8p twTo=pTp−Ts=8 p t twS=\frac{3n\,t_c}{3\frac np t_c+8t_w}\qquad E=\frac{3n\,t_c}{3n\,t_c+8p\,t_w}\qquad T_o=pT_p-T_s=8\,p\,t\,t_w

Isoeficiencia: 3nttc=K⋅8pttw⇒n=8Ktw3tc p=O(p)3ntt_c=K\cdot8ptt_w\Rightarrow n=\dfrac{8Kt_w}{3t_c}\,p=O(p) — lineal, muy escalable. Ejemplo n=222n=2^{22}, t=100t=100, p=4p=4: Ts=1.258T_s=1.258 s, Tp=0.3146T_p=0.3146 s, S≈3.9999S\approx3.9999, E≈0.99997E\approx0.99997.

Autoevaluación

0/4 correctas · 0 respondidas
1. ¿En qué paso de Foster decides que cada proceso reciba un bloque de n/pn/p píxeles contiguos?
2. ¿Cuántas tareas primitivas conviene tener respecto a los procesos?
3. En la suma de 101210^{12} números, ¿por qué el árbol casi no mejora TpT_p?
4. En el modelo task/channel…

Fuente ·estudio/01_Flynn_Foster.md §2–5 · PD01-Ejercicio1-Resolucion.md · CS4052-PD01-S02.pdf · U1.2-Fundamentos-Foster_Flynn-apuntes.pdf