septiembre 28, 2022

Matemáticas más rápidas que nunca

Dentro del nuevo Evergine 2022.9.28 lanzamos una nueva versión de nuestra librería Evergine.Mathematics. Esta utiliza el conjunto de instrucciones aceleradas por hardware diseñado por los fabricantes de CPU.

Esto es posible gracias a la nueva Hardware Intrinsics API creada para Net6, que permite utilizar las instrucciones SIMD (Single-Instruction Multiple Data) en arquitecturas x86, x64 y Arm64, si el hardware lo soporta. Con esta nueva API podemos comprobar si esas extensiones están presentes en el hardware y si es posible, utilizar los registros de 128 y 256 para vectorizar el código y ejecutar múltiples operaciones primitivas en un solo ciclo (un ciclo es la unidad básica de tiempo en una CPU).

Hemos utilizado estas instrucciones para optimizar las operaciones dentro de los structs más importantes de la librería Evergine.Mathematics como Matrix4x4, Vector4, Matrix3x3 y Quaternion, y los resultados son impresionantes. 

Benchmarks 

Para crear algunos microbenchmarks hemos utilizado benchmarkdotnet, y esta es la configuración para lanzar la comparación enMatrix4x4 multiply.

El contenido del archivo program.cs:

 

El contenido de la prueba de multiplicación para Matrix4x4: 

 

La CPU usada para todos los parámetros x86 and x64 presentados en este artículo es:

Intel Core i9-10980HK CPU 2.40GHz, 1 CPU, 16 logical and 8 physical cores

Y los resultados detallados generados por benchmarkdotnet son: 

 

Como puedes ver, el método más rápido es utilizando MultiplyMethodRef, donde los parámetros de la matriz se pasan por referencia en lugar de copia. El nuevo código para Net6 utilizando instrucciones SSE, solo necesita 7.393 ns frente a 23.965 ns; y el tamaño del código también se reduce de 1.044 bytes a 414 bytes. Son unos resultados realmente excelentes para una de las operaciones matemáticas más utilizadas en un motor gráfico 3D.

Para ver visualmente la mejora del rendimiento en las arquitecturas x86 y x64 hemos creado unos gráficos para cada estructura matemática. 

 

Y también hemos desarrollado una versión para arquitectura Arm64, y para evaluar este nuevo codigo hemos utilizado Raspberry Pi4. En esta arquitectura estamos utilizando el conjunto de instrucciones ARM AdvSimd cuando es posible, y estos son los resultados generados desde Ubuntu 22.04.1 LTS on Rasberry Pi4. 

Resumen

La nueva librería Evergine.Mathematics es muy rápida y permite aprovechar las extensiones específicas de la plataforma durante la ejecución en la máquina. Es entre 3-4 veces más rápida que antes gracias al uso de instrucciones SSE y AVX en arquitecturas x86 y x64 y AdvSimd en dispositivos Arm64.

El siguiente paso está en tu mano, descarga la nueva versión para empezar a utilizar estas mejoras de rendimiento en todos tus proyectos gracias a la nueva librería Evergine.Mathematics.

Javier canton
Author
Javier Cantón
Plain Concepts Research

¿Ya te vas?

Suscríbete a nuestra newsletter para estar al día de las últimas noticias, casos de éxito y mucho más. 

No mandamos spam y puedes darte de baja en cualquier momento.