Resumen
Introducción
- La multiplicación de matrices es un elemento esencial en las redes neuronales modernas
- NumPy logra alto rendimiento usando bibliotecas BLAS externas
- Este artículo explica cómo implementar una multiplicación de matrices de alto rendimiento que sea simple, portable y escalable
Rendimiento de NumPy
- NumPy usa OpenBLAS en CPUs AMD
- El rendimiento se mide en FLOP/s
- Se mide el rendimiento de NumPy en un CPU Ryzen 7 7700 con un solo hilo y con múltiples hilos
Límites teóricos
- Se explica la jerarquía de memoria del CPU y las extensiones SIMD
- En teoría, se pueden alcanzar 163 GFLOPS con un solo hilo y 1203 GFLOPS con múltiples hilos
Implementación simple
- Se explica el algoritmo básico de multiplicación de matrices y se mide el rendimiento de una implementación simple
- La implementación simple alcanza 2.7 GFLOPS
Kernel
- Se explica cómo resolver la multiplicación de matrices dividiéndola en subproblemas pequeños
- Se optimiza el kernel usando instrucciones SIMD
- Con un kernel de 16x6 se alcanzan 147 GFLOPS
Enmascarado y empaquetado
- Se explica cómo manejar casos límite para procesar tamaños de matriz arbitrarios
- Se optimiza el rendimiento usando enmascarado y empaquetado
- La nueva implementación alcanza 56 GFLOPS
Caché
- Se explica el sistema de memoria caché del CPU
- Se aprovecha la caché para optimizar la reutilización de datos y la gestión de caché
Opinión de GN⁺
- Este artículo es muy didáctico porque explica paso a paso cómo implementar una multiplicación de matrices de alto rendimiento
- Permite aprender métodos de optimización usando instrucciones SIMD y caché de CPU
- Ayuda a entender el funcionamiento interno de bibliotecas como NumPy
- Otros proyectos con funciones similares incluyen Intel MKL y OpenBLAS
- Al adoptar nuevas tecnologías u open source, conviene considerar el rendimiento y la portabilidad
1 comentarios
Comentarios en Hacker News
La mayor parte del software no está optimizado, así que hay mucho margen para mejorar el rendimiento
Los artículos citados en el repositorio de BLIS son materiales autorizados para entender este tema
Las instrucciones SIMD no son necesarias para vectorizar el microkernel
La mayoría de los patrones de código no están completamente especializados para el hardware, así que se pierde mucho rendimiento
Se valora que hayan facilitado repetir el benchmark
matmul.ctarda 1.41 s al compilarse congcc -O3, 1.47 s conclang -O2, y NumPy tarda 1.07 savx512sería más rápidopthreadsen vez deomppara gestionar explícitamente el pool de hilos, se puede reducir la sobrecargaSe cuestiona si la implementación de numpy realmente usa multihilo
Hay curiosidad por saber por qué rinde mejor que OpenBLAS
Comparar Python de un lado y C del otro no es justo
Les preocupa la ineficiencia en la generación de máscaras
Cuestionan la utilidad práctica de aplicar multihilo a la multiplicación de matrices en sí
Mención de tinyBLAS de jart