430 likes | 574 Views
Optimización de aplicaciones. Para PDAs basados en Intel Xscale. Arquitecturas Especializadas. Dispositivos PDA. Diversa funcionalidad Agenda telefónica, calendario. Procesar textos y documentos Word,Excel… Enviar e-mails. Reproducir vídeos,películas y MP3. Sistema de navegación GPS.
E N D
Optimización de aplicaciones Para PDAs basados en Intel Xscale Arquitecturas Especializadas
Dispositivos PDA • Diversa funcionalidad • Agenda telefónica, calendario. • Procesar textos y documentos Word,Excel… • Enviar e-mails. • Reproducir vídeos,películas y MP3. • Sistema de navegación GPS. • Usos educativos. • Usos en medicina.
Dispositivos SmartPhone • Son un teléfono móvil con capacidades de procesamiento adicionales. • Menor tamaño, menores prestaciones.
Características propias de un PDA • Pantalla táctil (Teclado opcional) • Memoria externa SD o Flash. • Conexiones IrDa, BlueTooth, WiFi. • Sistema Operativo • Windows CE • Linux • Symbian (sobre todo SmartPhones).
Windows CE • Interfaces directas con dispositivos usuales como GPS, BlueTooth..etc. • Soporte gráficos Direct Draw. • Servidor SQL integrado.
Linux • OpenZaurus – Sharp. • Basadas en Devian: • Familiar Linux. • Intimate (+ requisitos memoria)
Familia Intel Xscale • Implementación de la versión 5 de ARM sin coma flotante. • Familia de 4 procesadores: • PXA: Procesadores de aplicaciones. • IXC: Controladores alto rendimiento. • IXP: Controladores para redes. • IOP: Procesadores Entrada / Salida.
Procesadores Intel Xscale • Muy utilizados en PDAs. • Características: • Alta velocidad 400Mhz – 800Mhz • Bajo consumo (escalado dinámico). • Controladores integrados para pantalla táctil, sistema de sonido…etc. • Optimización para aplicaciones usuales: códecs audio/video, instrucciones MMX…
Elementos de la arquitectura • 16 registros de 32 bits • Multiplicador Acumulador de 40 bits • Cachés de instrucciones y de datos de 32Kb. • Mini-caché de datos 2Kb. • Unidades de gestión de memoria para instrucciones y para datos.(IMMU y DMMU). • Buffer de escritura. (WB)
IMMU y DMMU • Realizan la translación de direcciones lógica a física. • Gestionan los permisos de acceso a memoria. • Constan de buffers de 32 entradas asociativas (ITLB y DTLB). • Política de reemplazo Round-Robin.
IMMU y DMMU 2 • Si una instrucción o dato no se encuentra en su buffer ITLB o DTLB, se invoca un algoritmo basado en tabla. • Estas dos unidades pueden ser habilitadas o deshabilitadas conjuntamente.
Caché de Instrucciones • Permite acceder a la velocidad del núcleo a las instrucciones. • Caché asociativa de 32 conjuntos / 32 vías. • Cada vía contiene: • Una dirección. • Una línea de caché (8 palabras de 32 bits) • Bits de paridad y validez.
Caché de Datos • Estructura idéntica a la caché de instrucciones.(32 conjuntos 32 vías) • Funcionamiento conjunto con 2 buffers de carga y de pendientes: • Se pretende traer datos a la caché antes que se produzca una falta. • Escritura utilizando Buffer de Escritura.
Mini caché de datos • Diseñada para contener flujos de datos que cambian constantemente.(MPEG) • Trata de evitar la paginación causada en la caché de datos por el constante cambio de datos. • 32 conjuntos / 2 vías.
Buffers FB y PB • Ambos trabajan con la DMMU. • Poseen 4 entradas. • El buffer FB trabaja con el núcleo para manejar datos no cacheables. • El buffer PB trata de evitar las faltas de datos. • Su misión es evitar que el núcleo se atasque esperando los datos de memoria.
Buffer de escritura • 8 entradas de 16 bytes cada una. • Puede ser utilizado directamente por: • El núcleo. • La caché de datos. • La mini caché. • Tecnología de escritura en bloque
Tecnología de escritura en bloque del buffer de escritura WB
Optimización de aplicaciones • Como mejorar el rendimiento: • Utilizando el sistema de memoria. • A través de las primitivas de Intel IPP.
Estructura de la caché • Rendimiento de nuestra aplicación condicionado fuertemente por: • Impacto de las funciones Inline. • La alineación de datos.
Impacto de funciones Inline • Utilizamos funciones inline dentro de bucles largos para evitar sobrecarga de la llamada. • El aumento del tamaño de código puede causar que no quepa en la caché. • Solución: • Generar un archivo de mapa del binario para saber si cabe en caché nuestra función.
Alineación de datos • Hemos de tratar de alinear las estructuras de datos en bloques de 32 bytes. • Ejemplo typedef struct { long x; // suponemos que long son 4 bytes long y; long z; long t; long color; } point_t; // estructura que representa un punto point_t my_pt;
Alineación de datos - 2 • Si no alineamos los datos:
Alineación de datos - 3 • Alinear los datos depende del compilador. • Para el compilador de Microsoft: __declspec(align(32)) struct foo { long a, b, c, d; };
Uso de la escritura en bloques • A la hora de la escritura podemos escribir en bloques para optimizar el rendimiento. • Ejemplo: // bucle original // No utiliza la ventaja que proporciona // write coalescing for(int X=0;X<cCoord.rRadius;X++) for(int Y=0;Y<cCoord.rRadius;Y++) *(TempBuff)++ = PixelCol;
Uso de la escritura en bloques - 2 • Haciendo uso de la escritura en bloques: • Desenrollamos 4 iteraciones del bucle. // optimizado para tomar ventaja de write coalescing for(int X=0;X<(cCoord.rRadius);X++) { for(int Y=0;Y<(cCoord.rRadius)/4;Y++) { *(TempBuff)++ = PixelCol; *(TempBuff)++ = PixelCol; *(TempBuff)++ = PixelCol; *(TempBuff)++ = PixelCol; } }
Primitivas de Intel IPP v 5.1 • Proveen funcionalidad diversa y optimizada:
IPP - 2 • Soporte para los procesadores actuales
IPP - 3 • Soporte para los sistemas operativos: • Windows ME, 2000, XP, Server 2003 • Linux. • Mac OS. 10.4.3 • Soporte para los procesadores: • Pentium 4 en adelante. • Xscale a partir del modelo PXA27x. • Xscale IPX4xx en adelante.
Aplicación propuesta • Aplicación que dibuja en pantalla círculos de radio y posición aleatoria.
Aplicación propuesta • Código de la rutina principal void DibujaCirculo(unsigned short *buffer,int x,int y,int radio,COLORREF rGB) { float rad=0; int X,Y; while (rad <= 2*M_PI){ X = (int) (radio * cos(rad)); Y = (int) (radio * sin(rad)); PlotPixel(buffer, X +x, Y+y,rGB); rad += (float)0.005; } El cálculo del seno y del coseno pretendo que sea un cuello de botella Para dibujar un círculo hemos de calcular 1256 senos y cosenos.
Optimización utilizando IPP • Si usamos las primitivas de Intel, el código es el siguiente: void DibujaCirculo(unsigned short *buffer,int x,int y,int radio,COLORREF rGB) { float rad=0,ret=0; int X,Y; while (rad <= CPI){ gppCosHP_16_32s (rad, &ret); X = gppRound_Fixed_16_To_Int(ret * radio); gppSinHP_16_32s (rad, &ret); Y = gppRound_Fixed_16_To_Int(ret * radio); PlotPixel(buffer, X +x, Y+y,rGB); rad += (float)0.005; } Reescribimos sólo 4 líneas de código que se corresponden con el cálculo del seno y coseno
Una última optimización • Utilizar escritura en bloque WB: • Podemos aumentar el rendimiento si escribimos de 4 en 4 píxeles. • Problema: • Para realizar la escritura en bloque, hemos de asegurarnos que las cuatro escrituras son consecutivas. Tenemos que integrar la función que dibuja un píxel con nuestra rutina
Una última optimización • Escribimos 11 líneas de código para una ganancia en velocidad de 20 ms.
Conclusiones • Podemos optimizar aplicaciones sin utilizar el ensamblador: • Utilizando las primitivas de Intel IPP. • Conociendo la arquitectura: • Usando el buffer de escritura. • Precargando los datos en la caché. • Alineando nuestras estructuras en memoria.
Conclusiones - 2 • Si queremos optimizar una aplicación sin aumentar el tiempo de desarrollo: • Utilizando las primitivas de Intel, he incrementado el rendimiento en 12 veces. • Modificamos 4 instrucciones frente 558 que consta nuestro programa.