c++ SSE SIMD framework
intrinsics (8)
¿Qué compilador? El compilador de Visual Studio C ++ admite un conjunto de funciones intrínsecas SIMD, SIMD2 y MMX.
¿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.
Echa un vistazo al proyecto SSEPlus de AMD , podría ser lo que buscas
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:
- Vc
- boost :: simd (en realidad no está en boost - parte de NT² )
- Biblioteca de clases vectoriales del Prof. Agner Fog
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.