c++ sse simd intrinsics

c++ SSE SIMD framework



¿Alguien sabe una biblioteca intrínseca SIMD de C ++ x86 de código abierto?

Intel suministra exactamente lo que necesito en su biblioteca de primitivas de rendimiento integradas, pero no puedo usar eso debido a los derechos de autor en todo el lugar.

EDITAR

Ya conozco los intrínsecos proporcionados por los compiladores. Lo que necesito es una interfaz conveniente para usarlos.



Eche un vistazo a la biblioteca de envoltorios SIMD de C ++ de solo encabezado libsimdpp .

La biblioteca admite varios conjuntos de instrucciones a través de una sola interfaz: SSE2, SSE3, SSSE3, SSE4.1, AVX, AVX2, AVX512F, XOP, FMA3 / 4, NEON, NEONv2, Altivec. Se admiten todos Clang, GCC, MSVC y ICC.

Cualquier diferencia entre los conjuntos de instrucciones se resuelve implementando las instrucciones faltantes como una combinación de las admitidas. Como beneficio adicional, es posible compilar el mismo código para varios conjuntos de instrucciones, vincular los archivos de objetos resultantes a un solo ejecutable y usar un mecanismo de envío dinámico conveniente para ejecutar la implementación más adaptada al procesador actual.


Es posible que desee ver macstl ; aunque fue desarrollado originalmente para Mac (y PowerPC), ahora también funciona en Linux y x86.

Además, si está trabajando con imágenes, mire OpenCV , esto tiene rutinas optimizadas para SSE para muchas tareas comunes de procesamiento de imágenes y tiene API de C y C ++.


Escribí una biblioteca de estilo GLSL que se convertirá en código ASM de calidad casi perfecta.

Una operación muy común - producto cruzado:

vec4 cross(const vec4 &a, const vec4 &b) { return a.yzxw * b.zxyw - a.zxyw * b.yzxw; }

se convertiría a este código de ensamblaje utilizando glsl-sse2:

_Z5crossRK4vec4S1_: movaps (%rsi), %xmm1 movaps (%rdx), %xmm2 pshufd $201, %xmm1, %xmm5 pshufd $210, %xmm2, %xmm0 pshufd $210, %xmm1, %xmm4 pshufd $201, %xmm2, %xmm3 mulps %xmm0, %xmm5 mulps %xmm3, %xmm4 subps %xmm4, %xmm5 movaps %xmm5, (%rdi) ret

Tenga en cuenta que la biblioteca aún no es perfecta, y es muy probable que tenga errores no encontrados, ya que todavía es nueva.


Hay varias bibliotecas que han surgido en los últimos años para abstraer la programación explícita de SIMD. Los más importantes:

Lo más importante que debe buscar es tener un conjunto de tipos que puedan abstraerse correctamente de los mejores registros e instrucciones SIMD disponibles para un objetivo determinado. Y, obviamente, portabilidad completa a sistemas sin soporte SIMD.


Microsoft acaba de lanzar su nueva biblioteca "DirectXMath" . Incluye soporte para SSE2 y NEON intrinsics. La documentación también parece decente.

La API de DirectXMath proporciona tipos y funciones de C ++ compatibles con SIMD para el álgebra lineal común y las operaciones matemáticas de gráficos comunes a las aplicaciones DirectX. La biblioteca proporciona versiones optimizadas para Windows de 32 bits (x86), Windows de 64 bits (x64) y Windows en ARM a través de SSE2 y soporte intrínseco ARM-NEON en el compilador de Visual Studio.


Vc es otra biblioteca de C ++ que implementa clases vectoriales y permite escribir código vectorizado que es independiente del conjunto de instrucciones real que se usa.