Algoritmos y Programación Paralela High Performance Fortran

Anuncio
Algoritmos y Programación
Paralela
High Performance Fortran
Contenidos
Motivación de HPF
High Performance Fortran
Directivas de HPF
Compiladores
Motivación de HPF
Fortran
fuertemente orientado al cálculo
adoptado ampliamente por la comunidad científica
Cálculo científico = intrínsecamente pesado
Como en la informática en general, no resulta fácil cambiar algo que funciona. Hay reticencia ha pasar
código a otros lenguajes.
Paralelizar aquello que merezca la pena. Cálculo pesado != cálculo paralelizable, aunque sí es candidato a
intentar paralelizar para obtener mayor ganancia.
Motivación de HPF
Alternativa 1: OpenMP
dimensiones de
problemas científicos
tendencia a arquitecturas
de memoria distribuida
distribución de
iteraciones:
<--- los datos se mueven hacia el procesador que
tiene asignada la computación.
Ante problemas de grandes dimensiones de datos, en esquemas centralizados tenemos problemas
derivados de la necesidad de paginación. En esquemas distribuidos, se pueden obtener mejores
rendimientos al fraccionar los datos.
exige reescritura de código. Existe extensión de OpenMP
NO
para Fortran.
HPF especifica la distribución de los datos: computación realizada por el propietario del dato resultado.
Motivación de HPF
Alternativa 2: MPI
esquema de Paso de
Mensajes
reescritura de código
más oscuro y complicado
no tiene sentido en
arquitecturas de memoria
compartida
Esquema totalmente distinto a Fortran, donde se ha de gestionar el movimiento de datos, la ubicación y la
sincronización.
Paso de mensajes y memoria compartida no implican restricción en el hardware, sólo son modelos de
programación. Puede simularse cualquiera de los modelos en cualquiera de las dos arquitecturas.
PROGRAM SUM
REAL A(100), BUFF(100)
PROGRAM SUM
IF (PID == 0) THEN
REAL A(10000)
DO IP = 0, 99
READ (9) A
READ (9) BUFF(1:100)
IF (IP == 0)
A(1:100) =
BUFF(1:100)
ELSE SEND(IP,BUFF,100)
ENDDO
SUM = 0.0
DO I = 1, 10000
SUM = SUM + A(I)
ENDDO
ELSE RECV(0,A,100)
PRINT SUM
ENDIF
END
IF (PID == 0) SEND(1,SUM,1)
IF (PID > 0) RECV(PID-1,T,1)
SUM = SUM + T
usando llamadas MPI----->
IF (PID < 99) SEND(PID+1,SUM,1)
ELSE SEND(0,SUM,1)
ENDIF
IF (PID == 0) PRINT SUM;
High Performance Fortran
Extensión de Fortran 90
operaciones vectoriales.
allocamiento dinámico.
permite definir tipos de datos estructurados.
recursión.
Promovido por el High Performance Fortran
Forum (HPFF):
http://www.hpfpc.org/index-E.html
Características de Fortran 90 con respecto al original, por ejemplo Fortran 77, además de soportar
conceptos de programación orientada objetos
High Performance Fortran
Objetivos:
Soportar paralelismo a nivel de datos.
Pocas directivas.
mínimas modificaciones del código existente.
código más limpio e intuitivo.
que trabaje el compilador (rendimiento difícil de prever), no el
programador.
Obtener buenos resultados en arquitecturas MIMD y
SIMD.
Soportar optimizar los códigos en diferentes
hardware.
Compatibilidad hacia atrás: si se trabaja con un
compilador HPF se interpretan
las directivas. Sino, se
toman como comentarios.
High Performance Fortran
PROGRAM SUM
PROGRAM SUM
REAL A(10000)
REAL A(10000)
READ (9) A
!HPF$ DISTRIBUTE A(BLOCK)
SUM = 0.0
READ (9) A
DO I = 1, 10000
SUM = 0.0
DO I = 1, 10000
SUM = SUM + A(I)
SUM = SUM + A(I)
ENDDO
ENDDO
PRINT SUM
PRINT SUM
END
END
usando llamadas HPF----->
Similar paradigma, código similar al original
High Performance Fortran
Características (I):
relajar la ejecución síncrona de las
instrucciones, buscando esa ejecución
tanto en computadores SIMD como MIMD
|
|
|
V
Paradigma de Paralelismo de Datos.
Modelo SPMD: cada procesador ejecuta el mismo
programa asíncronamente.
Tanto en máquinas de memoria compartida como
distribuida
Espacio de direcciones global:
el programador ve una única memoria
se deja al compilador (con ayuda de las directivas) la tarea de
distribuir los datos, acceder a memoria, gestionar las
comunicaciones, etc...
Procesadores virtuales: son mapeados a los
procesadores físicos.
High Performance Fortran
Características (II):
Cada procesador opera sobre un subconjunto de los
datos.
Distribución de los datos. Permite especificar qué
datos procesa cada procesador: computación realizada
por el propietario del dato resultado.
Proceso de compilación muy complejo (difícil obtener
altos rendimientos).
Considerado como estándar.
frente a otros, también lenguajes de paralelismo de datos,
como CM-Fortran, Fortran D, Vienna-Fortran.
HPF-Craft: implementación de HPF soportada por
plataformas MPP.
Directivas de HPF
Formato: !HPF$ <directiva>
Tipos Directivas:
PROCESSOR
DISTRIBUTE
ALING
FORALL
INDEPENDENT
Funciones Intrínsecas:
NUMBER_OF_PROCESSORS()
PROCESSORS_SHAPE()
afectan a las prestaciones del código
ejecutable, no a su significado
HPF es basado en directivas, para
evitar modificar el código existente lo
más posible (similar a OpenMP, pero
éste es para sistemas de memoria
centralizada y HPF intenta ser tanto
para centralizada como distribuída)
Directivas de HPF: PROCESSOR
Establece una malla lógica de procesadores.
!HPF$ PROCESSOR, DIMENSION(4) :: P1
!HPF$ PROCESSOR, DIMENSION(2,2) :: P2
!HPF$ PROCESSOR, DIMENSION(2,1,2) :: P3
Por lo general, mapeo
uno-a-uno.
Las dimensiones sin especificar toman valor por defecto igual a 1. Permitiendo linealizar las dimensiones
se dejan sin indicar.
que
Se ha escrito mucho sobre el mapeo de datos a los procesadores virtuales, pero poco se ha dicho sobre el
mapeo de procesadores virtuales a físicos.
Directivas de HPF: DISTRIBUTE
Especifica la distribución de los datos entre las
unidades de procesamiento.
!HPF$ DISTRIBUTE (BLOCK) ONTO P1 :: A
!HPF$ DISTRIBUTE (CYCLIC) ONTO P1 :: B
!HPF$ DISTRIBUTE (CYCLIC,BLOCK) ONTO P2 :: B
Variantes:
BLOCK(k)
CYCLIC(k)
Directivas de HPF: DISTRIBUTE
BLOCK
REAL, DIMENSION(16) :: A
!HPF$ PROCESSOR, DIMENSION(4) :: P1
!HPF$ DISTRIBUTE (BLOCK) ONTO P1 :: A
BLOCK + *
REAL X(12,12)
!HPF$ DISTRIBUTE X(BLOCK,*)
BLOCK + BLOCK
!HPF$ DISTRIBUTE Y(BLOCK,BLOCK)
Directivas de HPF: DISTRIBUTE
CYCLYC
REAL, DIMENSION(16) :: A
!HPF$ PROCESSOR, DIMENSION(4) :: P1
!HPF$ DISTRIBUTE (CYCLYC) ONTO P1 :: A
* + CYCLIC
REAL X(12,12)
!HPF$ DISTRIBUTE X(*,CYCLIC)
CYCLIC + CYCLIC
!HPF$ DISTRIBUTE
Y(CYCLIC(2),CYCLIC(3))
Directivas de HPF: ALING
Fuerza a los elementos de un vector o matriz a
ser alineados en la misma ubicación que los
de la plantilla.
!HPF$ ALIGN array(lista-fuente)
WITH target(lista-destino)
!HPF$ ALIGN (lista-fuente)
WITH target(lista-destino) :: array
Crea una relación entre el array y target de
modo que para todos los valores de
array(lista-fuente) y target(lista-detino) se
almacenan en el mismo procesador.
Directivas de HPF: ALING
REAL X(6,6),Y(6,6),W(5),Z(3)
!HPF$ ALIGN Y(i,j) WITH X(j,i)
!HPF$ ALIGN W(k) WITH X(k,*)
!HPF$ ALIGN Z(l) WITH Y(3,2*l-1)
X
Y
W
Z
Directivas de HPF: ALING
Estrecha relación con la directiva DISTRIBUTE.
Indiferentemente de la distribución, todos los
elementos alineados, se garantiza que se mapean
sobre el mismo procesador.
La modificación de una sola línea cambia todas las
distribuciones de datos (interesante cuando el código
es portado).
Se juega con ambas directivas:
!HPF$ DISTRIBUTE X(BLOCK,*)
!HPF$ DISTRIBUTE X(*,BLOCK) Directivas de HPF: FORALL
Diferenciar sentencias secuenciales de
sentencias paralelas.
“for” secuencial != sentencia paralela (FORALL)
Conceptualmente, ejecuta cada entrada en
paralelo.
Para bucles sin dependencias.
FORALL (i=2:n)
A(i) = A(i-1)
END FORALL
Directivas de HPF: INDEPENDENT
Válida para bucles DO clásicos y para
construcciones FORALL.
Determina que la porción del programa pueda
ser ejecutada en un orden arbitrario.
!HPF$ INDEPENDENT
DO I = 1, 100
A(P(I)) = B(I)
END DO
Directivas de HPF: Funciones
Intrínsecas
Obtener valores reales, específicos del
hardware:
NUMBER_OF_PROCESSORS()
PROCESSORS_SHAPE()
MAXLOC() + DIM
MINLOC() + DIM
Compiladores
ADAPTOR
2 componentes básicas:
Fadapt: traduce de HPF a Fortran90.
Dalib: se encarga del paralelismo.
Traduce a paso de mensajes para memoria
distribuida.
Multithread para memoria comopartida.
Multithreading (invoca a las rutinas de OpenMP)
PGHPF
Southampton Translation
Japoneses...
Descargar