Estoy interesado en usar las instrucciones vectoriales SSE de x86-64 con gcc y no quiero usar ningún ensamblaje en línea para eso. ¿Hay alguna forma de que pueda hacer eso en C? Si es así, ¿alguien me puede dar un ejemplo?Uso de instrucciones SSE con gcc sin ensamblaje en línea
Respuesta
Sí, puede usar los intrínsecos en los encabezados * mmintrin.h (emmintrin.h
, xmmintrin.h
, etc., dependiendo del nivel de SSE que desee usar). En general, esto es preferible al uso del ensamblador por muchas razones.
#include <emmintrin.h>
int main(void)
{
__m128i a = _mm_set_epi32(4, 3, 2, 1);
__m128i b = _mm_set_epi32(7, 6, 5, 4);
__m128i c = _mm_add_epi32(a, b);
// ...
return 0;
}
Tenga en cuenta que este enfoque funciona para la mayoría de los compiladores x86 y x86-64 en diversas plataformas, p. gcc, clang e ICC de Intel en Linux/Mac OS X/Windows e incluso Visual C/C++ de Microsoft (solo Windows, por supuesto).
Encuentra los encabezados *intrin.h
en tu gcc incluye (/usr/lib/gcc/x86_64-unknown-linux-gnu/4.8.0/include/
aquí).
Tal vez digno de mención, el encabezado immintrin.h
incluye todas las demás intrínsecas según las características que permita (usando -msse2
o -mavx
por ejemplo).
Lo que quiere es intrinsics, que parecen funciones de biblioteca pero que en realidad están integradas en el compilador, por lo que se traducen en códigos de máquina específicos.
Paul R y hroptatyr describen dónde encontrar la documentación de GCC. Microsoft also has good documentation on the intrinsics in their compiler; incluso si está utilizando GCC, puede encontrar que la descripción de MS de la idea es un mejor tutorial.
¿Qué hay de la arquitectura ARM? ¿Admite NEON SIMD? o esto solo es para x86? – enthusiasticgeek
@enthusiasticgeek La pregunta especifica x86-64. ARM y NEON tienen su propio compilador y sus propios intrínsecos. – Crashworks
- 1. Uso de las instrucciones de SSE
- 2. GCC SSE código de optimización
- 3. Etiquetas en ensamblaje en línea de GCC
- 4. Ensamblaje en línea de GCC: restricciones
- 5. SSE Instrucciones: Byte + Corto
- 6. Conciso instrucciones de instrucción SSE y MMX con latencias y rendimiento
- 7. GCC C++ y código de ensamblaje en línea?
- 8. Donde las instrucciones SSE superan las instrucciones normales
- 9. Qt, GCC, SSE y alineación de pila
- 10. (extensiones SIMD) SSE apoyo en gcc
- 11. ¿Ensamblaje de llamadas en GCC?
- 12. retorno registro SSE con SSE discapacitados
- 13. ¿Por qué hay dos formas de escribir el ensamblaje en línea con gcc?
- 14. Obtenga GCC para conservar un registro SSE a través de una función que utiliza asm en línea
- 15. Uso del ensamblaje en línea en C/C++
- 16. Comenzando con SSE
- 17. GCC Inline-ensamblaje: llamar DWORD PTR
- 18. Optimización de registros usados cuando se utiliza el ensamblaje ARM en línea en GCC
- 19. ¿Cómo usan los compiladores modernos las instrucciones de mmx/3dnow/sse?
- 20. Ensamblaje en línea de GCC: salta al bloque exterior de etiqueta
- 21. Uso de Autonumming en Access - INSERT instrucciones
- 22. nueva línea en ensamblaje 8086
- 23. Ensamblaje en línea de GCC - Mover float a XMM0 antes de llamar a
- 24. Uso de la instrucción de acumulación de múltiples en línea Ensamblaje en C++
- 25. ¿Puedo usar la sintaxis Intel del ensamblaje x86 con GCC?
- 26. ¿Por qué hay instrucciones adicionales en mi salida de gcc?
- 27. Comprender el propósito de algunas instrucciones de ensamblaje
- 28. ¿Cómo me aseguro de que lrint está en línea en gcc?
- 29. Error de segmentación con OpenMp y SSE
- 30. barrera volátil frente a compilador con montaje en línea gcc
¿Esto es para gcc o VC++? – pythonic
Tanto gcc como VC++ son compatibles con los intrínsecos. –
FTW, icc también admite estos intrínsecos – hroptatyr