Cómo escribir aplicaciones usando el conjunto de instrucciones SSE
1. Vectorización automática del compilador
-mfpmath=sse
Sólo se recomienda utilizar esta opción en procesadores de niveles P4 y K8 o superiores.
-mmmx
-msse
-msse2
-msse3
-m3dnow
-mssse3 (nuevo en gcc-4.3)
-msse4.1 (nuevo en gcc-4.3)
-msse4.2 (nuevo en gcc-4.3)
-msse4 (incluidos 4.1 y 4.2, nuevo en gcc-4.3)
El uso del conjunto de instrucciones extendido correspondiente y las funciones integradas depende de su propia CPU.
2. Utilice la biblioteca de clases C/C++
Actualmente, la mayoría de los compiladores como GNU
GCC brindan soporte para el conjunto de instrucciones SSE. Permite a los usuarios usar SSE. instrucciones directamente llamando a funciones de biblioteca sin escribir código ensamblador en código C++.
3. Utilice las primitivas integradas del compilador (Intrinsics)
Reglas intrínsecas de SSE
_mm_
Entre ellos,
ps: Empaquetado
Precisión simple, se refiere al funcionamiento simultáneo de cuatro puntos flotantes de precisión simple en el registro.
ss: Scaler
Precisión simple, se refiere a operar sobre DATA0 en el registro.
Al programar, es necesario incluir el archivo de encabezado que se muestra en la siguiente tabla:
mmintrin.h
MMX
xmmintrin. h
SSE
emmintrin.h
SSE2
pmmintrin.h
SSE3
tmmintrin.h
SSSE3
intrin.h
SSE4A
smmintrin.h
SSE4. 1
nmmintrin.h
SSE4.2
mm3dnow.h
3DNOW
Nota: Si Si importa un archivo de encabezado del conjunto de instrucciones de una versión superior, generalmente no es necesario importar instrucciones de una versión inferior.
4. Utilice ensamblaje en línea
Características de sintaxis de instrucciones
Por ejemplo: PADDUSW (adición de palabras en modo de saturación sin signo)
Prefijo: P representa el tipo de datos de grupo
Instrucciones de operación: como ADD, SUB, etc.
Sufijo: US significa procesamiento de saturación sin signo
S significa procesamiento de saturación con signo
B, W, D y Q son grupos de bytes, grupos de palabras, grupos de palabras dobles y palabras cuádruples respectivamente.
Estructura asm de GCC
Los programas escritos en ensamblador se ejecutan rápido, pero la velocidad de desarrollo es muy lenta y la eficiencia es muy baja. Si solo desea optimizar segmentos de código clave, una mejor manera es incorporar instrucciones ensambladoras en programas en lenguaje C y aprovechar al máximo las ventajas respectivas de los lenguajes de alto nivel y los lenguajes ensambladores. En términos generales, incrustar declaraciones ensambladoras en código C es mucho más complicado que el código en lenguaje ensamblador "puro", porque es necesario resolver problemas como cómo asignar registros y cómo combinarlos con variables en el código C. El ensamblaje en línea puede operar de manera flexible y su salida se puede mostrar a través de variables C. Debido a que tiene esta capacidad, asm se puede utilizar como interfaz entre instrucciones ensambladoras y programas C. Utilice la palabra clave __asm__. Si hay más de una línea de instrucciones, se deben agregar comillas dobles a cada línea, seguidas de \n\t.
Si desea asegurarse de que el compilador no optimice las instrucciones dentro de "asm", puede utilizar la palabra clave "volatile" después de "__asm__".
Elementos básicos del ensamblaje en línea
Para estructuras gramaticales específicas, consulte una de las publicaciones de mi blog: "GCC Inline Assembly" Enlace del artículo:
/u3 / 119372/showart_2417924.html
Descripción de elementos básicos:
Calificador
Significado
“m” “v” “o”
Unidad de memoria
“r”
Cualquier registro
“q”
Registro eax, ebx, One de ecx y edx
“i” “h”
Operando directo
“E” “F”
Número de punto flotante
“g”
Cualquiera
“a” ”b” ”c” ”d”
Representa los registros eax y ebx respectivamente, ecx,edx
“S” ”D”
Registrar esi,edi
“I”
Constante (0 a 31 )
5. Notas sobre la programación SSE
Alineación de datos
La unidad de memoria de la CPU está limitada por 16 bytes. Si los datos no están alineados antes de la operación, estarán limitados. una instrucción La operación genera muchos retrasos.
GCC:
flotante
__attribute__((aligned(16))) a[4]={1.2f,3.5f,1.7f,2.8f };
VC:
__declspec(align(16)) float a[4]={1.2f,3.5f,1.7f,2.8f};