Streaming SIMD Extensions:

Documentos relacionados
Arquitecturas vectoriales, SIMD y extensiones multimedia

Computación en procesadores gráficos

Programación en Intel Xeon Phi

Sistema electrónico digital (binario) que procesa datos siguiendo unas instrucciones almacenadas en su memoria

Desde los programas más simples escritos en un lenguaje de programación suelen realizar tres tareas en forma secuencial.

ÍNDICE CAPÍTULO 1 FUNDAMENTOS DE LOS MICROCONTROLADORES

Los registros son la memoria principal de la computadora. Existen diversos registros de propósito general y otros de uso exclusivo.

INTRODUCCIÓN A LA POO EN C++

Primeros pasos con CUDA. Clase 1

Introducción general al Lenguaje C (2010/2011)

Apuntadores (Punteros)

TEMA III: OPERACIONES CON LOS DATOS

Datos Elementales y formato de un programa en Java

Modelo de von Neumann

TEMA 2: PROGRAMACIÓN PARALELA (I)

Arquitectura de Computadoras. Clase 2 Interrupciones

Paralelismo _Arquitectura de Computadoras IS603

Unidad VIII Generación de código intermedio. M.C. Juan Carlos Olivares Rojas

5.1. Filtro de Kalman

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

1.1 Tipos de Datos Primitivos. 1.2 Tipos de datos estructurados. 1.3 Definición de estructura de datos

Programación I Unidad III. Tema: Tipos, estructuras y uniones

Punteros. Programación en C 1

Tema 6: Memoria dinámica

Alejandro Molina Zarca

1. Presentación del lenguaje C Creado en 1972 por D. Ritchie Lenguaje de propósito general Portátil o transportable (generalmente) Inicialmente de niv

SISTEMAS OPERATIVOS: SISTEMAS DE FICHEROS. Ficheros

UNIVERSIDAD DE GUADALAJARA

SISTEMAS PARALELOS Y DISTRIBUIDOS. 3º GRADO EN ING. INFORMÁTICA. ING. COMPUTADORES PRÁCTICA 8: INTRODUCCIÓN A OPENMP.

Tipos de datos y Operadores Básicos

Tema 7. Mejora del rendimiento: introducción a la segmentación y a las arquitecturas paralelas

Introducción a Cómputo Paralelo con CUDA C/C++

Capítulo 3. Introducción a la programación. Continuar

4. Operadores Operador asignación

Sistema de memoria. Introducción

PROGRAMACIÓN PARALELA. Modelos de programación paralela Paradigmas de programación paralela

ESTRUCTURA DE DATOS. Memoria estática Memoria dinámica Tipo puntero Declaración de punteros Gestión de memoria dinámica Resumen ejemplo

Todo programa en 'C' consta de una o más funciones, una de las cuales se llama main.

Descripción y Contenido del Curso. Programación C++ Capacity Academy.

Tema 2: Desarrollo de Algoritmos. E.E. de Algorítmica

TEMA 2: Organización de computadores

Programación 1 Tema 3. Información, datos, operaciones y expresiones

Repaso Lenguaje C Área de Servicios Programación (Ing. Elect. y Prof. Tec.), Programación I (TUG y TUR) y Electrónica programable (TUE)

Introducción al lenguaje C

Expresiones Aritméticas. Programación digital I Escuela de Sistemas Facultad de Ingeniería Gilberto Diaz

IBM 360. Igor Perez Martín. Jesús Manuel Salvadó Cenera. Mario Junquera Gómez

Multiplicación de Matrices en Sistemas cc-numa Multicore. Autor: Jesús Cámara Moreno Director: Domingo Giménez Cánovas

TEMA 1 FUNDAMENTOS DEL DISEÑO DEL HARDWARE DIGITAL

Programación en Lenguaje C

Nociones básicas de computación paralela

El nivel ISA (II)! Conjunto de Instrucciones

Introducción rápida a la programación (estructurada ) con C++

MODOS DE DIRECCIONAMIENTO

Algoritmos y estructuras de datos

Programación de Videojuegos Tema 15 Tipos de Dato I. 15. Tipos de Dato I

Unidad IV Arreglos y estructuras. M.C. Juan Carlos Olivares Rojas

Sistemas. POSTREQUISITO: CATEGORÍA: Obligatorio SECCION: A HORAS POR SEMANA

Expresiones y sentencias

PROGRAMA: COMPUTACION I

Conceptos y definiciones básicos en computación

Fundamentos de la programación

Tutorías con Grupos Reducidos (TGR) Parte 1: Evaluación de prestaciones

Elementos de un programa en C

Programación Estructurada. Sesión 2:El lenguaje de programación C

Es un lenguaje estructurado, tiene una abundante cantidad de operadores y tipos de datos.

Tema 2: Lenguaje máquina. La interfaz entre el hardware y el software

Introducción a la Programación de Memoria Compartida.. con OpenMP

Procesador: Pentium 4 SL6S9. Año 2001, 2.4 GHZ 512 KB L2 caché Hecho en Filipinas

Granularidad y latencia

Transcripción:

Streaming SIMD Extensions: Vectorización al alcance de todos Germán Ros Sánchez Universidad de Murcia Octubre 2009

SSE*: Streaming SIMD Extensions Es un conjunto de instrucciones SIMD que incorporan los procesadores modernos de Intel y AMD. Son muy útiles para conseguir pequeños speedup de entre 2x~4x. Tiene un ancho de 4 operaciones (128bits). El bajo nivel de abstracción que proponen (ASM/C) ha provocado que muchos programadores no las usen. Tienen una utilidad limitada: VECTORIZACIÓN.

Arquitectura oculta

Modelo de programación C/C++ Si bien es cierto que a nivel de ensamblador el modelo es austero, usando la abstracción ofrecida por xmmintrin.h podemos obtener un modelo de programación similar a otros de vectorización, tales como CUDA. El proceso es fácilmente resumible en tres fases: Agrupamiento de los datos a operar Realizar las operaciones pertinentes Compilar: gcc/g++ -o prog prog.c -msse

1. Tipos de datos y agrupamiento En SSE usamos aritmética de coma flotante A la hora de definir las matrices las cosas cambian un poco. Ahora hay que utilizar declspec(align(16)) float en lugar de Float. Ej: declspec(align(16)) float M[SIZE]; Cuando queremos usar matrices dinámicas debemos sustituir la función malloc por _mm_malloc. Ej: M = (float*) _mm_malloc(n*sizeof(float), 16);

1. Tipos de datos y agrupamiento (II) Estos cambios obedecen a la necesidad de que los datos estén correctamente alineados a 16Bytes. Una vez que nuestros datos estén definidos y alineados tenemos que agruparlos para que puedan ser usados por las funciones de SSE. El agrupamiento se hace a través del tipo de datos m128. Ej: m128* pm = ( m128*) M;

1. Tipos de datos y agrupamiento (III) Muchas veces puede resultar de utilidad hacer que nuestros tipos de datos sean conscientes de SSE para obtener el mejor de los rendimientos. Hay que tener cuidado con esto. Se debería hacer de forma transparente al resto del código del programa (encapsulado en alguna función). Ej: Estructura para un pixel en SSE typedef struct { float red[4]; float green[4]; float blue[4]; float alpha[4]; } CData32T4;

2. Realizando Operaciones Gestión de la memoria _aligned_malloc _aligned_free Operaciones aritméticas _mm_add_ps _mm_sub_ps _mm_mul_ps _mm_div_ps _mm_sqrt_ps...

2. Realizando Operaciones (II) Operaciones lógicas _mm_and_ps _mm_or_ps _mm_xor_ps _mm_andnot_ps Operaciones de conversión _mm_cvtss_si32 _mm_cvtps_pi32 _mm_cvttss_si64 _mm_cvtpi16_ps Y MUCHAS MÁS OPERACIONES EN xmmintrin.h!

Un ejemplo práctico

Suma de vectores secuencial float* m1; float* m2; float* m3; srand(time(null)); m1 = new float[m]; m2 = new float[m]; m3 = new float[m]; //Inicializacion for(int i=0;i<m;i++) { m1[i] = (rand()/(float)rand_max); m2[i] = (rand()/(float)rand_max); } //T veces for(int k=0;k<t;k++) { //suma for(int i=0;i<m;i++) m3[i] = m1[i] + m2[i]; } Declaración Inicialización Cálculo

Suma de vectores vectorizada (I) float* m1; float* m2; float* m3; Inicialización SSE srand(time(null)); m1 = (float*) _mm_malloc(m * sizeof(float), 16); m2 = (float*) _mm_malloc(m * sizeof(float), 16); m3 = (float*) _mm_malloc(m * sizeof(float), 16); //Inicializacion for(int i=0;i<m;i++) { m1[i] = (rand()/(float)rand_max); m2[i] = (rand()/(float)rand_max); }

Suma de vectores vectorizada (II) int m = M/4; //T veces for(int k=0;k<t;k++) { m128* psrc1 = ( m128*) m1; m128* psrc2 = ( m128*) m2; m128* pdest = ( m128*) m3; } //suma for(int i=0;i<m;i++) { *pdest = _mm_add_ps(*psrc1, *psrc2); psrc1++; psrc2++; pdest++; } Asignación a los tipos SSE Cálculo con SSE

Conclusiones

Ejemplos de rendimiento

Ventajas Ofrece la posibilidad de tener paralelismo de datos de manera sencilla y sin necesidad de adquirir un hardware caro. Es posible su combinación con otras técnicas como OpenMP, MPI, CUDA, etc. Inconvenientes El nivel de abstracción ofrecido no es tan alto como en OpenMP. No hay posibilidad de seguir escalando más allá de 4x o 5x. Estamos haciendo programas dependientes de la arquitectura. No contamos con primitivas de sincronización.

Úiltimamente... Se está ampliando su uso en el ámbito científico/académico, en áreas como la Visión por Computador, o el modelado 3D. Aunque no ofrecen grandes SpeedUps, su uso puede suponer la diferencia entre una ejecución en Tiempo Real o no. De ahí que últimamente se use en combinación de otras tecnologías como CUDA Pronto quedarán obsoletas con la salida de AVX: Advanced Vector Extensions (prevista para 2010)

Referencias http://www.codeproject.com/kb/recipes/sseintro.aspx http://www.cvl.isy.liu.se/scout/publications/paperinfo/sf05.html http://www.usqcd.org/fnal/sse/sse.html http://www.gamedev.net/reference/articles/article1987.asp http://msdn.microsoft.com/en-us/library/t467de55(vs.71).aspx http://en.wikipedia.org/wiki/streaming_simd_extensions http://softwarecommunity.intel.com/isn/downloads/ Intel%20SSE4%20Programming%20Reference.pdf

Preguntas?