Optimización de Operaciones Matriciales en Plataformas Multi-GPU
Transcripción
Optimización de Operaciones Matriciales en Plataformas Multi-GPU
HPC&A Optimización de Operaciones Matriciales en Plataformas Multi-GPU Enrique S. Quintana-Ortí Albacete – Julio 2011 1 “Disclaimer” Disclaimer No es un curso sobre cómo programar rutinas de computación t ió matricial ti i lab bajo j nivel i l sobre b GPU GPUs • • HPC&A V. Volkov et al. “Benchmarking g GPUs to tune dense linear algebra”, SC08 L-S. Chien, “Hand-tuned SGEMM on GT200 GPU”, TR Tsing Hua Univ., Taiwan + Lo siento si en algunas ocasiones los números dejan mal a “algunas” compañías… Albacete – Julio 2011 2 Sistemas lineales enormes: Estimación del campo gravitatorio HPC&A Proyecto GRACE www.csr.utexas.edu/grace t d / Resolver y = H x0 + Є, H → m x n densa m = 66.000 observaciones n = 26.000 parámetros para un modelo de resolución de 250 km Albacete – Julio 2011 3 Problemas de valores propios enormes: Simulaciones de dinámica molecular HPC&A Proyecto de bioinformática estructural www.chaconlab.org Calcular los valores propios de un sistema (A,B) A,B → n x n densas n = 40,000-300,000 Albacete – Julio 2011 4 Problemas de computación matricial Los problemas de computación matricial aparecen en muchas h aplicaciones li i científicas, i tífi d de ingeniería e industriales y algunos de ellos son enormes… BEM para problemas de electromagnetismo y acústica Análisis de la polarización dieléctrica de nanoestructuras Reducción de modelos de circuitos VLSI Albacete – Julio 2011 HPC&A 5 Problemas de computación matricial Los problemas de computación matricial densa suelen l ttener un alto lt coste t computacional: t i l HPC&A Resolver Ax = b, con A → n x n densa requiere O(n3) flops ...pero a las GPUs les “encantan” los problemas grandes de mucho coste y con patrones grandes, regulares de acceso Albacete – Julio 2011 6 Índice HPC&A Bibliotecas para computación matricial densa Optimizaciones en plataformas mono-GPU Programación de plataformas multi multi-GPU GPU Albacete – Julio 2011 7 Índice HPC&A Bibliotecas para computación matricial densa Optimizaciones en plataformas mono-GPU Programación de plataformas multi multi-GPU GPU Albacete – Julio 2011 8 Bibliotecas para CMD: BLAS-1 y BLAS-2 En un tiempo no muy lejano, los procesadores vectoriales t i l d dominaban i b lla titierra… ...realizar la mayor parte de cálculos como operaciones vectoriales HPC&A BLAS-1: axpy (y := y + α x), dot (y := xT y) BLAS 2: gemv (y := α y + β A x), BLAS-2: x) trsv (x := T-1 b) Albacete – Julio 2011 9 Bibliotecas para CMD: BLAS-3 “The attack of the killer micros”, Brooks, 1989… …realiza la mayor parte de los cálculos como operaciones matriciales HPC&A BLAS-3: gemm (C := α C + β A B), trsm (X := T-1 B) Albacete – Julio 2011 10 Bibliotecas para CMD: La importancia de BLAS HPC&A Proporcionar rendimiento “portable” Reconocido por los fabricantes Intel MKL ACM ACML IBM ESSL GotoBLAS (K. Goto ahora en Microsoft) NVIDIA CUBLAS Albacete – Julio 2011 11 Bibliotecas para CMD HPC&A Operaciones de computación matricial más complejas: l j Sistemas de ecuaciones lineales Problemas de mínimos cuadrados Cálculo de valores propios Cálculo de valores singulares y rango matricial LAPACK www.netlib.org/lapack Albacete – Julio 2011 libflame www.cs.utexas.edu/users/flame 12 Índice Bibliotecas para computación matricial densa Optimizaciones en plataformas mono-GPU HPC&A Rendimiento básico Rellenado Construyendo con bloques Computación híbrida CPU-GPU Transferencia de datos Programación de plataformas multi-GPU Albacete – Julio 2011 13 Consideraciones iniciales HPC&A ¿Calcular XYZ en la CPU o en la GPU? “Naturaleza” de XYZ Tamaño (coste) de XYZ Sobrecostes: Reservar/liberar memoria en la GPU Transferir datos entre CPU y GPU Realizar llamadas a CUDA/CUBLAS Albacete – Julio 2011 14 Entorno de experimentación Propósito general HPC&A NVIDIA Intel Dual Xeon Quad-Core Quad Core E5410 8 [email protected] GHz Pico SP/DP 149/75 GFLOPS 8 GB FB-DIMM GotoBLAS2 1.11 Tesla C1060 (x4 = S1070) 240 SP [email protected] GHz Pico SP/DP 933/78 GFLOPS 4 GB DDR3 CUBLAS 2.3 AMD Phenom Quad-Core 4 [email protected] GHz 4 GB DDR2 GotoBLAS 1.26 Fermi GTX480 480 SP [email protected] GHz 1.5 GB GDDR5 CUBLAS 2.3 Albacete – Julio 2011 15 Rendimiento básico en una GPU: gemm C := C + A HPC&A * B Alta reutilización de datos 2n3 flops vs. 3 n x n datos Variantes: 3 dimensiones: m, m n, n k A or B pueden aparecer transpuestas o no Albacete – Julio 2011 16 Versión Rendimiento básico en una GPU: gemm Albacete – Julio 2011 Sp C1060 ((with ith transfer) t f ) HPC2.26 2&A26 C1060 (w/out transfer) 2.55 GTX480 ((with transfer)) 3.43 GTX480 (w/out transf.) 4.25 17 Versión Rendimiento básico en una GPU: gemm Albacete – Julio 2011 Sp C1060 ((with ith transfer) t f ) HPC0.92 0&A92 C1060 (w/out transfer) 0.95 GTX480 ((with transfer)) 2.17 GTX480 (w/out transf.) 2.43 18 Rendimiento básico en una GPU: gemm HPC&A Conclusiones CUBLAS exhibe un rendimiento muy irregular: pobre optimización (uso de la gemm de V. Volkov para problemas d di de dimensión ió 32k) Coste de las transferencias amortizado para problemas grandes d Albacete – Julio 2011 19 Rellenado C HPC&A := C + A * B Añade un coste despreciable: 2n3 → 2n3+ Є flops Aplicable a muchas otras operaciones Puede hacerse transparente al usuario Albacete – Julio 2011 20 Rellenado Albacete – Julio 2011 HPC&A 21 Construyendo con bloques HPC&A Otras operaciones de BLAS-3 Variantes del producto matricial: trmm, symm Resolución de (múltiples) sistemas triangulares: trsm Actualización simétrica de rango k: syrk Actualización simétrica de rango g 2k: syr2k y El mismo ratio de computación/comunicaciones que gemm Albacete – Julio 2011 22 Construyendo con bloques: trsm X := T-1 * HPC&A B Alta reutilización de datos: O(n3) flops vs. O(n2) datos Variantes: 2 dimensiones: m, m n T puede estar transpuesta, a la derecha/izquierda de B, ser triangular inferior o superior superior, etc etc. Albacete – Julio 2011 23 Construyendo con bloques: trsm := HPC&A * Construir trsm como una secuencia de gemm más unas pequeñas trsm BLAS “para pobres”: realizar la mayor parte de los cálculos como gemm Albacete – Julio 2011 24 Construyendo con bloques: trsm Albacete – Julio 2011 HPC&A Version Sp GEMM as B.B. 1.50 25 Computación híbrida CPU-GPU x := A-1 HPC&A * b Para A densa, descomponerla en factores triangulares g Varios métodos de factorización: Factorización LU (eliminación Gaussiana) para A general Factorización de Cholesky para A s.p.d. Factorización QR para sistemas sobredeterminados Albacete – Julio 2011 26 Computación híbrida CPU-GPU: factorización de Cholesky A = L * HPC&A LT En cada iteración, calcular un bloque de columnas (p (panel)) de L Sobreescribir (la parte triangular inferior de) A con L Albacete – Julio 2011 27 Computación híbrida CPU-GPU: factorización de Cholesky HPC&A … 1ª iter. 2ª iter. 3ª iter. A11 = L11 L11T A21 = L21 := A21 L11-T A22 := A22 – L21 L21T Albacete – Julio 2011 28 Computación híbrida CPU-GPU: factorización de Cholesky Estrategia: “Descargar” las partes computacionalmente poco intensivas a la CPU Inicialmente, transferir toda la matriz A a la GPU En cada iteración: Albacete – Julio 2011 HPC&A Mover A11 a la CPU,, factorizar el bloque q allí,, y enviar el resultado de vuelta a la GPU Actualizar A21 y A22 en la GPU 29 Computación híbrida CPU-GPU: factorización de Cholesky Albacete – Julio 2011 HPC&A Version Sp C1060 (with transfer) 1.77 GTX480 (with transfer) 1.77 30 Transferencia de datos HPC&A ¿Quién está al cargo de las transferencias entre GPU y CPU? El usuario (programador) via CUDA Sistema: parte de un runtime GMAC SuperMatrix/libflame GPUSs Albacete – Julio 2011 31 Índice HPC&A Bibliotecas para computación matricial densa Optimizaciones en plataformas mono-GPU Programación de plataformas multi multi-GPU GPU Memoria compartida Clusters de GPUs Albacete – Julio 2011 32 Programación de plataformas multi-GPU HPC&A ¿Cómo programamos estos sistemas? GPU #1 PCI-e bus CPU(s) GPU #3 GPU #2 GPU #4 Ver como… Un sistema multiprocesador con memoria compartida Un cluster (memoria distribuida) Albacete – Julio 2011 33 Memoria compartida HPC&A Multiprocesador con memoria compartida: GPU #1 CPU(s) PCI-e bus GPU #3 GPU #2 P1+ cache Main memory GPU #4 P3+ cache P2+ cache h P4+ cache No es trivial Sistema heterogéneo: n CPUs + m GPUs Múltiples espacios de direcciones: 1 + m Albacete – Julio 2011 34 Memoria compartida HPC&A Multiprocesador con memoria compartida: GPU #1 CPU(s) PCI-e bus GPU #3 GPU #2 GPU #4 P1+ cache Main memory P3+ cache P2+ cache h P4+ cache No es trivial → ¡Runtime! Sistema heterogéneo: Planificación (temporal+espacial) Múltiples espacios de direcciones: Transferencia de datos Albacete – Julio 2011 35 Planificación en plataformas multi-GPU HPC&A Factorización de Cholesky … 1ª iter. 2ª iter. 3ª iter. A11 = L11 L11T A21 = L21 := A21 L11-T A22 := A22 – L21 L21T Albacete – Julio 2011 36 Planificación en plataformas multi-GPU HPC&A Gran cantidad de tareas… … 1ª iter. 2ª iter. 3ª iter. pero cuidado, deben realizarse en cierto orden Albacete – Julio 2011 37 Planificación en plataformas multi-GPU HPC&A ¡Gran cantidad de paralelismo de tareas! En iteraciones diferentes 1ª iter. 2ª iter. En la misma iteración Albacete – Julio 2011 38 Planificación en plataformas multi-GPU Código g escalar loop: ld addd sd addi subi bnez Albacete – Julio 2011 f0, f4, f4, r1, r2 r2, r2, HPC&A Procesador superescalar: p 0(r1) f0, f2 0(r1) r1, #8 r2 r2, #1 loop IF ID ISS UF0 UF1 UF2 39 Planificación en plataformas multi-GPU HPC&A ¿Es posible algo similar para CMD? 1ª iter. 2ª iter. 3ª iter. 3 iter Albacete – Julio 2011 for (k=0; k<nb; k++){ F: Chol(A[k,k]); for (i=k+1; i<nb; i++) T Trsm(A[k,k], (A[k k] A[i A[i,k]); k]) T T: for (i=k+1; i<nb; i++){ P: Syrk(A[i,k],A[i,i]); for (j=k+1; j<i; j++) P: Gemm(A[i,k], A[j,k], A[i,j]); } } 40 Planificación en plataformas multi-GPU HPC&A ¿Es posible algo similar para CMD? 1ª iter. 2ª iter. Aplicar técnicas de superescalaridad a nivel de bloque Implementación por software Paralelismo a nivel de thread/tarea Objetivo: núcleos/GPUs de la plataforma 3ª iter. 3 iter Albacete – Julio 2011 41 Planificación en plataformas multi-GPU HPC&A L/E de bloques fijan dependencias, como en el caso escalar l loop: ld f0 0( f0, 0(r1) 1) addd f4, f0, f2 sd f4 0(r1) f4, addi r1, r1, #8 … f for (k 0 k (k=0; k<nb; b k++){ k ){ Chol(A[k,k]); for (i=k+1; i<nb; i++) Trsm(A[k,k], A[i,k]); … Las tareas y sus dependencias forman un árbol (DAG) Albacete – Julio 2011 … 42 Planificación en plataformas multi-GPU Código por bloques: HPC&A Multi-core/multi-GPU for (k=0; k<nb; k++){ Chol(A[k,k]); for (i=k+1; i<nb; i++) Trsm(A[k,k], A[i,k]); … ¿Cómo generamos el árbol de tareas? ¿Qué Q éd debemos b ttener en cuenta t all ejecutar j t llas ttareas d dell á árbol? b l? Albacete – Julio 2011 43 Planificación en plataformas multi-GPU Uso de un runtime: Decodificación (ID): Generar el árbol de tareas con un “análisis análisis simbólico” del código en tiempo de ejecución Emisión (ISS): Ejecución de las tareas del árbol consciente de la arquitectura Albacete – Julio 2011 ID ISS HPC&A N0 N1 N2 44 Planificación en plataformas multi-GPU Etapa de decodificación: ID ISS “Análisis simbólico” del código HPC&A N0 N1 N2 for (k=0; k<nb; k++){ Chol(A[k,k]); for (i=k+1; i<nb; i++) Trsm(A[k,k], A[i,k]); … Albacete – Julio 2011 Árbol de tareas: … Código por bloques: 45 Planificación en plataformas multi-GPU Etapa de emisión: Planificación temporal de las tareas, de acuerdo a las dependencias p Mapeado (planificación espacial) de tareas a recursos, consciente de la localidad … ID Albacete – Julio 2011 ISS HPC&A N0 N1 N2 46 Memoria compartida HPC&A Multiprocesador con memoria compartida: GPU #1 CPU(s) PCI-e bus GPU #3 GPU #2 GPU #4 P1+ cache Main memory P3+ cache P2+ cache h P4+ cache No es trivial → ¡Runtime! Sistema heterogéneo: Planificación (temporal+espacial) Múltiples espacios de direcciones: Transferencia de datos Albacete – Julio 2011 47 Múltiples espacios de direcciones HPC&A Software Distributed-Shared Memory (DSM) Underlying distributed memory hidden from the users Well-known approach, not too efficient as a middleware for general apps. Regularity of dense linear algebra operations makes a difference! Albacete – Julio 2011 48 Múltiples espacios de direcciones HPC&A Naive approach: … Before executing a kernel, copy input data to GPU memory After execution, retrieve results back to CPU memory Easy to program (wrappers to kernels) O(n3) Transfers between CPU and GPU Albacete – Julio 2011 49 Múltiples espacios de direcciones HPC&A Multiprocesador con memoria compartida GPU #1 CPU(s) PCI-e bus GPU #3 GPU #2 P1+ cache Main memory GPU #4 P3+ cache P2+ cache h P4+ cache Claves para reducir el número de transferencias Mapeado estático/planificación dinámica Cachés software Políticas de coherencia entre memoria de las GPUs y memoria principal Albacete – Julio 2011 50 Múltiples espacios de direcciones HPC&A ¿Dónde? Mapeado estático de tareas a GPUs Las actualizaciones sobre un bloque se realizan siempre en la misma GPU (owner-computes rule) Mapeado cíclico: í row, column, 2-D 2 Albacete – Julio 2011 51 Múltiples espacios de direcciones HPC&A ¿Cuándo? Planificación dinámica de las tareas … Tan pronto como se han satisfecho las dependencias… Posiblemente priorizando tareas del camino crítico Albacete – Julio 2011 52 Múltiples espacios de direcciones HPC&A Caché software (fl ibilid d ffrente (flexibilidad t a eficiencia) Mantener un mapa de memoria O Operar a nivel i ld de bl bloque (amortizar sobrecoste del software con #flops) Una vez los datos están en GPU, GPU mantenerlos allí mientras sea posible LRU (o mejor) Albacete – Julio 2011 GPU #1 CPU(s) PCI-e bus GPU #3 GPU #2 GPU #4 53 Múltiples espacios de direcciones HPC&A Coherencia entre GPUs y memoria i principal i i l GPU #1 Write-back CPU(s) PCI-e bus GPU #3 Albacete – Julio 2011 GPU #2 GPU #4 54 Múltiples espacios de direcciones HPC&A Coherencia entre GPUs Write-invalidate Requiere transferencia a t é de través d memoria i principal (¡YA NO!) Albacete – Julio 2011 GPU #1 CPU(s) PCI-e bus GPU #3 GPU #2 GPU #4 55 Runtimes SuperMatrix (UT@Austin and UJI) HPC&A Bloques escritos/leídos definidos implícitamente por las operaciones Aplicable solo a operaciones de CMD C codificadas f en libflame SMPSs (BSC) and GPUSs (BSC and UJI) Lenguaje de tipo OpenMP+compilador+runtime #pragma css task inout(A[b*b]) void id Chol(double Ch l(d bl *A); *A) Aplicable a códigos con paralelismo de datos sobre diferentes plataformas: multi-core, multi core multi-GPU, multi GPU Grid,… Grid Albacete – Julio 2011 56 Version Sp C1060 1.25 Programación de plataformas multi-GPU BASIC Albacete – Julio 2011 HPC2.91 &A 2D 4.04 CACHE+WI WT CACHE+WI,WT 4 55 4.55 WB 7.00 57 Programación de plataformas multi-GPU HPC&A ¿Cómo programamos estos sistemas? GPU #1 PCI-e bus CPU(s) GPU #3 GPU #2 GPU #4 Ver como… Un sistema multiprocesador con memoria compartida Un cluster (memoria distribuida) Albacete – Julio 2011 58 Programación de plataformas multi-GPU HPC&A Cluster GPU #1 CPU(s) PCI-e bus GPU #3 GPU #2 P1+ mem. Interconnect GPU #4 P3+ mem mem. P2+ mem. P4+ mem. Diferencias: Procesos en lugar de threads Aplicación de paso de mensajes (MPI) Albacete – Julio 2011 59 Programación de plataformas multi-GPU HPC&A ¿Dónde y cómo? Mapeado estático de tareas y datos a recursos Transferencias de datos embebidas en el código MPI Albacete – Julio 2011 60 Programación de plataformas multi-GPU Aproximación simple: D t en memoria Datos i principal i i l Antes de ejecuctar un kernel, copiar los datos de entrada a la GPU Después de la ejecución, recuperar los resultados Programación fácil (wrappers a kernels) Copias asociadas a la ejecución de kernels: O(n3) transferencias entre t CPU y GPU Albacete – Julio 2011 HPC&A GPU #1 CPU(s) PCI-e bus GPU #3 Interconnect GPU #2 GPU #4 61 Programación de plataformas multi-GPU Solución alternativa: Datos en las l GPU GPUs Antes de enviar un dato, recuperarlo a la memoria principal del nodo (compactando durante el proceso) Después de recibir un dato, llevarlo a la GPU Programación fácil (wrappers a rutinas de MPI) Copias ligadas a la comunicación: O( 2) transferencias O(n t f i entre t CPU y GPU Albacete – Julio 2011 HPC&A GPU #1 CPU(s) PCI-e bus GPU #3 Interconnect GPU #2 GPU #4 62 Implementaciones basadas en MPI PLAPACK (UT@Austin) HPC&A Uso de objetos (PLA_Obj) para vectores, matrices, vectores proyectados, etc., con la distribución embebida Distribución ó cíclica í PMB Diseño modular: toda la comunicación se realiza a través d copias de i (PLA (PLA_Copy) C ) y reducciones d i (PLA (PLA_Reduce) R d ) de d un tipo a otro de objeto Elemental (Jack Poulson) Basedo en PLAPACK, pero C++ Distribución cíclica por elementos Albacete – Julio 2011 63 Version Sp 2 C1060 1.40 Programación de plataformas multi-GPU 4 C1060 Albacete – Julio 2011 HPC3.45 &A 8 C1060 6.82 16 C1060 11 77 11.77 32 C1060 26.01 64 Version Sp 2 C1060 1.40 Programación de plataformas multi-GPU 4 C1060 Albacete – Julio 2011 HPC6.13 &A 8 C1060 8.42 16 C1060 12 54 12.54 32 C1060 21.84 65 Reconocimientos UJI F. Igual, G. Quintana UT HPC&A The FLAME team BSC Computer Sciences Department p Albacete – Julio 2011 66 Más información… información libflame (UT & UJI) HPC&A http://www.cs.utexas.edu/users/flame GPUSs ((BSC & UJI)) http://www.bsc.es http://www.bsc.es/plantillaG.php?cat id=385 http://www.bsc.es/plantillaG.php?cat_id 385 Albacete – Julio 2011 67 HPC&A ¡Gracias por vuestra atención!* atención! *Espero que os hayáis entretenido tanto como en XXX Albacete – Julio 2011 68 Preguntas HPC&A XXX Albacete – Julio 2011 69