4 puntos por GN⁺ 2024-10-19 | 1 comentarios | Compartir por WhatsApp

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

 
GN⁺ 2024-10-19
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

    • El tamaño del frame y el de los argumentos se separan con -, y esto no es una resta matemática
    • La herramienta go vet verifica que el tamaño de los argumentos sea correcto
  • Opinión sobre la interpretación de los LLM (modelos de lenguaje de gran tamaño): puede haber malentendidos al interpretar código

    • Se comenta que sería útil para el aprendizaje que el autor lo reconociera con honestidad
  • Mención del lenguaje de ensamblador interno de Go, Plan9: Go usa su propio lenguaje ensamblador

    • En amd64, int es de 64 bits, y si se usa int32, se alinea por palabra en la lista de argumentos
    • NOSPLIT está definido en textflag.h y solo es válido en el runtime
  • Explicació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

    • Se puede generar automáticamente el ensamblador usando como entrada la documentación de una nueva arquitectura
  • Opinión sobre el uso de funciones para operaciones SIMD: se necesitan funciones que puedan realizar operaciones SIMD sobre slices

    • Al sumar dos slices, se podrían procesar en paralelo con SIMD en lugar de usar un bucle for
  • Filosofía de diseño del compilador de Go: apunta a un compilador simple y rápido en vez de uno complejo

    • El soporte básico para x64 incluye SSE y SSE2, y prioriza la simplicidad sobre el rendimiento
  • 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

    • Sin embargo, en Go puede no ser una buena opción por la falta de paquetes de GPU y de comunidad