Aprovechando la concurrencia y el paralelismo en Go
- Introducción a un proyecto que busca mejorar la capacidad de cálculo numérico aprovechando la concurrencia y el paralelismo de Go.
- Es posible realizar cálculos paralelos a nivel de hardware usando instrucciones SIMD (Same Instruction Multiple Data).
- El compilador de Go no aprovecha SIMD, y al no encontrar un paquete SIMD de propósito general adecuado, se decidió desarrollar uno propio.
Lenguaje ensamblador Plan9
- Go usa su propio lenguaje ensamblador llamado Plan9, que utiliza instrucciones y registros de plataformas específicas con ligeras modificaciones.
- x86 Plan9 y ARM Plan9 son diferentes entre sí.
- Se explica el uso básico mediante un ejemplo sencillo de Plan9.
Ejemplo de Plan9
- A través de los archivos
AddInts_amd64.s y main.go se explica la forma básica de declarar y usar funciones en Plan9.
- Se describe cómo almacenar los argumentos de función y los valores de retorno en la pila según la convención de llamadas de Go.
Plan de diseño del paquete
- Se diseña un paquete que proporciona una capa delgada de abstracción para operaciones SIMD aritméticas y de bits.
- Se crea un paquete interno que incluye implementaciones de Plan9 por arquitectura y se configura mediante funciones de inicialización.
Ejemplo de SIMD
- Se explica cómo usar SIMD mediante un ejemplo de una función Plan9 con SIMD para x86.
- A través de los archivos
Supported_amd64.s y AddFloat32_amd64.s se muestra cómo verificar el soporte de SSE y cómo realizar una operación de suma de float32.
Rendimiento y futuro
- Un gráfico que muestra la diferencia de rendimiento entre la implementación de software en Go y la implementación SIMD con Plan9 confirma una mejora de velocidad aproximada de 200-450%.
- Se espera que estas notas inspiren proyectos que usen Plan9 y SIMD.
# Resumen de GN⁺
- Este artículo presenta una forma de maximizar el rendimiento aprovechando la concurrencia y el paralelismo de Go.
- Explica cómo realizar cálculos paralelos a nivel de hardware usando el lenguaje ensamblador Plan9 e instrucciones SIMD.
- El texto muestra a los desarrolladores de Go las posibilidades de usar Plan9 y SIMD, y puede ser útil para explorar nuevos enfoques de mejora de rendimiento.
- Como proyectos con funciones similares, se recomiendan bibliotecas de soporte SIMD de Rust o bibliotecas relacionadas con SIMD en C++.
1 comentarios
Comentarios de Hacker News
Explicación sobre
NOSPLIT: es una sintaxis particular en el ensamblador de Go para describir el tamaño del frame y el tamaño de los argumentos-, y esto no es una resta matemáticago vetverifica que el tamaño de los argumentos sea correctoOpinión sobre la interpretación de los LLM (modelos de lenguaje de gran tamaño): puede haber malentendidos al interpretar código
Mención del lenguaje de ensamblador interno de Go,
Plan9: Go usa su propio lenguaje ensambladorintes de 64 bits, y si se usaint32, se alinea por palabra en la lista de argumentosNOSPLITestá definido entextflag.hy solo es válido en el runtimeExplicación de Rob Pike sobre el diseño del ensamblador de Go: se creó un lenguaje ensamblador común para poder comunicarse con la máquina sin tener que aprender una sintaxis nueva
Opinión sobre el uso de funciones para operaciones SIMD: se necesitan funciones que puedan realizar operaciones SIMD sobre slices
forFilosofía de diseño del compilador de Go: apunta a un compilador simple y rápido en vez de uno complejo
Opinión sobre usar GPU para operaciones SIMD: las GPU destacan en procesamiento en paralelo y operaciones matriciales, por lo que podrían ser más adecuadas para SIMD