Febrero 2012. Departamento de Electrónica e Sistemas Universidade da Coruña. Introducción a las Extensiones Multimedia



Documentos relacionados
Familia de procesadores Intel x86

Extensiones multimedia Intel

Arquitecturas GPU v. 2013

Introduccion al Lenguaje C. Omar Andrés Zapata Mesa Grupo de Fenomenología de Interacciones Fundamentales, (Gfif) Universidad de Antioquia

Dr.-Ing. Paola Vega Castillo

ITT-327-T Microprocesadores

Modelo de aplicaciones CUDA

Arquitecturas CISC y RISC

Tema 2. Diseño del repertorio de instrucciones

ACTIVIDADES TEMA 1. EL LENGUAJE DE LOS ORDENADORES. 4º E.S.O- SOLUCIONES.

Tema 5 Repertorios de instrucciones: Modos de direccionamiento y formato

MICROPROCESADORES, EVOLUCIÓN HISTÓRICA Y CARACTERÍSTICAS TÉCNICAS BÁSICAS

Procesador Intel Core 2 Extreme de 4 núcleos Traducción de Textos Curso 2007/2008

Preliminares. Tipos de variables y Expresiones

Una variable de clase escalar tiene un nivel de indirección igual a 1. Por ejemplo, las variables i, b y x definidas como se muestra a continuación.

Lógica Binaria. Arquitectura de Ordenadores. Codificación de la Información. Abelardo Pardo Universidad Carlos III de Madrid

Tema 2: Arquitectura del repertorio de instrucciones. Visión del computador que tiene el programador en bajo nivel.

"Programación en Ensamblador del microprocesador Pentium (I)"

1. Manejo de memoria estática 2. Manejo de memoria dinámica

PROBLEMAS DE FUNDAMENTOS DE TECNOLOGÍA DE COMPUTADORES T5. MEMORIAS

PROGRAMACION VECTORIAL RAFAEL VALDÉS VALDAZO UO ÁNGEL MARÍA VILABOA PÉREZ UO BLOQUE PARALELAS 4º INFORMÁTICA UNIVERSIDAD DE OVIEDO

Capítulo 4. Vectores y matrices. 4.1 Declaración de tablas. 4.2 Declaración estática de tablas

Hardware: dentro de la caja. Introducción a la Informática

Arquitectura de Computadores

Unidad 1: Conceptos generales de Sistemas Operativos.

CPU. Unidad central de procesamiento

1.1 Definición del problema

LECCIÓN 8: CIRCUITOS Y ALGORITMOS DE MULTIPLICACIÓN DE ENTEROS

18. Camino de datos y unidad de control


PRÁCTICA MANEJO INTERNO DE DATOS

Arquitectura Von Neumann

Aritmética finita y análisis de error

Java Inicial (20 horas)

Estructura de Computadores

Tiempo de Compilación. Programa fuente. Secuencia. de caracteres. Scanner. Secuencia. de símbolos Parser. Compilador.

Introducción a la Programación 11 O. Humberto Cervantes Maceda

Procesador Pentium II 450 MHz Procesador Pentium II 400 MHz Procesador Pentium II 350 MHz Procesador Pentium II 333 MHz Procesador Pentium II 300 MHz

Curso S08 para Cavernícolas

X86 frente a PPC - Intel/AMD contra IBM

El microprocesador. Alberto Molina Coballes David Sánchez López. Noviembre Fundamentos de Hardware

Procesadores de lenguaje Tema 5 Comprobación de tipos

Se guardan en archivos con extencion c y los cabezales con extension h

Introducción al tipo de dato ARRAY

Programación Vectorial

Operaciones Aritméticas en Números con Signo

PROGRAMA DE CURSO. Horas Docencia Horas de Trabajo Horas de Cátedra Docentes ,

Clase 02: Representación de datos

Es el conjunto de programas y procedimientos ejecutados en un computador, necesarios para hacer posible la realización de una tarea específica.

Tema 1 Introducción. Arquitectura básica y Sistemas Operativos. Fundamentos de Informática

Unidad de trabajo 2: INFORMÁTICA BÁSICA (primera parte)

Programación de Sistemas

DISCOS RAID. Se considera que todos los discos físicos tienen la misma capacidad, y de no ser así, en el que sea mayor se desperdicia la diferencia.

Arquitecturas vectoriales, SIMD y extensiones multimedia

Diseño Lógico I Facultad de Ciencias Exactas y Tecnología UNT. LENGUAJES DE DESCRIPCIÓN DE HARDWARE

2.4. Modos de direccionamiento Distintas formas que tiene la arquitectura para especificar la ubicación de los operandos.

1 Estructura básica de un programa C++

En cualquier caso, tampoco es demasiado importante el significado de la "B", si es que lo tiene, lo interesante realmente es el algoritmo.

TEMA 4. Unidades Funcionales del Computador

Tema: Historia de los Microprocesadores

Apuntes de Microcontroladores (Repaso de temas previos)

>> % suma de dos números reales, el resultado se asigna a ans

Arrays y Cadenas en C

Buceando en los MCUs Freescale...

UNA NUEVA GENERACIÓN: HÍBRIDOS CPU/GPU. Microprocesadores para Comunicaciones. Paloma Monzón Rodríguez M

Unidad I. 1.1 Sistemas numéricos (Binario, Octal, Decimal, Hexadecimal)

Arquitectura de Computadoras. Clase 5 Posibles soluciones a atascos

SCT Software para la calibración de transductores de fuerza. Versión 3.5. Microtest S.A.

by Tim Tran:

Trabajo Práctico Nº 1 SISTEMAS DE NUMERACION

Tema 6. Gestión de la memoria

Para ello debemos ingresar al índice del curso y seleccionar recorrido por el curso, tal como se muestra en la siguiente diapositiva:

SOLUCIÓN: a) Signo y magnitud:

Gestor de aplicaciones Java. Esta herramienta es el intérprete de los archivos de clase generados por el javac (compilador).

Tema 11: Sistemas combinacionales

TEMA 1 Representación de la información

ARQUITECTURA DE DISTRIBUCIÓN DE DATOS

PONTIFICIA UNIVERSIDAD CATÓLICA DEL PERÚ DISEÑO E IMPLEMETACIÓN DEL FILTRO MEDIANO DE DOS DIMENSIONES PARA ARQUITECTURAS SIMD

CARRERA TITULO DEL TRABAJO CURSO

Sistemas Operativos. Sesión 5: Protocolos de enrutamiento vector distancia

No se requiere que los discos sean del mismo tamaño ya que el objetivo es solamente adjuntar discos.

Representación de números enteros: el convenio signo y magnitud

Arquitecturas DSP. Phil Lapsley, Jeff Bier, Amit Shoham, Edward A. Lee DSP Processor Fundamentals. Architectures and Features IEEE Press 1997

ESTRUCTURA Y TECNOLOGÍA A DE COMPUTADORES

Entorno de Ejecución del Procesador Intel Pentium

PRÁCTICA DE LABORATORIO 3 Tipo Abstrato de Dato

Aprendiendo a programar Microcontroladores PIC en Lenguaje C con CCS

Repaso de las características más importantes de la programación Java y su adaptación a Android

Control Digital en PC con MS-DOS

Ingeniería Superior de Informática

Contenido. Capítulo 1. Introducción a lenguaje C 1

Tema 3 Elementos básicos de programación


Guía N 1: Fundamentos básicos(i)

Seminario Universitario Material para estudiantes. Física. Unidad 2. Vectores en el plano. Lic. Fabiana Prodanoff

Universidad Central de Bayamón Colegio de Desarrollo Empresarial y Tecnología

GRADO EN INGENIERÍA INFORMÁTICA CURSO 2009/2010. Asignatura: ESTRUCTURA Y TECNOLOGÍA DE COMPUTADORES I Código: IIN113

Introducción a la programación orientada a objetos

INFORMÁTICA. Práctica 5. Programación en C. Grado en Ingeniería en Electrónica y Automática Industrial. Curso v1.0 (05.03.

Gestion de archivos. Problemas al almacenar datos sólo en la memoria:

Transcripción:

a a Departamento de Electrónica e Sistemas Universidade da Coruña Febrero 2012 3 a

Índice a 3 1 2 3 4 5 6 3 a

Qué son extensiones multimedia? a Son nuevas instrucciones añadidas al repertorio de instrucciones de los microprocesadores. Estas instrucciones están optimizadas para procesar datos en aplicaciones multimedia. La característica común es que están basadas en el paradigma SIMD. Las extensiones multimedia utilizan replicación de unidades funcionales. Ejecución síncrona de la misma instrucción sobre datos diferentes. Control 3 a 2 / 30

SIMD vs. Superscalar a Un procesador SIMD es más sencillo que uno superscalar por varias razones: Sólo necesita una unidad de control. No es necesario resolver dependencias. Control Banco de registros Acceso a memoria Control Análisis de dependencias Reordenamiento de instrucciones Renombramiento de registros Ejecución de instrucciones Banco de registros Acceso a memoria 3 a 3 / 30

SIMD en sistemas comerciales a 3 Microprocesadores multicore actuales: SSE de Intel, Altivec para el PowerPC (IBM), 3DNow! para AMD. GPUs actuales (Graphic Processing Unit): tarjetas gráficas como GeForce GTX 580, ATI Radeon 6970. Del orden de cientos de cores pero con una jerarquía que complica su programación. Procesador Cell de la PlayStation3. Dentro de cada unidad SPE (tiene 8 en el mismo procesador) utiliza instrucciones vectoriales propietarias (basadas en Altivec). Many Integrated Core (MIC) de Intel a 4 / 30

Contextualización del paralelismo SIMD a SSE 3 a 5 / 30

Evolución histórica de extensiones multimedia a 3 Año 1997: MMX Año 1998: 3dNow! Año 1999: SSE Año 2001: SSE2 Año 2004: SSE3 Año 2006: SSSE3 Año 2007: SSE4 Año 2007: SSE5 Año 2008: AVX Aparecen en el Pentium. Usan 8 registros vectoriales (mmx0... mmx7) de 64 bits. Registros compartidos con la FPU. Sólo operaciones sobre enteros. a 6 / 30

Evolución histórica de extensiones multimedia a 3 Año 1997: MMX Año 1998: 3dNow! Año 1999: SSE Año 2001: SSE2 Año 2004: SSE3 Año 2006: SSSE3 Año 2007: SSE4 Año 2007: SSE5 Año 2008: AVX Aparecen en el AMD K6-2. Operan tanto sobre enteros como sobre punto flotante. Extendida posteriormente en Enhaced 3dNow! y 3dNow! Professional a 6 / 30

Evolución histórica de extensiones multimedia a 3 Año 1997: MMX Año 1998: 3dNow! Año 1999: SSE Año 2001: SSE2 Año 2004: SSE3 Año 2006: SSSE3 Año 2007: SSE4 Año 2007: SSE5 Año 2008: AVX Acrónimo de Streaming SIMD Extensions. Usadas en el Pentium III y el AMD Athlon. 8 nuevos registros (xmm0... xmm7) de 128 bits. 70 nuevas instrucciones vectoriales en punto flotante de simple precisión. a 6 / 30

Evolución histórica de extensiones multimedia a 3 Año 1997: MMX Año 1998: 3dNow! Año 1999: SSE Año 2001: SSE2 Año 2004: SSE3 Año 2006: SSSE3 Año 2007: SSE4 Año 2007: SSE5 Año 2008: AVX Presentes en el Pentium IV y el AMD Athlon 64. Nuevas instrucciones vectoriales para enteros y punto flotante en doble precisión. Ya no es necesario el uso de instrucciones MMX. a 6 / 30

Evolución histórica de extensiones multimedia a 3 Año 1997: MMX Año 1998: 3dNow! Año 1999: SSE Año 2001: SSE2 Año 2004: SSE3 Año 2006: SSSE3 Año 2007: SSE4 Año 2007: SSE5 Año 2008: AVX Se usan en el Pentium IV Prescott y en los últimos Athlon 64 y Athlon 64 X2. 13 nuevas instrucciones. Mejora la capacidad para trabajar (horizontalmente) sobre datos guardados en el mismo registro. a 6 / 30

Evolución histórica de extensiones multimedia a 3 Año 1997: MMX Año 1998: 3dNow! Año 1999: SSE Año 2001: SSE2 Año 2004: SSE3 Año 2006: SSSE3 Año 2007: SSE4 Año 2007: SSE5 Año 2008: AVX Acrónimo de Suplementary SSE3. Usadas sólo en la arquitectura Core. Son 16 nuevas instrucciones para 64 bits y mismas 16 para 128 bits. a 6 / 30

Evolución histórica de extensiones multimedia a 3 Año 1997: MMX Año 1998: 3dNow! Año 1999: SSE Año 2001: SSE2 Año 2004: SSE3 Año 2006: SSSE3 Año 2007: SSE4 Año 2007: SSE5 Año 2008: AVX Implementadas en el Intel Core 2 Duo Penryn. Son 54 (47 SSE4.1 + 7 SSE4.2) nuevas instrucciones. Trabaja con registros de 128 bits pero realiza cálculos tanto de enteros como de punto flotante. a 6 / 30

Evolución histórica de extensiones multimedia a 3 Año 1997: MMX Año 1998: 3dNow! Año 1999: SSE Año 2001: SSE2 Año 2004: SSE3 Año 2006: SSSE3 Año 2007: SSE4 Año 2007: SSE5 Año 2008: AVX Implementadas en el procesador AMD Bulldozer (2011). Son 170 nuevas instrucciones. a 6 / 30

Evolución histórica de extensiones multimedia a 3 Año 1997: MMX Año 1998: 3dNow! Año 1999: SSE Año 2001: SSE2 Año 2004: SSE3 Año 2006: SSSE3 Año 2007: SSE4 Año 2007: SSE5 Año 2008: AVX Implementadas en el procesador Intel Sandy Bridge (2010) y AMD Bulldozer (2011). a 6 / 30

Índice a 3 1 2 3 4 5 6 3 a

Métodos para usar la tecnología SIMD a 3 + facilidad de uso + control Vectorización automática. Ces C++ especiales. Librería. Lenguaje ensamblador embebido. Soporte limitado en los compiladores. No se debe tener confianza en que obtengan un buen rendimiento. En gcc (version >=4.0): -O3 -ftree-vectorize -ftreevectorizer-verbose=nivel -march=arquitectura En icc: -O3 -xsse3 -vec-report[nivel] a 7 / 30

Métodos para usar la tecnología SIMD a 3 + facilidad de uso + control Vectorización automática. Ces C++ especiales. Librería. Lenguaje ensamblador embebido. Cabeceras. ivec.h para MMX fvec.h para SSE e incluye ivec.h dvec.h para SSE2 e incluye fvec.h Ces especiales. I8vec8, (ocho enteros de 8 bits) I8vec16, (16 enteros de 8 bits) I16vec4, I16vec8, I32vec2, I32vec4, I64vec1, I64vec2, I128vec1 Isec8, (entero con signo) Iuvec8 (entero sin signo) F32vec4 4 números flotante en simple precisión de 32 bits F64vec4 4 números flotante en simple precisión de 64 bits a 7 / 30

Métodos para usar la tecnología SIMD a 3 + facilidad de uso + control Vectorización automática. Ces C++ especiales. Librería. Lenguaje ensamblador embebido. Alta eficiencia pero programación engorrosa y lenta. GCC Inline Assembly: asm { // Instrucciones en ensamblador } a 7 / 30

Métodos para usar la tecnología SIMD a 3 + facilidad de uso + control Vectorización automática. Ces C++ especiales. Librería. Lenguaje ensamblador embebido. Funciones de alto nivel que se mapean de forma casi directa en instrucciones ensamblador. Ofrecen lo mejor de ambos mundos. Ejemplos: MMX: m64 m paddb( m64 m1, m64 m2) SSE: m128 mm add ps( m128 a, m128 b) Altivec: vec madd(arg1, arg2, arg3) a 7 / 30

Índice a 3 1 2 3 4 5 6 3 a

Programación en SSE usando a 3 Cabeceras a utilizar: mmintrin.h para instrucciones MMX. xmmintrin.h para instrucciones SSE. Incluye mmintrin.h. emmintrin.h para instrucciones SSE2. Incluye xmmintrin.h. pmmintrin.h para instrucciones SSE3. Incluye emmintrin.h. Proporcionan: NOTA Tipos de datos para manejo de los registros vectoriales. Instrucciones vectoriales. En Linux la llamada cat /proc/cpuinfo muestra qué extensiones están disponibles. a 8 / 30

Tipos de datos y operaciones de a 3 NOTA Tipo Registro Almacena m64 MMX 8x8 bits, 4x16 bits, 2x32 bits o 1x64 bits m128 XMM 4x32 bits m128d XMM 2x64 bits m128i XMM 16x8 bits, 8x16 bits, 4x32 bits, 2x64 bits Por el tipo de datos: Enteros: 8, 16, 32 y 64 bits, con y sin signo. Punto flotante: simple y doble precisión. Por el tipo de operación: Aritmético-lógicas: sumas, productos... De manipulación de datos: movimiento entre registros y memoria, empaquetar/desempaquetar... No existen instrucciones de control de flujo SIMD. a 9 / 30

Instrucciones vectoriales de a 3 El nombre suele seguir la forma libreria instruccion sufijo Librería: mm para SSE, m para MMX. Instrucción: Por ejemplo la suma es add. Sufijo: Sobre registros MMX(64-bit): pi# Contienen enteros de #-bit empaquetados. pu# Contienen enteros sin signo de #-bit empaquetados. si64 Contienen un solo entero de 64 bits. Sobre registros XMM(128-bit): epi# Contienen enteros de #-bit empaquetados. epu# Contienen enteros sin signo de #-bit empaquetados. ps Contienen valores en punto flotante de precisión simple empaquetados. ss Contienen un número en punto flotante de precisión simple. pd Contienen valores en punto flotante de doble precisión empaquetados. sd Contienen un número en punto flotante de doble precisión. si128 Contienen un solo entero de 128 bits. a 10 / 30

Instrucciones vectoriales de a 3 El nombre suele seguir la forma libreria instruccion sufijo Librería: mm para SSE, m para MMX. Instrucción: Por ejemplo la suma es add. Sufijo: Sobre registros MMX(64-bit): pi# Contienen enteros de #-bit empaquetados. pu# Contienen enteros sin signo de #-bit empaquetados. si64 Contienen un solo entero de 64 bits. Sobre registros XMM(128-bit): epi# Contienen enteros de #-bit empaquetados. epu# Contienen enteros sin signo de #-bit empaquetados. ps Contienen valores en punto flotante de precisión simple empaquetados. ss Contienen un número en punto flotante de precisión simple. pd Contienen valores en punto flotante de doble precisión empaquetados. sd Contienen un número en punto flotante de doble precisión. si128 Contienen un solo entero de 128 bits. a 10 / 30

Instrucciones vectoriales de a 3 El nombre suele seguir la forma libreria instruccion sufijo Librería: mm para SSE, m para MMX. Instrucción: Por ejemplo la suma es add. Sufijo: Sobre registros MMX(64-bit): pi# Contienen enteros de #-bit empaquetados. pu# Contienen enteros sin signo de #-bit empaquetados. si64 Contienen un solo entero de 64 bits. Sobre registros XMM(128-bit): epi# Contienen enteros de #-bit empaquetados. epu# Contienen enteros sin signo de #-bit empaquetados. ps Contienen valores en punto flotante de precisión simple empaquetados. ss Contienen un número en punto flotante de precisión simple. pd Contienen valores en punto flotante de doble precisión empaquetados. sd Contienen un número en punto flotante de doble precisión. si128 Contienen un solo entero de 128 bits. a 10 / 30

Instrucciones vectoriales de a 3 El nombre suele seguir la forma libreria instruccion sufijo Librería: mm para SSE, m para MMX. Instrucción: Por ejemplo la suma es add. Sufijo: Sobre registros MMX(64-bit): pi# Contienen enteros de #-bit empaquetados. pu# Contienen enteros sin signo de #-bit empaquetados. si64 Contienen un solo entero de 64 bits. Sobre registros XMM(128-bit): epi# Contienen enteros de #-bit empaquetados. epu# Contienen enteros sin signo de #-bit empaquetados. ps Contienen valores en punto flotante de precisión simple empaquetados. ss Contienen un número en punto flotante de precisión simple. pd Contienen valores en punto flotante de doble precisión empaquetados. sd Contienen un número en punto flotante de doble precisión. si128 Contienen un solo entero de 128 bits. a 10 / 30

Instrucciones de Carga/Almacenamiento a m128 mm load ps(float *p) p 0 1 2 3 RAM... p 0 p 1 p 2 p 3... float *p; m128 a; //Inicialización, reserva de espacio y alineado... a = _mm_load_ps(p); 0 1 2 3 p 0 p 1 p 2 p 3 a 3 NOTA La dirección p debe tener un alineamiento de 16 bytes. a 11 / 30

Instrucciones de Carga/Almacenamiento a void mm store ps(float *p, m128 a) p 0 1 2 3 RAM... a0 a1 a2 a3... float *p; m128 a; //Inicialización, reserva de espacio y alineado... _mm_store_ps(p, a); 0 1 2 3 a0 a1 a2 a3 a 3 NOTA La dirección debe tener un alineamiento de 16 bytes. a 11 / 30

Instrucciones de Inicialización a m128 mm setzero ps(void) 0 127 0 0 0 0 0 1 2 3 Inicializa el registro con 4 ceros en punto flotante de simple precisión. 3 a 12 / 30

Instrucciones de Inicialización a m128 mm set ps(float z, float y, float x, float w) 0 127 w x y z 0 1 2 3 Inicializa el registro con los números en puntos flotante de simple precisión especificados en w,x,y y z. 3 a 12 / 30

Instrucciones de Reordenación a m128 mm unpacklo ps( m128 a, m128 b) m128 a, b, c; //Inicialización de registros... c = _mm_unpacklo_ps(a, b); a 0 a 1 a 2 a 3 a UPCKLO b 0 b 1 b 2 b 3 b 3 a 0 b 0 a 1 b 1 c Entrelaza los 2 valores en punto flotante y simple precisión de la parte inferior de a con los 2 de la parte inferior de b. a 13 / 30

Instrucciones de Reordenación a m128 mm unpackhi ps( m128 a, m128 b) m128 a, b, c; //Inicialización de registros... c = _mm_unpackhi_ps(a, b); a 0 a 1 a 2 a 3 a UPCKHI b 0 b 1 b 2 b 3 b 3 a 2 b 2 a 3 b 3 c Entrelaza los 2 valores en punto flotante de la parte superior de a con los 2 de la parte superior de b. a 13 / 30

Instrucciones de Reordenación a m128 mm shuffle ps( m128 a, m128 b, int imm) m128 a, b, c; //Inicialización de registros... c = _mm_shuffle_ps(a, b, _MM_SHUFFLE(1,2,3,0)); a 0 a 1 a 2 a 3 a SHUFFLE b 0 b 1 b 2 b 3 b 3 a 0 a 3 b 2 b 1 c Selecciona 2 valores de a y 2 valores de b basándose en el contenido de la máscara imm. a 13 / 30

Operación de shuffle: Uso de la máscara a Dados dos registros vectoriales m1 y m2... 0 127 m1 a b c d 0 127 m2 e f g h 3 a 14 / 30

Operación de shuffle: Uso de la máscara a...los combino en un tercer registro m3, usando una máscara. 0 127 m1 a b c d m3 = _mm_shuffle_ps(m1, m2, _MM_SHUFFLE(,,,)) 3 m2 0 127 e f g h m3 0 127 a 14 / 30

Operación de shuffle: Uso de la máscara a Los 2 primeros argumentos seleccionan los elementos de m2. 0 127 m1 a b c d m3 = _mm_shuffle_ps(m1, m2, _MM_SHUFFLE(1,2,,)) 0 127 0 127 m2 e f g h m3 g f 0 (1) (2) 3 3 a 14 / 30

Operación de shuffle: Uso de la máscara a Los 2 últimos argumentos seleccionan los elementos de m1. 0 127 m1 a b c d m3 = _mm_shuffle_ps(m1, m2, _MM_SHUFFLE(1,2,3,0)) (0) 1 2 (3) 0 127 0 127 m2 e f g h m3 a d g f 3 a 14 / 30

Instrucciones Aritméticas a m128 mm add ps( m128 a, m128 b) 0 127 a0 + b0 a1 + b1 a2 + b2 a3 + b3 0 1 2 3 Suma los 4 flotantes en simple precisión de a con los de b. 3 a 15 / 30

Instrucciones Aritméticas a m128 mm mul ps( m128 a, m128 b) 0 127 a0 b0 a1 b1 a2 b2 a3 b3 0 1 2 3 Multiplica los 4 flotantes en simple precisión de a con los de b. 3 a 15 / 30

Instrucciones Aritméticas a m128 mm hadd ps( m128 a, m128 b) 0 127 a0 + a1 a2 + a3 b0 + b1 b2 + b3 0 1 2 3 Suma dos a dos los 4 flotantes en simple precisión de a y los 4 de b. 3 a 15 / 30

Instrucciones Aritméticas a m128 mm sqrt ps( m128 a) 0 127 sqrt(a0) sqrt(a1) sqrt(a2) sqrt(a3) 0 1 2 3 Calcula la raíz cuadrada de los 4 números en punto flotante de simple precisión almacenados en a. 3 a 15 / 30

Instrucciones Aritméticas a m128i mm sad epu8( m128i a, m128i b) 0 127 0 0 0 abs(a8 b8) + 0 0 0 abs(a9 b9) +... + abs(a15 b15) 0 1 2 3 4 5 6 7 abs(a0 b0) + abs(a1 b1) +... + abs(a7 b7) Calcula la suma de diferencias absolutas entre los 8 primeros enteros de cada registro y entre los ocho siguientes. 3 a 15 / 30

Índice a 3 1 2 3 4 5 6 3 a

Vectorización a 3 La técnica se aplica sobre bucles dentro del programa. La disposición de los datos, el orden de operaciones y dependencias tienen gran influencia en el rendimiento. int i; float A[1024],B[1024],C[1024]; for(i=0; i<1024; i++) C[i]=A[i]*B[i]; int i; Unrolling factor 4 float A[1024],B[1024],C[1024]; m128 reg0, reg1, reg2; for(i=0; i<1024; i+=4){ reg0 = _mm_loadu_ps(&(a[i])); reg1 = _mm_loadu_ps(&(b[i])); reg2 = _mm_mul_ps(reg0, reg1); _mm_storeu_ps(&(c[i]),reg2); } int i; float A[1024],B[1024],C[1024]; for(i=0; i<1024; i+=4){ C[i]=A[i]*B[i]; C[i+1]=A[i+1]*B[i+1]; C[i+2]=A[i+2]*B[i+2]; C[i+3]=A[i+3]*B[i+3]; } a 16 / 30

Mapeado de datos: Alineado de memoria a Los registros SSE tienen 128 bits (16 bytes). Las instrucciones vectoriales deben operar sobre datos alineados. NOTA Si operamos vectorialmente datos no alineados obtendremos una excepción. Existen instrucciones específicas para operar datos no alineados (menor rendimiento dependiendo del hardware). 3 a 17 / 30

Mapeado de datos: Alineado de memoria a Memoria estática: Alineamiento: float a[1024] attribute ((aligned(16))); Memoria dinámica: Modificación manual del puntero. Instrucción específica de reserva de memoria: int *p=(int *) _mm_malloc(size*sizeof(int),16);... _mm_free(p); 3 a 18 / 30

Mapeado de datos: Tamaño de los datos a Ejemplo La máxima aceleración alcanzable utilizando instrucciones SIMD depende directamente del tamaño de los elementos individuales. Es necesario usar el tipo de datos más pequeño que podamos. Usar unsigned short en vez de unsigned int si sabemos que el máximo entero almacenado nunca excederá del rango de un unsigned short. 3 a 19 / 30

Índice a 3 1 2 3 4 5 6 3 a

Sumar los elementos de dos vectores a 3... float *a,*b,*c; a=(float *) malloc(size*sizeof(float)); b=(float *) malloc(size*sizeof(float)); c=(float *) malloc(size*sizeof(float)); for (i=0; i<size; i++) { c[i]=a[i]+b[i]; }... free(a);free(b);free(c); a 20 / 30

Sumar los elementos de dos vectores a 3... //Alineamiento de datos float *a,*b,*c; a=(float *) mm malloc(size*sizeof(float),16); b=(float *) mm malloc(size*sizeof(float),16); c=(float *) mm malloc(size*sizeof(float),16); /*... Inicializacion de los array...*/ for (i=0; i<size; i++) { c[i]=a[i]+b[i]; }... a 21 / 30

Sumar los elementos de dos vectores a 3... //Alineamiento de datos float *a,*b,*c; a=(float *) mm malloc(size*sizeof(float),16); b=(float *) mm malloc(size*sizeof(float),16); c=(float *) mm malloc(size*sizeof(float),16); /*... Inicializacion de los array...*/ //Declarar registros vectoriales m128 rega,regb,regc; for (i=0; i<size; i++) { c[i]=a[i]+b[i]; }... a 22 / 30

Sumar los elementos de dos vectores a 3... //Alineamiento de datos float *a,*b,*c; a=(float *) mm malloc(size*sizeof(float),16); b=(float *) mm malloc(size*sizeof(float),16); c=(float *) mm malloc(size*sizeof(float),16); /*... Inicializacion de los array...*/ //Declarar registros vectoriales m128 rega,regb,regc; //Procesar los elementos vectorialmente for (i=0; i<size; i=i+4) { regb= mm load ps(&(a[i])); regc= mm load ps(&(b[i])); rega= mm add ps(regb,regc); mm store ps(&(c[i]),rega); }... //Liberar memoria mm free(a); mm free(b); mm free(c); a 23 / 30

Índice a 3 1 2 3 4 5 6 3 a

Cálculo de la norma de cada fila de una matriz densa a for (i=0; i<nfi; i++) { normafila = 0; for (j=0; j<ncols; j++) { normafila += valores[i*ncols+j]*valores[i*ncols+j]; } norma[i] = sqrt(normafila); } 3 a 24 / 30

Cálculo de la norma de cada fila de una matriz: Versiones a 3 1 AUTOVEC : vectorizar automáticamente el código con GCC. 2 MANVEC1 : vectorizar la operación producto del bucle interno. 3 MANVEC2: vectorizar 3 operaciones del bucle más externo (+,*,sqrt) mediante operaciones que operen horizontalmente sobre datos ubicados en el mismo registro (instrucción mm hadd ps). 4 MANVEC3: vectorizar 3 operaciones del bucle más externo (+,*,sqrt) mediante operaciones que redistribuyan los datos en los registros para evitar operaciones horizontales (usar instrucciones tales como mm shuffle ps, mm unpacklo ps y mm unpackhi ps). a 25 / 30

Cálculo de la norma de cada fila de una matriz densa: Problemas a resolver a Problemas comunes que se deben resolver en versiones que utilizan : 1 Alineamiento de los datos. 2 El ĺımite del bucle puede no ser múltiplo del número de elementos que van a ser procesados simultáneamente en cada iteración del bucle vectorizado. 3 a 26 / 30

Cálculo de la norma de cada fila de una matriz densa: MANVEC2 y 3 a La matriz se procesa en subbloques del tamaño apropiado. a1 b1 a2 b2 a3 b3 a4 b4 c1 c2 c3 c4 d1 d2 d3 d4 3 Operación a realizar a1*a1 + a2*a2 + a3*a3 + a4*a4 b1*b1 + b2*b2 + b3*b3 + b4*b4 c1*c1 + c2*c2 + c3*c3 + c4*c4 d1*d1 + d2*d2 + d3*d3 + d4*d4 a 27 / 30

Cálculo de la norma de cada fila de una matriz densa: MANVEC2 a Vectorizar (*,+,sqrt) usando operaciones horizontales (p. ej. mm hadd ps): 2 Multiplicar cada registro por sí mismo. a1 a2 a3 a4 b1 b2 b3 b4 c1 c2 c3 c4 d1 d2 d3 d4 a1 a2 a3 a4 b1 b2 b3 b4 c1 c2 c3 c4 a1*a1 a2*a2 a3*a3 a4*a4 b1*b1 b2*b2 b3*b3 b4*b4 c1*c1 c2*c2 c3*c3 c4*c4 a1*a1+ a2*a2+ a3*a3+ a4*4 b1*b1+ b2*b2+ b3*b3+ b4*b4 c1*c1+ c2*c2+ c3*c3+ c4*c4 d1*d1+ d2*d2+ d3*d3+ d4*d4 d1 d2 d3 d4 1 - Cargar los datos en registros vectoriales. d1*d1 d2*d2 d3*d3 d4*d4 3 Sumar todos los registros entre sí. 3 4 - Al terminar de procesar cada fila calcular la raíz cuadrada de lo acumulado. a 28 / 30

Cálculo de la norma de cada fila de una matriz densa: MANVEC3 a Vectorizar (*,+,sqrt) usando operaciones de redistribución de los datos sobre los registros (p. ej. mm shuffle ps, mm unpacklo ps, mm unpackhi ps): 1 - Cargar los datos en registros vectoriales de 4 en 4. 3 - Multiplicar cada registro por sí mismo. a1 a2 a3 a4 a1 a2 a3 a4 a1 b1 c1 d1 a1*a1 b1*b1 c1*c1 d1*d1 b1 b2 b3 b4 c1 c2 c3 c4 d1 d2 d3 d4 b1 c1 d1 b2 c2 d2 b3 c3 d3 b4 c4 d4 2 - Reordenar los datos para evitar tener que realizar una suma de valores ubicados en el mismo registro. a2 a3 a4 b2 b3 b4 c2 c3 c4 d2 d3 d4 a2*a2 b2*b2 c2*c2 d2*d2 a1*a1 + b1*b1 + c1*c1 + a2*a2 + b2*b2 + c2*c2 + a3*a3 + b3*b3 + c3*c3 + a4*a4 b4*b4 c4*c4 a3*a3 b3*b3 c3*c3 d3*d3 a4*a4 b4*b4 c4*c4 d4*d4 4 - Sumar todos los registros entre sí. d1*d1 + d2*d2 + d3*d3 + d4*d4 3 Operación a realizar a1*a1 + a2*a2 + a3*a3 + a4*a4 b1*b1 + b2*b2 + b3*b3 + b4*b4 c1*c1 + c2*c2 + c3*c3 + c4*c4 d1*d1 + d2*d2 + d3*d3 + d4*d4 a 29 / 30

Información importante a Práctica 3 = Deadline: 16 y 17 de febrero 2012. Jorge González Domínguez Grupo de Arquitectura de Tutorías: Martes 11:30-13:30 y Viernes 10:30-12:30 Laboratorio 0.2 E-mail: jgonzalezd@udc.es 3 a 30 / 30