330 likes | 545 Views
Programación Paralela. Niveles de Paralelismo en un programa. Grano Fino: ILP, Vectorización. Grano Medio: A nivel de thread. Grano Grueso: nivel de Proceso. Arquitecturas / Lenguajes. Vectorización: mediante el compilador, pero con ayuda del programador (-;
E N D
Niveles de Paralelismo en un programa • Grano Fino: ILP, Vectorización. • Grano Medio: A nivel de thread. • Grano Grueso: nivel de Proceso.
Arquitecturas / Lenguajes • Vectorización: mediante el compilador, pero con ayuda del programador (-; • OpenMP: Directivas / llamadas a func. • HPF: Directivas. • Caso de estudio multiplicación de matrices. • Caso práctico RMA2.
Ejemplo Mult de matrices #1 DO I=1,N DO J=1, N DO K=1,N D(I,J) = D(I,J) + A(I,K)*B(K,J) END DO END DO END DO
Ejemplo Mult de matrices #2 DO J=1,N DO K=1, N DO I=1,N C(I,J) = C(I,J) + A(I,K)*B(K,J) END DO END DO END DO Fortran utiliza Column Major Order!
OpenMP • API: Paralelismo multihilo explícito y de memoria compartida. • Compuesto por: Directivas de compilador, Rutinas de librería, Variables de entorno. • API para C/C++, Fortran. • Cantidad de hilos dinámicamente modificable.
¿Cuándo conviene paralelizar? SAXPY(Scalar Alpha X Plus Y) A = Ax + Y
Programa Ejemplo matmul Código Serial !$omp parallel do private(J,K) DO I=1,N DO J=1, N DO K=1,N C(I,J) = C(I,J) + A(I,K)*B(K,J) END DO END DO END DO !$omp end parallel do Más código serial
Comparación vectorización, OpenMP, Vectorización + OpenMP Datos de Máquinas Comunes y silvestres!!
Superlinealidad??? • Con N=400 el speedup entre la línea roja y la negra es sp=5.4 • Pero supuestamente el máximo teórico es de 2!!!!!!! • Qué ocurre en este caso??
PROGRAM ABmult IMPLICIT NONE INTEGER, PARAMETER :: N = 100 INTEGER, DIMENSION (N,N) :: A, B, C INTEGER :: i, j !HPF$ PROCESSORS square(2,2) !HPF$ DISTRIBUTE (BLOCK, BLOCK) ONTO square :: C !HPF$ ALIGN A(i,*) WITH C(i,j) ! replicate copies of row A(i,*) onto processors which compute C(i,j) !HPF$ ALIGN B(*,j) WITH C(i,j) ! replicate copies of column B(*,j) onto processors which compute C(i,j) A = 1 B = 2 C = 0 DO i = 1, N DO j = 1, N ! All the work is local due to ALIGNs C(i,j) = DOT_PRODUCT(A(i,:), B(:,j)) END DO END DO WRITE(*,*) C END
Caso Práctico: RMA2 Puente entre Santa Fé y Corrientes
Métodos Finitos Suma Eliminación: Ensamblado: Las etapas de eliminación no tienen que esperar a las de ensamblado!
Método Frontal Generation Addition N≈≈8000 Elimination
Tipo de carga La eliminación está compuesta de bucles de la siguiente forma La vectorización aplicada en estos bucles da un speedup de 2.7. Un resultado bueno, pero no suficiente. El algoritmo del método frontal es muy viejo e introduce mucha sobrecarga, además no es paralelizable. Para mejorar más, hay que cambiar de algoritmo!.
Representación de matrices Ralas • La dendidad es mu baja 0,05% de elementos no nulos • Una matriz típica tiene un tamaño 32000x32000. Esto con valores float de 4bytes puede llegar a dar: 32000x32000x4= 3906,25MB • No entra en la memoria, menos en la cache. • Row Major Format, soportado por PARDISO
Sorting Paralelo • La mejora introducida en el paso anterior es grande. • Con la nueva distribución de la carga el Sorting ocupa un 18% del total. • Todavía se puede mejorar más paralelizando del Sorting. • El Sorting se puede paralelizar fácilmente con OpenMP
Sorting Paralelo • NUMBER_OF_THREADS = OMP_GET_MAX_THREADS() • CHUNK_SIZE = I / NUMBER_OF_THREADS • !$omp parallel • !$omp+ private(IAM, LOWER, UPPER, SWAPPED, J, K, TEMPCOL, TEMPVAL) • IAM = OMP_GET_THREAD_NUM() • !Set Upper and Lower limits for each threads • LOWER = (IAM*CHUNK_SIZE) + 1 • !Consider an inexact division • IF (IAM.EQ.(NUMBER_OF_THREADS - 1)) THEN • UPPER = I - 1 • ELSE • UPPER = LOWER + CHUNK_SIZE - 1 • END IF • !SortElements using Bubble Sort • DO 700 J = LOWER, UPPER • SORT VALUES FROM LOWER TO UPPER • 700 CONTINUE • !$omp end parallel