Red de conocimiento informático - Material del sitio web - Cómo escribir aplicaciones usando el conjunto de instrucciones SSE

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, es el tipo de instrucción, como agregar, sub, etc., y es el tipo de instrucción. Sólo hay dos tipos de instrucciones de operaciones de punto flotante SSE: ps y ss.

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};