A GPU-resident Memory-Aware Algorithm for Accelerating Bidiagonalization of Banded Matrices
Ringoot, Alomairy, Edelman
The reduction of a banded matrix to a bidiagonal form is a crucial step in the Singular Value Decomposition (SVD), a cornerstone of scientific computing and AI. Despite being a highly parallel algorithm, it was previously believed to be unsuitable for GPU computation because it is memory bandwidth-bound. Recent developments in GPU hardware, including larger L1 memory per Streaming Multiprocessor/Compute Unit, have changed that. We present the first GPU algorithm for reducing a banded matrix to bidiagonal form as part of the NextLA.jl open-source software package. Our algorithm is based on previous CPU-based multicore parallel cache-efficient bulge chasing algorithms and adapted to optimize for GPU throughput. We leverage Julia Language's Array abstractions and KernelAbstractions to implement a single hardware- and data precision-agnostic function on NVIDIA, AMD, Intel, and Apple Metal GPUs for half, single, and double precision, and examine performance optimization across hardware architectures and data precision. We also develop a hardware-aware performance model and identify key hyperparameters, such as inner tilewidth and block concurrency, that govern optimal GPU execution for bandwidth-bound workloads. We demonstrate highly parallel bandwidth-bound algorithm on the GPU can outperform CPU-based implementations: the GPU algorithm outperforms multithreaded CPU High-Performance libraries PLASMA and SLATE as of matrix size 1024 x 1024 and by a factor over 100 for matrices of 32k x 32k. In addition, the performance of the algorithm increases linearly with matrix bandwidth size, making faster reduction of larger matrix bandwidths now also possible. With this work, we break memory bandwidth barriers, as well as matrix bandwidth barriers, resulting in orders-of-magnitude faster algorithms for the reduction of banded matrices to bidiagonal form on the GPU.
academic
Un Algoritmo Consciente de Memoria Residente en GPU para Acelerar la Bidiagonalización de Matrices de Banda
Este artículo propone el primer algoritmo residente en GPU consciente de memoria para acelerar la reducción de matrices de banda a matrices bidiagonales, un paso crítico en la descomposición de valores singulares (SVD). Aunque el algoritmo posee un alto grado de paralelismo, anteriormente se consideraba inadecuado para computación en GPU debido a sus características de restricción de ancho de banda de memoria. Esta situación ha cambiado con la evolución del hardware de GPU, particularmente con memorias L1 más grandes en cada multiprocesador de flujo/unidad de cómputo. Los autores se basan en algoritmos previos de bulge-chasing eficientes en caché para múltiples núcleos de CPU y los optimizan para el rendimiento de GPU. El algoritmo implementa una única función independiente del hardware y precisión de datos en GPU de NVIDIA, AMD, Intel y Apple Metal, soportando cálculos de media precisión, precisión simple y doble precisión. Los experimentos demuestran que el algoritmo de GPU supera a la biblioteca de alto rendimiento multihilo PLASMA y SLATE en matrices de escala 1024×1024, con mejoras de rendimiento superiores a 100 veces en matrices de 32k×32k.
La descomposición de valores singulares (SVD) es una herramienta numérica fundamental en computación científica, aprendizaje automático y análisis de datos, con aplicaciones generalizadas en análisis de componentes principales, indexación semántica latente, aproximación de bajo rango y completación de matrices. El SVD en hardware moderno a gran escala típicamente adopta un proceso de tres etapas:
Reducción de matriz densa a matriz de banda
Reducción de matriz de banda a matriz bidiagonal (bulge-chasing)
Aunque las implementaciones en GPU de la primera y tercera etapas han sido ampliamente estudiadas, la segunda etapa permanece insuficientemente explorada en GPU modernas. Dongarra et al. señalaron en 2014 que "los aceleradores funcionan mal al procesar tareas de cómputo de grano fino restringidas por memoria (como bulge chasing), limitando las ganancias potenciales de implementaciones en GPU de la segunda etapa".
Los avances recientes en arquitectura de GPU, particularmente:
Expansión del tamaño de caché L1 por multiprocesador de flujo
Mayor ancho de banda en chip
Patrones de acceso a memoria más flexibles
Mejor reutilización de caché y jerarquía de memoria más grande
Estos mejoras han cambiado significativamente el equilibrio memoria-cómputo, creando nuevas oportunidades para rediseño de algoritmos restringidos por memoria.
Primer algoritmo bulge-chasing residente en GPU consciente de memoria: Propone el primer algoritmo nativo de GPU para reducción de matrices de banda a bidiagonales, aprovechando plenamente las características de memoria superiores de la generación actual de GPU de alto rendimiento, con mejoras de rendimiento de 10-100 veces respecto a implementaciones de CPU optimizadas.
Estrategia bulge-chasing eficiente en caché para matrices de banda grande: A través de una nueva estrategia eficiente en caché de reducción de banda progresiva, el algoritmo de GPU puede procesar anchos de banda más grandes que antes, alterando el equilibrio de ancho de banda óptimo entre la primera y segunda etapas en SVD a gran escala.
Implementación de código abierto independiente del hardware y precisión de datos: Biblioteca de código abierto implementada con abstracciones del lenguaje Julia, con una única definición de función que soporta cálculos de precisión simple, media y doble en GPU de NVIDIA, AMD, Intel y Apple.
Dada una matriz de banda A ∈ ℝⁿˣⁿ con ancho de banda BW, el objetivo es reducirla a una matriz bidiagonal B mediante transformaciones ortogonales, tal que A = UBVᵀ, donde U y V son matrices ortogonales.
Algoritmo 1: Reducción de Matriz de Banda a Bidiagonal usando Vectores de Householder
Entrada: Ancho de banda BW, ancho de mosaico interno TW, tamaño de matriz n
1: para reducción de ancho de banda i = (BW-1)/TW → 1 hacer
2: Ancho de banda objetivo TBW = 1 + i·TW
3: para paralelo: cada fila R = 1→n hacer
4: bulge de fila k = R
5: para cada bulge de fila: j = 0, j+=1 hacer
6: si 3(R-1) < j y k ≤ n entonces
7: Calcular vector HH para fila k para eliminar TW elementos y aplicar a filas inferiores
8: Calcular vector HH para bulge de columna más a la izquierda y aplicar a columnas derechas
9: Actualizar valor de k
10: fin si
11: fin para
12: fin para
13: fin para
Algoritmo 2: Núcleo GPU Consciente de Memoria, TPB hilos por bloque
1: Memoria de hilo: Ai (TW+1)
2: Memoria de bloque: X (TW+1)
3: Todos los hilos en bloque colaboran: X ← A[k,..]
4: Sincronizar hilos
5: Todos los hilos en bloque colaboran: HH(X)
6: Todos los hilos en bloque colaboran: A[k,..]← X
7: Sincronizar hilos
8: para l: 0→(CBW + TW)/TPB - 1 hacer
9: Hilo i: Calcular fila r = k + l·CPB + i
10: Ai ← A[r, ...]
11: HH(X, Ai)
12: A[r, ...]← Ai
13: fin para
Divide la matriz en mosaicos de ancho de banda, ejecutando la reducción por bloques de ancho de banda consecutivos, en lugar de reducir todo el ancho de banda de una vez. Esta estrategia de particionamiento logra:
Introduce un parámetro Max blocks que limita la cantidad de bloques de hilos concurrentes por unidad de ejecución de GPU. Cuando el número de bloques de bulge-chasing requeridos excede el límite, emplea desenrollamiento de bucle a nivel de software, donde un único bloque se asigna múltiples tareas y se ejecutan secuencialmente en el mismo lanzamiento de núcleo.
Para garantizar corrección y habilitar paralelismo, el algoritmo fuerza separación de tres ciclos entre escaneos de filas consecutivas. Es decir, después de completar tres bulges de fila, la siguiente fila puede comenzar a escanear sin superponer accesos a datos.
A diferencia de solucionadores SVD, hay trabajo extenso en sistemas híbridos CPU-GPU para problemas de valores propios de banda simétrica de dos etapas, pero la investigación en reducción de banda a bidiagonal no simétrica está rezagada.
Originalmente propuesto como algoritmo paralelo, pero la investigación del caso bidiagonal en CPU es extremadamente escasa. En comparación, la investigación en bulge-chasing de banda simétrica a tridiagonal y forma superior de Hessenberg es más extensa.
Superación de la barrera de ancho de banda de memoria: Demuestra que algoritmos de álgebra lineal restringidos por memoria no solo son viables en GPU modernas, sino que pueden superar significativamente el rendimiento de CPU
Importancia de características de hardware: La latencia de caché L1/L2 es más crítica que el tamaño, enfatizando la importancia del acceso a memoria rápida de baja latencia
Principios de diseño de algoritmos: El rendimiento óptimo proviene de diseño de algoritmos principista, parametrización consciente de caché e infraestructura de compilador portátil
Modelo de ocupación de GPU: El algoritmo tiene significativamente menos bloques de GPU en etapas iniciales que unidades de ejecución disponibles, requiriendo matrices suficientemente grandes para utilizar plenamente recursos de GPU
Desbordamiento de registros: Ancho de mosaico interno alto puede causar desbordamiento de registros, afectando rendimiento
Dependencia de hardware: Variaciones significativas de rendimiento entre arquitecturas de GPU, requiriendo ajuste específico de hardware
Contribución pionera: Primera implementación de algoritmo bulge-chasing residente en GPU de banda a bidiagonal, llenando un vacío técnico importante
Alto valor práctico: Mejoras de rendimiento significativas (10-1000 veces) proporcionan valor de aplicación importante
Innovación técnica: Diseño ingenioso de particionamiento de ancho de banda y consciente de memoria se adapta bien a características de arquitectura de GPU
Portabilidad fuerte: Implementación de código fuente único basada en Julia soporta GPU de múltiples proveedores y múltiples precisiones
El artículo cita 86 referencias relacionadas, abarcando múltiples campos incluyendo computación en GPU, algoritmos de álgebra lineal y ecosistema del lenguaje Julia, proporcionando una base teórica sólida para la investigación.