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:
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.NO exige reescritura de código. Existe extensión de OpenMP para Fortran.
HPF especifica la distribución de los datos: computación realizada por el propietario del dato resultado.
<--- los datos se mueven hacia el procesador que tiene asignada la computación.
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(10000)
READ (9) A
SUM = 0.0
DO I = 1, 10000
SUM = SUM + A(I)
ENDDO
PRINT SUM
END
PROGRAM SUM
REAL A(100), BUFF(100)
IF (PID == 0) THEN
DO IP = 0, 99
READ (9) BUFF(1:100)
IF (IP == 0)
A(1:100) = BUFF(1:100)
ELSE SEND(IP,BUFF,100)
ENDDO
ELSE RECV(0,A,100)
ENDIF
IF (PID == 0) SEND(1,SUM,1)
IF (PID > 0) RECV(PID-1,T,1)
SUM = SUM + T
IF (PID < 99) SEND(PID+1,SUM,1)
ELSE SEND(0,SUM,1)
ENDIF
IF (PID == 0) PRINT SUM;
END
usando llamadas MPI----->
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 FortranObjetivos:
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.
PROGRAM SUM
REAL A(10000)
READ (9) A
SUM = 0.0
DO I = 1, 10000
SUM = SUM + A(I)
ENDDO
PRINT SUM
END
PROGRAM SUM
REAL A(10000)
!HPF$ DISTRIBUTE A(BLOCK)
READ (9) A
SUM = 0.0
DO I = 1, 10000
SUM = SUM + A(I)
ENDDO
PRINT SUM
END
usando llamadas HPF-----> Similar paradigma, código similar al original
High Performance Fortran
High Performance Fortran
Características (I):
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.
relajar la ejecución síncrona de las instrucciones, buscando esa ejecución tanto en computadores SIMD como MIMD | | | V
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 que se dejan sin indicar.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: DISTRIBUTEBLOCK
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: DISTRIBUTECYCLYC
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: ALINGEstrecha 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$ INDEPENDENTDO 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...
Top Related