¡Combinación fuerte, rendimiento mejorado varias veces! Alibaba Dragonwell11+VectorAPI ayuda a la nueva era de alto rendimiento de Java

01  fondo

Alibaba Dragonwell, como versión descendente de OpenJDK, es la implementación de OpenJDK de Alibaba optimizada para aplicaciones de logística, finanzas y comercio electrónico en línea que se ejecutan en más de 100 000 servidores. Alibaba y la comunidad de OpenJDK trabajan en estrecha colaboración para incorporar tantas funciones personalizadas de Alibaba Dragonwell como sea posible. Dragonwell es el JDK predeterminado de OpenAnolis, y muchas aplicaciones Java de Alibaba están migrando gradualmente a Dragonwell.

El equipo de Intel Java ha estado comprometido con el desarrollo de OpenJDK durante mucho tiempo, aportando una gran cantidad de funciones de optimización que permiten a OpenJDK utilizar mejor las potentes funciones de las CPU modernas. VectorAPI es una poderosa herramienta para que Java realice computación de alto rendimiento en campos específicos A través de VectorAPI, los desarrolladores de Java pueden controlar y utilizar con precisión las unidades de hardware SIMD (instrucción única, datos múltiples) que se encuentran comúnmente en las CPU modernas, y las aplicaciones específicas pueden obtener varias veces más rendimiento promover.

02  Estado actual de la informática de alto rendimiento Java

La unidad informática SIMD ha evolucionado desde la era MMX (Extensión multimedia) hasta la era actual AVX-512 (Extensiones vectoriales avanzadas)/AMX (Extensiones de matriz avanzada) en la plataforma X86 (SIMD es común en plataformas que no son X86). , el entretenimiento de juegos, el procesamiento de big data y, más recientemente, la IA han jugado un papel vital . Los desarrolladores pueden usar C/C++ (instrucciones intrínsecas), lenguaje ensamblador y otras herramientas de lenguaje para escribir explícitamente código relacionado con SIMD (llamado codificación de vectorización) para utilizar unidades SIMD; también pueden usar la función de vectorización automática del compilador/intérprete para continuar. JVM (Java Virtual Machine) también tiene la capacidad de vectorización automática.

Cuando se utiliza la función de vectorización automática del compilador/intérprete, aunque la carga para el desarrollador es relativamente pequeña, debido a que estas tareas dependen de la implementación del compilador/intérprete, en muchos casos no se puede lograr el propósito esperado. Sin embargo, lo que los desarrolladores pueden hacer es muy limitado, y el rendimiento del hardware SIMD a menudo no se utiliza por completo; mientras se programa directamente para el hardware SIMD, las versiones anteriores de Java solo pueden usar C/C++ o lenguaje ensamblador a través de JNI (interfaz nativa de Java). Biblioteca implementada para lograr. La introducción de JNI traerá una sobrecarga de rendimiento adicional que no se puede ignorar; al mismo tiempo, el modo de programación mixto también aumentará la complejidad de la gestión y el mantenimiento del sistema. La aparición de Java VectorAPI (Vector API) ha brindado a los desarrolladores de Java la capacidad de programar directamente para el hardware SIMD. Formas de utilizar el hardware SIMD:

vectorización automática llame a la biblioteca de idiomas nativos Programa directamente a las celdas SIMD
C/C++, ensamblador y otros lenguajes locales Sí (intrínseco/ensamblaje)
Java Sí (JNI) Sí (VectorAPI)

03  Introducción a VectorAPI

VectorAPI (Incubator, JEP 338, JEP: JDK Enhancement Proposals) se creó originalmente en abril de 2018 y se presentó como un proyecto de incubadora en OpenJDK16 (octubre de 2020). Con la actualización posterior de la versión de OpenJDK, VectorAPI también se ha actualizado de forma síncrona:

  • OpenJDK 17 -> JEP 414,Segunda incubadora
  • OpenJDK 18 -> JEP 417,Tercera Incubadora
  • OpenJDK 19 -> JEP 426,Cuarta Incubadora
  • OpenJDK 20 -> JEP 438, quinta incubadora

Cada actualización de VectorAPI traerá mejoras de rendimiento, más funciones y correcciones de errores. La programación de VectorAPI usa código Java puro, veamos un ejemplo simple:

// 传统写法实现2个数组相加
void add (float[] A, float[] B, float[] C) { 
    for (int i = 0; i < C.length; i++) { 
        C[i] = A[i] + B[i]; 
    } 
} 
 
// 使用VectorAPI的2个数组相加
public class AddClass<S extends Vector.Shape<Vector<?, ?>>> { 
    private final FloatVector.FloatSpecies<S> spec; 
    AddClass (FloatVector.FloatSpecies<S> v) {spec = v; } 
 
    // vector routine for add  
    void add (float[] A, float[] B, float[] C) { 
        int i=0; 
        for (; i + spec.length() < C.length; i += spec.length()) { 
            FloatVector<S> av = spec.fromArray(A, i); 
            FloatVector<S> bv = spec.fromArray(B, i); 
            av.add (bv).intoArray(C, i); 
        } 
        // clean up loop 
        for (; i < a.length; i++) C[i] = A[i] + B[i]; 
    } 
}

Se puede ver que después de usar VectorAPI, en una plataforma de hardware compatible con AVX-512, una suma puede procesar (512/32=16) 16 números de coma flotante; mientras que la suma tradicional solo puede procesar un número de coma flotante a la vez . Estos son algunos ejemplos de VectorAPI en acción:

  • BLAS (Subprogramas básicos de álgebra lineal, Subprogramas básicos de álgebra lineal), que se utilizan ampliamente en campos de computación de alto rendimiento, IA y multimedia, se pueden mejorar en 2.2X ~ 4.5X.

  • Procesamiento de imágenes Filtrado sepia, hasta 6 veces mejor:

  • La aplicación de la base de datos se ha mejorado más de 2 veces:

Dado que VectorAPI es un módulo relativamente nuevo, se están desarrollando más proyectos nuevos que utilizan VectorAPI.

04  Estado actual de las versiones de Java en la industria

En el proyecto Apache Parquet-mr, el uso de VectorAPI requiere el soporte de JDK17. Por un lado, JDK17 es la versión LTS (Long-Term Support) de Java y, lo que es más importante, la versión anterior de Java LTS, JDK11, no es compatible con VectorAPI. Sin embargo, JDK11 se usa más ampliamente en la industria que JDK17, y actualizar la versión de Java en un entorno de producción maduro es algo costoso, lo que crea un obstáculo obvio y enorme para la promoción y el uso de VectorAPI en la industria. La industria también ha hecho muchos esfuerzos e intentos. Por ejemplo, Alibaba ha agregado soporte VectorAPI al AJDK que usa internamente, pero su implementación sigue siendo diferente a la de la comunidad OpenJDK. Las actualizaciones y el mantenimiento posteriores no son fáciles. . Así que Alibaba e Intel iniciaron un proyecto para migrar VectorAPI (JEP 338) a Dragonwell11. Esto no solo puede aprovechar las potentes funciones de VectorAPI, sino también proteger la inversión actual y evitar el riesgo de actualizar JDK .

05Dificultades  en el trasplante

  • Gran cantidad de código involucrado

Community JEP 338 implica la modificación de 336 archivos, lo que implica 290.000 líneas de código. Y estos se basan en JDK16 y en comparación con Dragonwell basado en JDK11, la diferencia será aún mayor.

  • Mantenga el enlace con OpenJDK aguas arriba

Además, por un lado, Dragonwell11 debe continuar rastreando fácilmente la revisión y mejora de OpenJDK11 ascendente, y también debe facilitar que VectorAPI rastree la evolución del seguimiento VectorAPI ascendente de OpenJDK, lo que trae una gran cantidad de Desafíos para el trabajo de trasplante.

  • El rendimiento debe estar cerca del OpenJDK ascendente.

¿Algunos cambios relacionados con el rendimiento en versiones posteriores a OpenJDK11 y cómo introducir Dragonwell11?

  • Fuerte demanda estable y confiable

Dragonwell necesita respaldar una gran cantidad de empresas existentes, y la estabilidad y la confiabilidad son los primeros requisitos.

06  Solución

Para la enorme cantidad de código, Alibaba e Intel han invertido una gran cantidad de recursos, incluidos los principales contribuyentes de la comunidad Upstream OpenJDK VectorAPI. Las dos partes han trabajado en estrecha colaboración para discutir soluciones y verificar el código. Durante el proceso de trasplante, intente mantener la estructura original de Dragonwell11 y solo use la implementación anterior para la parte que involucra a VectorAPI. Después de algunos cambios de JDK11 ascendentes, analice su implementación; si se pueden usar los componentes existentes de Dragonwell11, no se introducirán cambios adicionales. Esto minimiza el impacto en Dragonwell11. Y use el conjunto de prueba incorporado de OpenJDK para cubrir completamente el Dragonwell11 trasplantado para garantizar la calidad del trasplante.

07  Dragonwell11 + VectorAPI

Actualmente, VectorAPI se ha fusionado con la rama principal (maestro) de Dragonwell 11 y es totalmente compatible con VectorAPI 1st Incubator (JEP 338). Las funciones de JEP 414, JEP 417, JEP 426 y JEP 438 se trasladarán a Dragonwell 11 en el futuro.

Enlaces relacionados:

Alibaba Dragonwell: Https://github.com/alibaba/dragonwell11

OpenJDK: https://github.com/openjdk/jdk

Texto/Zhu Wenjie, Jin Zhonghui

Enlace original

Este artículo es el contenido original de Alibaba Cloud y no se puede reproducir sin permiso.

Supongo que te gusta

Origin blog.csdn.net/yunqiinsight/article/details/130366886
Recomendado
Clasificación