Multimedia - Departamento de Arquitectura y Tecnología de
Transcripción
Multimedia - Departamento de Arquitectura y Tecnología de
TEMA 2: ARQUITECTURAS MULTIMEDIA. • Título “publicitario”. Más correcto: Arquitecturas para paralelismo de datos. • Origen: Arquitecturas Vectoriales. Problemas científico-técnicos: Expresión en vectores/matrices -> igual operación sobre múltiples elementos. • Procesador Vectorial: Registros e Instrucciones Vectoriales -> Múltiples datos por registros (ej. 256 doubles) e instrucciones que operan sobre registros completos. Ej. DAXPY: ldv Ldv Multv Addv Stv vx,(rx) vy,(ry) vx,va,vx vx,vx,vy (ry),vx • Análisis: o Las unidades funcionales vectoriales cuando transcurre su latencia proporcionan un dato/ciclo. o Una unidad func. empieza a operar en cuento dispone del primer dato (encadenamiento) o El secuenciamiento es estático. o Se permiten varias accesos simultáneos a distintas posiciones de memoria. o Suposiciones: Latencias c- carga s- suma p- producto a- almacenamiento. Nº elementos = n o Resultado: Duración= Latencia + n. o En la tabla se da el último ciclo de cada fase. Arquitectura y Tecnología de Computadores. Univ. Sevilla. . ASP2: TEMA 2: ArquitecturasMultimedia : pág 1 Ldv Ldv Multv Adv. Stv IF 1 2 3 3+c 3+c+p ID 2 3 3+c 3+c+p 3+c+p+s LAT 2+c 3+c 3+c+p 3+c+p+s 3+c+p+s+a DATOS 2+c+n 3+c+n 3+c+p+n 3+c+p+s+n 3+c+p+s+a+n Multimedia • Similar a vectorial pero: o Registros con menor número de elementos (de 2 a 16) o Diferentes tipos de datos (int, float, double…) o Operaciones realizadas sobre todo un registro a la vez (habitualmente) -> La temporización se obtiene de forma análoga a los escalares pero teniendo en cuenta el número de iteraciones menor. • DLX MM. Basado en SSE/SSE2 de Intel. Similar a otras arquitecturas multimedia. Arquitectura y Tecnología de Computadores. Univ. Sevilla. . ASP2: TEMA 2: ArquitecturasMultimedia : pág 2 • Modelo de registros: M0 Float3 … M7 Para double: M0 … M7 Float2 Float1 Float0 o Existen operaciones que operan sobre el registro entero y sobre su parte menos significativa. o Emplearemos una notación similar a la de Intel para SSE/SSE2 pero con 3 operandos (DLX). o Para instrucciones que operan sobre todos los elementos de un registro multimedia: Insp{s|d|e} MMd,MMs1,MMs2 La p indica que la instrucción opera sobre múltiples datos empaquetados en un solo registro. Las instrucciones que operan sobre 4 flotantes de simple precisión incluyen el identificador de datos p, las que operan sobre datos de doble precisión incluyen el identificador de datos d y las que operan sobre datos enteros (no existen en SSE) incluyen el identificador de datos e. • Las instrucciones que operan sobre un único dato en la parte menos significativa del registro sustituyen la p (packed) por s (scalar). Arquitectura y Tecnología de Computadores. Univ. Sevilla. . ASP2: TEMA 2: ArquitecturasMultimedia : pág 3 Tipos de Instrucciones Aritméticas • Similares a las existentes en modo escalar. Emplearemos notación vectorial C para los registros Multimedia. Con esta notación si MM0={1.0,2.0,3.0,4.0}, 1.0 estaría en la componente 0 ( la más baja) del registro. • Multiplicación: mul{p|s}{s|d|e} MMd,MMs1,MMs2. ej: Mulps MM0,MM1,MM2 Si MM2={1.0,2.0,3.0,4.0} y MM1={0.5,-1.0,-1.0,0.25} tendríamos: MM0={0.5,-2.0,-3.0,1.0} • División: div{p|s}{s|d|e} MMd,MMs1,MMs2. ej: divpd MM0,MM1,MM2 Si MM2={1.0, 4.0}, MM1={0.5,8.0} MM0={1.0,5.0} tendríamos: MM0={0.5,2.0} • Suma: add{p|s}{s|d|e} MMd,MMs1,MMs2. ej: addss MM0,MM1,MM2 Si MM2={1.0,2.0,3.0,4.0}, MM1={0.5,-1.0,-1.0,0.25} MM0={1.0,2.0,3.0,4.0} tendríamos: MM0={1.5,2.0,3.0,4.0} • Resta: sub{p|s}{s|d|e} MMd,MMs1,MMs2. ej: subsd MM0,MM1,MM2 Si MM2={1.0, 4.0}, MM1={0.5,8.0} MM0={1.0,2.0} tendríamos: MM0={-0.5,2.0} Lógicas • Son operaciones entre registros bit a bit. Solo existen en versión de registro completo (p) y aunque puede indicarse el tipo de dato {s|d|e} en realidad corresponden a la misma instrucción (opcode) para los 3 tipos de datos. Arquitectura y Tecnología de Computadores. Univ. Sevilla. . ASP2: TEMA 2: ArquitecturasMultimedia : pág 4 • And: andp{s|d|e} MMd,MMs1,MMs2. ej: andps MM0,MM1,MM2 Si MM2={0xEFFFFFFF, 0xEFFFFFFF,xEFFFFFFF, 0xEFFFFFFF } y MM1={0.5,-1.0,-1.0,0.25} tendríamos: MM0={0.5,1.0,1.0,0.25} //Reacuérdese que el bit más significativo es el signo en float. • Or: orp{s|d|e} MMd,MMs1,MMs2. ej: orps MM0,MM1,MM2 Si MM2={0x80000000, 0x80000000, 0x80000000, 0x80000000} y MM1={0.5,-1.0,-1.0,0.25} tendríamos: MM0={-0.5,-1.0,-1.0,-0.25}. // Este ejemplo calcula el valor absoluto cambiado de signo. • Xor: xorp{s|d|e} MMd,MMs1,MMs2. ej: xorps MM0,MM1,MM2 Si MM2={0x80000000, 0x80000000, 0x80000000, 0x80000000} y MM1={0.5,-1.0,-1.0,0.25} tendríamos: MM0={-0.5,1.0,1.0,-0.25}. //Este ejemplo cambia el signo. Comparaciones • Estas operaciones son muy similares a las instrucciones de comparación del dlx (scc Rd,Rs1,Rs2). Emplearemos la terminología SSE denominándolas cmp{gt|ge|eq|le|lt|ne}{s|p}{s|d|e}. • Estas instrucciones realizan la comparación componente a componente de los registros fuente. Si la condición de comparación no se cumple la componente correspondiente del registro destino se pone a valor 0. Si la condición se cumple todos los bits de la componente correspondiente del registro destino se ponen a 1. Ejemplo: cmpgeps MM0,MM1,MM2. Si MM2={1.0,2.0,3.0,4.0 } y MM1={0.5,10.0,-1.0,25.0} tendríamos: MM0={0,0xEFFFFFFF,0, 0xEFFFFFFF } • Las instrucciones de comparación serán la base del procesado condicional en los procesadores con extensiones multimedia. Este tema se estudiará en un apartado posterior. Arquitectura y Tecnología de Computadores. Univ. Sevilla. . ASP2: TEMA 2: ArquitecturasMultimedia : pág 5 Instrucciones de Movimiento de Datos básicas. • En el caso de las instrucciones de carga y almacenamiento. Existen versiones vectoriales (p) y escalares (s). Las versiones vectoriales ldmps{s|d|e} corresponden en realidad a una sola instrucción que transfiere 16 bytes desde memoria a registro. Las versiones vectoriales stmps{s|d|e} corresponden en realidad a una sola instrucción que transfiere 16 bytes desde registro a memoria. Los modos de direccionamiento suelen ser análogos a los de las instrucciones escalares. • Las versiones escalares de las instrucciones de carga y almacenamiento transfieren 4 bytes en el caso de operandos s o e y 8 bytes en el caso de operandos de doble precisión. • Además de las instrucciones de carga y almacenamiento existen las instrucciones de barajado que permiten seleccionar cada componente de un registro destino entre todas las de un registro fuente. El formato de estas instrucciones es shufp{s|d|e} MMd,MMd, selector. El selector es una constante de 8 bits agrupados en 4 parejas. Cada pareja nos indica que componente del registro fuente se situara en la componente correspondiente del registro destino. Ej. Shufps MM1,MM2,%00011011. En este caso el selector debe leerse como 00|01|10|11 o, en decimal, 0|1|2|3. La componente menos significativa del selector nos indica de donde obtendremos la componente menos significativa del registro destino. En este ejemplo la componente 2 (la más significativa se carga con la componente 0, la 2 con la 1, la 1 con la 2 y la 0 con la 3. Así si MM2={0.5,10.0,-1.0,25.0} tendríamos MM1={25.0,-1.0,10.0,0.5}. • Un uso común de la instrucción shufps es replicar la componente menos significativa en todas las componentes de un registro. Esto nos es necesario para multiplicar un vector por un escalar dado que no existen instrucciones de multiplicación de escalar por vector en la mayoría de procesadores MM. Para replicar la componente 0 de MM0 en todas sus componentes usamos la instrucción shufps MM0,MM0,0 Arquitectura y Tecnología de Computadores. Univ. Sevilla. . ASP2: TEMA 2: ArquitecturasMultimedia : pág 6 • Ejemplo completo: bucle SAXPY. R4 señala al vector x, R1 señala al vector y, R2 señala el final del vector x, R3 señala a la constante a. Ldmss MM2,(R3) //Carga a en la componente baja de MM2 Shufps MM2,MM2,0 //Replica a en todas las componentes de MM2 Saxpy: ldmps MM0,(R4) //Carga 4 componentes de x en MM0 Ldmps MM1,(R1) //Carga 4 componentes de y en MM1 Mulps MM0,MM0,MM2 //multiplica las componentes de x por a Addps MM0,MM0,MM1 //y+a*x Stmps (R1),MM0 //almacena y Addi R1,R1,16 Addi R4,R0,16 //Actualiza punteros Seq R5,R0,R2 //Fin de x? Beqz R5,Saxpy //si no hemos acabado seguimos Procesado Condicional • Cuando empleamos instrucciones multimedia no es posible implementar las estructuras if mediante saltos dado que diferentes componentes del registro pueden satisfacer o no las condiciones. Esto implica que las estructuras if deben implementarse transformando las dependencias de control en dependencias de datos utilizando, para ello, las instrucciones lógicas y las instrucciones de comparación. • El método para realizar esta transformación lo explicaremos mediante un ejemplo: Supongamos el código: Arquitectura y Tecnología de Computadores. Univ. Sevilla. . ASP2: TEMA 2: ArquitecturasMultimedia : pág 7 int i;float x[10000],y[10000]; for(i=0;i<10000;i++) if (x[i]>0) x[i]=x[i]+y[i]; else x[i]=x[i]-y[i]; • En este caso debemos crear una mascara correspondiente al resultado de la comparación x[i]>0 y otra correspondiente a la condición opuesta. Calculamos x[i] correspondiente a que se cumpla la condición if y le hacemos and con la mascara correspondiente al cumplimiento de la citada condición. Calculamos x[i] correspondiente a que se cumpla la condición else y le hacemos and con la mascara correspondiente al cumplimiento de la citada condición. Hacemos or con los valores obtenidos de las dos operaciones and (cada uno de ellos contiene ceros donde el otro contiene valores). Este valor es el que debemos almacenar. • Este procedimiento se muestra en la figura siguiente. • Obtener mascara Condición cierta Obtener mascara Condición falsa Evaluar x para condición cierta Evaluar x para condición falsa And x cierta con mascara cierta And x falsa con mascara falsa Or x cierta con x falsa para x a almacenar. Arquitectura y Tecnología de Computadores. Univ. Sevilla. . ASP2: TEMA 2: ArquitecturasMultimedia : pág 8 El código suponiendo que R4 señala al vector x, R1 al vector y y R2 al final del vector x sería el siguiente: Bucle: cmpneps ldmps Ldmps Cmpgtps Cmpleps Addps Subps Andps Andps Orps Stmps Addi Addi Seq Beqz MM0,MM0,MM0 //Pone MM0 a 0 MM1,(R4) //Carga 4 comp. de x. MM4,(R1) // Carga 4 comp. de y. MM2,MM1,MM0 //MM2 mascara cond. cierta. MM3,MM1,MM0 //MM3 mascara cond. falsa MM5,MM0,MM4 //MM5 contiene x+y MM6,MM0,MM4 //MM6 contiene x-y MM5,MM2,MM5 //and cond. Cierta. MM6.MM3,MM6 //and cond. Falsa MM5,MM5,MM6 //Resultado a almacenar. (R4),MM5 R4,R4,16 R1,R1,16 R3,R4,R2 R3,Bucle Arquitectura y Tecnología de Computadores. Univ. Sevilla. . ASP2: TEMA 2: ArquitecturasMultimedia : pág 9 Instrucciones de Carga y Almacenamiento específicas. • Además de las instrucciones ldm{s|p}{s|d|e} y stm{s|p}{s|d|e} que básicamente se comportan como instrucciones ld/st estándar la mayoría de procesadores con extensiones multimedia implementan algunas instrucciones de carga y almacenamiento específicas para intentar aprovechar algunas peculiaridades de las aplicaciones multimedia. • En lo que respecta al almacenamiento muchas aplicaciones multimedia calculan datos que no vuelven a reutilizarse hasta al cabo de un número grande de ciclos de reloj. Así, por ejemplo, en el código C: double x[1000],y[1000],z[1000];int i; for(i=0;i<1000;i++) z[i]=x[i]+y[i]; Si tenemos un cache de datos de primer nivel de 8KB y los vectores x e y (o al menos la mayoría de sus componentes) ya estaban previamente en el cache debido a un bucle anterior si utilizamos instrucciones stmpd para almacenar las componentes de z, estas expulsaran a componentes de x e y del cache empeorando notablemente el tiempo de ejecución de la aplicación. En general cuando una aplicación multimedia escriba un dato, que no vaya a ser utilizado en el futuro próximo no conviene escribirlo en el cache. La excepción ocurriría si el dato que vamos a escribir ya está en el cache ya que en este caso, evidentemente, hemos de actualizarlo allí. La solución empleada habitualmente en los procesadores con extensiones multimedia es el empleo de instrucciones de almacenamiento no temporal que emplean una política de escritura en cache no write allocate que, a diferencia de la política habitual write allocate, en el caso de un fallo de cache en escritura escribe la componente ha almacenar directamente en memoria. Arquitectura y Tecnología de Computadores. Univ. Sevilla. . ASP2: TEMA 2: ArquitecturasMultimedia : pág 10 Nótese que, almacenemos con instrucciones de almacenamiento no temporal, componentes que están en el cache, el comportamiento será idéntico a las instrucciones de almacenamiento convencionales. Así, por ejemplo, para el código: double x[1000],y[1000];int i; for(i=0;i<1000;i++) x[i]=x[i]+y[i]; Cuando vayamos a escribir x la encontraremos en el cache pues ha sido cargada previamente por una instrucción ldmpd. En este caso al acertar en el cache la instrucción de almacenamiento no temporal tendrá el comportamiento habitual de un stmpd. En las extensión multimedia propuesta la instrucción de almacenamiento no temporal sería stnt{s|p}{s|d|e}. • En el caso de las instrucciones de carga, en las aplicaciones multimedia es habitual que los próximos datos que necesitemos no sean los últimos a los que hemos accedido. Muchas veces el programador es el que mejor conoce que datos necesitará en el futuro. Por ello, en muchos casos, conviene emplear instrucciones para llevar datos al cache y así asegurar que las cargas posteriores acertarán en el mismo Una técnica tradicional en procesadores RISC consiste en emplear instrucciones del tipo (recordar que R0 no puede escribirse pues vale siempre 0) para traer datos al cache. El inconveniente de este tipo de instrucciones es que pueden generar excepciones (fallos de página, accesos a zonas protegidas) no deseadas. Arquitectura y Tecnología de Computadores. Univ. Sevilla. . ASP2: TEMA 2: ArquitecturasMultimedia : pág 11 Para evitar el problema de las excepciones los procesadores con extensiones multimedia suelen implementar instrucciones de precarga. Estas son equivalentes a ld R0,(Rx) pero no provocan excepciones. Si el acceso provocara excepciones no se realizaría. Más tarde cuando el procesador ejecute la instrucción de carga se realizará realmente el acceso a memoria y se serviran las excepciones si se producen. Temporización con Instrucciones Multimedia. • A diferencia del caso vectorial las instrucciones multimedia se comportan como instrucciones habituales de un procesador convencional no existiendo ninguna diferencia importante en el cálculo del tiempo de ejecución de un programa. Las únicas diferencias estarían en el cálculo del rendimiento en MFLOPs en cuyo caso hay que tener en cuenta que las operaciones mulps, addps, etc realizan 4 operaciones en coma flotante mientras mulpd, addps, etc. realizan 2. Normalmente las comparaciones y operaciones lógicas no se tienen en cuenta en el cálculo del rendimiento en MFLOPs. • Para aclarar el tema proponemos el siguiente ejemplo: float x[1000],y[1000];int i; for(i=0;i<1000;i++) if(x[i]<y[i]) x[i]=x[i]+y[i]; • Supongamos que tenemos un procesador superescalar de grado 3, que emplea el algoritmo de Tomasulo y especulación hardware con buffer de reordenación. Tiene ventana deslizante y las siguientes restricciones de emisión: Tubería 1: Cualquier instrucción. Tubería 2: Cualquier instrucción de distinto tipo que la emitida en la tubería 1. Arquitectura y Tecnología de Computadores. Univ. Sevilla. . ASP2: TEMA 2: ArquitecturasMultimedia : pág 12 Tubería 3: Cualquier instrucción de distinto tipo que las emitidas en tub1 y tub2. Si una instrucción es un salto no puede emitirse ninguna instrucción posterior conjuntamente con ella • Pueden finalizar (fase C) 3 instrucciones/ciclo. • Las estaciones de reserva, entradas de buffer de reordenación y buses comunes de resultados existen en número suficiente para no originar bloqueos. • Consideramos que los tipos de instrucción son: entera, ld/st, salto, fp y multimedia. Las cargas y almacenamientos MM se consideran ld/st. El código sería (R1 apunta x, R2 a y, R3 fin de x): bucle: ldmps MM0,(R1) //x -1 ldmps MM1,(R2) //y -2 cmpltps MM2,MM0,MM1 //MM2 mascara cierta -3 cmpgeps MM3,MM0,MM1 //MM3 mascara falsa -4 addps MM4,MM0,MM1 //Resultado cierto. El resultado falso es MM0. -5 andps MM4,MM4,MM2 //and cierto. -6 andps MM0,MM0,MM3 //and falso -7 orps MM0,MM0,MM4 //resultado -8 stmps (R1),MM0 //almaceno resultado en x -9 addi R1,16 //10 addi R2,16 //11 seq R4,R1,R3 //12 beqz R4,bucle //13 Arquitectura y Tecnología de Computadores. Univ. Sevilla. . ASP2: TEMA 2: ArquitecturasMultimedia : pág 13 • Las instrucciones están numeradas en los comentarios. La temporización vendría dada por la siguiente tabla: Ins IS E W C 1 1 2-3 4 5 2 2 3-4 5 6 3 2 5-8 9 10 4 3 6-9 10 11 5 4 7-10 11 12 6 5 12-15 16 17 7 6 13-16 17 18 8 7 18-21 22 23 9 7 23-24 25 26 10 7 8 9 26 11 8 9 10 26 12 9 10 11 27 13 9 12 13 27 1 10 11-12 13 27 • Suponiendo que las emisiones se producen de forma análoga en la segunda iteración (no hay razón para que sea distinta dado que no la única causa que evita la emisión son las restricciones a la misma) el tiempo por iteración es de 10 ciclos. Arquitectura y Tecnología de Computadores. Univ. Sevilla. . ASP2: TEMA 2: ArquitecturasMultimedia : pág 14 • El IPC sería 13/10=1.3 • El rendimiento en MFlops vendría dado por: nºOperacionesFP/tiempo(en µs)= =Operaciones_FP_por_iteración/tiempo_iteración(en µs)= =(Operaciones_FP_por_iteración/ciclos_iteración)*F(en MHz)= = 8/10*1000=800MFlops • Tengase en cuenta que solo consideramos las operciones aritméticas (+,-,*,/) como Fops. Consideraciones Adicionales • ¿Qué ocurre si existe else? Ejemplo: float x[1000],y[1000];int i; for(i=0;i<1000;i++) if(x[i]<y[i]) x[i]=x[i]+y[i];else x[i]=x[i]-y[i]; • Aquí el resultado falso sería x[i]-y[i] en lugar de x[i]. Añadiríamos la instrucción para calcular dicho resultado. El código quedaría como: Arquitectura y Tecnología de Computadores. Univ. Sevilla. . ASP2: TEMA 2: ArquitecturasMultimedia : pág 15 bucle: ldmps MM0,(R1) //x ldmps MM1,(R2) //y cmpltps MM2,MM0,MM1 //MM2 mascara cierta cmpgeps MM3,MM0,MM1 //MM3 mascara falsa addps MM4,MM0,MM1 //Resultado cierto. Subps MM5,MM0,MM1 //Resultado falso. andps MM4,MM4,MM2 //and cierto. andps MM0,MM5,MM3 //and falso orps MM0,MM0,MM4 //resultado stmps (R1),MM0 //almaceno resultado en x addi R1,16 // addi R2,16 // seq R4,R1,R3 // beqz R4,bucle // • ¿Qué ocurre si el else guarda el resultado en una variable distinta? Ejemplo: float x[1000],y[1000];int i; for(i=0;i<1000;i++) if(x[i]<y[i]) x[i]=x[i]+y[i];else y[i]=x[i]-y[i]; • A efectos prácticos existen dos resultados uno que se guarda en x[i] y otro en y[i]. El código sería equivalente a: Arquitectura y Tecnología de Computadores. Univ. Sevilla. . ASP2: TEMA 2: ArquitecturasMultimedia : pág 16 float x[1000],y[1000];int i; for(i=0;i<1000;i++) if(x[i]<y[i]) {x[i]=x[i]+y[i];y[i]=y[i]} else {x[i]=x[i];y[i]=x[i]-y[i];} • Hemos de calcular los resultados falsos y ciertos para x y para y. • El código quedaría como: Arquitectura y Tecnología de Computadores. Univ. Sevilla. . ASP2: TEMA 2: ArquitecturasMultimedia : pág 17 bucle: ldmps MM0,(R1) //x ldmps MM1,(R2) //y cmpltps MM2,MM0,MM1 //MM2 mascara cierta cmpgeps MM3,MM0,MM1 //MM3 mascara falsa addps MM4,MM0,MM1 //Resultado cierto x. Falso x en MM0 Subps MM5,MM0,MM1 //Resultado falso y. Cierto y en MM1 andps MM4,MM4,MM2 //and cierto y andps MM0,MM0,MM3 //and falso x orps MM0,MM0,MM4 //resultado x stmps (R1),MM0 //almaceno resultado en x andps MM4,MM1,MM2 //and cierto y andps MM0,MM5,MM3 //and falso y orps MM0,MM0,MM4 //resultado y stmps (R2),MM0 //almaceno resultado en y addi R1,16 // addi R2,16 // seq R4,R1,R3 // beqz R4,bucle // • Esta misma técnica puede aplicarse cuando se calculan múltiples variables en el if y/o en el else. Arquitectura y Tecnología de Computadores. Univ. Sevilla. . ASP2: TEMA 2: ArquitecturasMultimedia : pág 18 Arquitectura y Tecnología de Computadores. Univ. Sevilla. . ASP2: TEMA 2: ArquitecturasMultimedia : pág 19