ARQUITECTURA DE COMPUTADORES -1 ALGORITMOS Y PROCESADORES ARITMETICOS TEMA 1 - INTRODUCCIÓN Definición y descripción de un procesador aritmético (PA) Niveles de representación funcional de un PA Sistemas de representación de números Tipos de sistemas de numeración Representación de vectores de dígitos como vectores de bits TEMA 2 – NUMEROS NATURALES Representación de números naturales Algoritmo aritmético de suma Implementación de la suma TEMA 3 - NÚMEROS ENTEROS Mapeo directo vs mapeo indirecto Teoría de los sistemas complementados Representación de enteros en signo y magnitud Representación de enteros en exceso o polarizado Resumen TEMA 4 – ACELERACIÓN DE LA SUMA Generación y propagación del acarreo CSA. Carry Save Adder CLA. Carry Lookahead Adder (transparencias grupo 10) TEMA 5 – OTRAS OPERACIONES Extensión de rango Desplazamientos aritméticos TEMA 6 – ALGORITMOS PARA MULTIPLICAR NATURALES Multiplicación secuencial Acceleración de la multiplicación secuencial Algoritmos paralelos para la multiplicación (Arrays) TEMA 7 – MULTIPLICACIÓN DE ENTEROS EN C’2 Multiplicación secuencial Algoritmos paralelos para multiplicaciones en C’2 (arrays) TEMA 8 – REPRESENTACIÓN Y OPERACIONES CON REALES Representación de números reales Representación punto flotante IEEE 754 Multiplicación en punto flotante Suma/resta en punto flotante ALGORITMOS Y PROCESADORES ARITMETICOS TEMA 1 - INTRODUCCIÓN DEFINICIÓN Y DESCRIPCIÓN DE UN PROCESADOR ARITMÉTICO (PA) Un procesador aritmético (PA) es un circuito que realiza operaciones. Los operandos pueden ser Operandos P.A. Resultados naturales, enteros y reales. Y pueden haber Operaciones un solo operando o varios, y estos se caracterizan por la representación y el inicio final rango de estos, el cual es siempre finito. Esquema de un procesador aritmético Las operaciones pueden ser una sola o varias en cuyo caso el PA pasa a llamarse ALU. El resultado puede ser un número, una variable lógica (resultado de una comparación) o excepciones (overflow, dividir por cero, etc.). NIVELES DE REPRESENTACIÓN FUNCIONAL DE UN PA Nosotros veremos un PA desde tres puntos diferentes de vista: · Nivel abstracto: se ve como un nivel de matemáticas, es decir las operaciones son como funciones. Este nivel nos lleva desde el número concreto a una representación de este. · Nivel algoritmo: la operación a realizar trabajará sobre la representación obtenida del número en el nivel abstracto. El número se considera como un vector de dígitos. Por lo tanto para hacer una operación primero se representará el número mediante el nivel abstracto, una vez obtenido el vector de dígitos se realiza la operación y al resultado se le realiza el nivel abstracto en sentido contrario. · Nivel implementación: la implementación se hace en binario. Zn Bk SISTEMAS DE REPRESENTACIÓN DE NÚMEROS Consideramos: X=(Xn-1, Xn-2, ....., X1, X0) Y representamos el número como x y como X el vector de dígitos, los componentes de un sistema numérico son: - Di: que es el conjunto de valores que puede tomar un dígito. XiDi. - Reglas de interpretación: f(X)=x. n 1 Ej.: decimal= x= X i ·10 i i0 El rango de un sistema de representación es el conjunto de valores que depende de Di y del número de dígitos. |Di|n conjunto de valores TIPOS DE SISTEMAS DE NUMERACIÓN Tenemos diferentes tipos de clasificación de los sistemas: - Redundantes: un mismo número puede estar representado de varias formas. - No redundante: un conjunto de dígitos representa un único valor. - No ponderados: los números romanos. - Ponderados o posicionales: el valor del dígito depende no solo del mismo sino también de la posición que ocupa. La regla de interpretación para estos sistemas es la siguiente: AC - 2 n 1 x= X i ·w i Donde w es el vector de pesos i0 El vector de pesos puede ser de dos tipos: · De base mixta: donde necesitamos del vector de bases para calcular el vector de pesos. Y para calcular el vector de pesos se sigue las siguientes reglas. Vector de bases R = (Rn-1, Rn-2, ...., R1, R0) w0=1, wi=wi-1·Ri-1 Ejemplo: sistema horario: R=(24h, 60 min, 60 s) W=(3600, 60, 1) · De base fija: donde el vector de bases es siempre el mismo R = (r, r, ..., r) y la regla de interpretación queda de la siguiente forma: n 1 wi=ri x= X i ·r i i0 - Canónicos: donde Di={0, 1, ...., | r |-1} por ejemplo el caso decimal. - No canónicos: por ejemplo Di = (-5, -4, -3, -2, -1, 0, 1, 2, 3, 4) = (5,4,3,2,1, 0, 1, 2, 3, 4) Ejemplo: Suponemos que tenemos Di=(1, 0, 1) en un sistema ponderado, no canónico y de base fija dos que números decimales representan estos números: 1101= 1·20+0·21+1·22+1·23=13 1111= -1·20+1·21+1·22+1·23=13 REPRESENTACIÓN DE VECTORES DE DÍGITOS COMO VECTORES DE BITS Para saber cuantas cifras necesitamos para representar, en binario, se sigue la siguiente formula: n 1 Xn-1 Xn-2 X1 X0 x= X i ·r i i0 k =log2|Di| k= es el número de bits necesarios para representar dicho dígito. La codificación BCD es la codificación del decimal en binario pero esta desaprovecha dígitos. Decimal: 1 digito ------ 10 valores 2 dígitos ------ 100 valores Binario: 16 valores 256 valores k 1 Xi = X i j ·2 j esta es la formula para saber que numero decimal es codificado en binario. j0 TEMA 2 – NUMEROS NATURALES REPRESENTACIÓN DE NÚMEROS NATURALES La representación utiliza un sistema ponderado, canónico y de base positiva y por lo tanto es un sistema no redundante. Sea X=(Xn-1, Xn-2, ...., X1, X0) la regla de interpretación es: n 1 x= X i ·r i i0 y en nuestro sistema tenemos que: - Di={0, 1, ....., r-1} - r>0 - Y el rango es 0 x rn-1 AC - 3 ALGORITMO ARITMÉTICO DE SUMA Suponemos que tenemos dos números naturales x e y, y queremos saber la suma (s) de estos dos. Sabemos que: n 1 n 1 y= Y j ·r x= X i ·r i n 1 j j0 i0 s= X k ·r k k 0 Y que el rango de los valores x e y son: x r -1. y rn-1. Por lo tanto el rango del resultado será: x + y 2·(rn-1) rn+1-1. De este valor obtenemos que para representar el resultado necesitaremos como mucho n+1 dígitos en cualquier base. Se necesitan n+1 dígitos y no n debido al posible acarreo que se pueda producir al sumar. X=Xn-1rn-1+Xn-2rn-2+..........+X1r+X0 Y=Yn-1rn-1+Yn-2rn-2+..........+Y1r+Y0 S =Sn-1rn-1+ Sn-2rn-2+..........+S1r+ S0 If Xi+Yi<r then Si=Xi+Yi Else ...+ (Xi+1+Yi+1)ri+1+(Xi+Yi)ri+... ...+ (Xi+1+Yi+1)ri+1+(Xi+Yi+r-r)ri+... ...+ (Xi+1+Yi+1)ri+1+ri+1+(Xi+Yi-r)ri+... ...+ (Xi+1+Yi+1+1)+ri+1+(Xi+Yi-r)ri+... endif Con esta demostración de cómo se suma el algoritmo definitivo queda como sigue (siendo Ci el acarreo): C0=Cin For i=0 to n-1 do If Xi+Yi+Ci < r then Si=Xi+Yi+Ci; Ci+1=0; Else Si=Xi+Yi+Ci-r; Ci+1=1; Endif Endfor Cout=Cn Si al final de todo el bucle tenemos que Cout es igual a 1 entonces diremos que se ha producido un overflow o una irrepresentabilidad, es decir, que no podemos representar dicho número. n IMPLEMENTACIÓN DE LA SUMA IMPLEMENTACIÓN DE UN FULL ADDER (FA) A 3 NIVELES Un full adder es un modulo que suma un solo bit de forma completa, es decir, puede sumar el acarreo anterior y dar el que se pueda producir. C0=Cin For i=0 to n-1 do Calculo de Si y Ci+1 en función de Xi, Yi y Ci Endfor Cout=Cn Xi Yi Ci FA Ci+1 Si Esquema de un Full Adder AC - 4 Si r=2 la tabla de verdad y los mapas de Karnaugh quedan como sigue: Xi Yi Ci Ci+1 Si YiCi YiCi 0 0 0 0 0 00 01 11 10 00 01 11 10 X X i i 0 0 1 0 1 0 0 0 1 0 0 0 1 0 1 0 1 0 0 1 1 0 1 1 1 1 1 0 1 0 0 1 1 1 0 Ci+1=XiCi+XiYi+YiCi Si=XiYiCi+XiYiCi+XiYiCi+XiYiCi 1 0 0 0 1 3 AND + 1 OR 1 0 1 1 0 4 AND + 1 OR 1 1 0 1 0 Si también es el resultado de un O exclusiva 1 1 1 1 1 (da uno con un número impar de unos – Por lo tanto para Si ab=ab+ab-) necesitaríamos una X-OR de tres S=XYC entradas pero como no existen utilizaremos dos X-OR, quedando la implementación como muestra el siguiente esquema: Xi Yi Ci Ci+1 6 puertas Suponiendo el tiempo de una puerta tenemos que: Ci+1=2 Si=2 Si IMPLEMENTACIÓN DE UN FA CON HALF ADDER (HA) Un Half Adder es un semisumador el cual solo suma dos bits y devuelve el resultado y el acarreo pero no acepta como entrada un acarreo anterior. Xi Yi HA Ci+1 Si Esquema de un half-adder Xi Yi Ci+1 Si 0 0 0 0 0 1 0 1 1 0 0 1 1 1 1 0 Tabla de verdad del half-adder Ci+1=XiYi Si=XiYi Xi Ci+1 Yi Si Implementación del half-adder Del caso anterior tenemos que: Ci+1=XiYiCi + XiYiCi + XiYiCi + XiYiCi = (Xi+Yi)YiCi + Xi(YiCi + YiCi) = YiCi + Xi(YiCi) Ci Yi Xi HA CiYi Ci+1 Si CiYi HA Ci+1 Si CiYiXi Esquema de un FA realizado con dos HA Ci+1 2 AND Si=2 2 X-OR Ci+1=3 1 OR Si TOTAL= 5 puertas AC - 5 IMPLEMENTACIÓN SECUENCIAL DE LA SUMA DE N BITS D: es un biestable de tipo D. X : son registros de desplazamientos con un tiempo TD de desplazamiento X Y Ci Y X D CLK FA Ci+1 Si S Tiempo: siendo el FA de tres niveles: (2+TD)·n Siendo el FA dos HA: (3+TD)·n IMPLEMENTACIÓN EN PARALELO DE LA SUMA DE N BITS x3 y3 x2 y2 x1 y1 Tiempo: a tres niveles 2·n Con HA (2·n+1)· Con Half-adders es 2n+1 porque todos los sumadores hacen la suma de X e Y a la vez y por lo tanto solo se tiene que pasar por el segundo HA para completar el calculo. x0 y0 Cin FA FA FA Ci+1FA Cout s3 s2 s1 s0 TEMA 3 - NÚMEROS ENTEROS MAPEO DIRECTO VS MAPEO INDIRECTO - Tenemos dos formas de tratar con los enteros: Mapeo directo Z x Nn X Mapeo indirecto Z x N Xe f: Nn X x : Valor implícito, Xe : Valor explícito, X : Vector de dígitos - Representaciones Sistemas complementados Complemento a la base Complemento a la base disminuida Aritmética de exceso (polarizado) Signo y magnitud TEORÍA DE LOS SISTEMAS COMPLEMENTADOS Xe = x mod c= x si x 0 c-|x| si x <0 AC - 6 · Mapeo: -C Z 0 N Cagada!, se solapan las representaciones de los positivos con los negativos. Tenemos que buscar una c adecuada que cumpla que los números positivos no se solapen ni haya mucho espacio con los números C 0 C negativos. El caso ideal, gráficamente, seria: N 0 + Xe si x<c/2 x Xe-c si xc/2 C/2 - C Los números positivos se mapean sobre los números positivos y los negativos en los números consecutivos. Si c es impar tendríamos un número que nos sobraría. Ejemplo: Xe 0 1 2 3 4 5 6 7 X1 0 1 2 -3 -2 -1 0 1 X2 0 1 2 3 4 -5 -4 -3 X3 0 1 2 3 -4 -3 -2 -1 Número de bits: n=3 Base: r=2 rn=8 X1 c=6 c/2=3. Sistema no simétrico y redundante, el 0 i el 1 tiene dos representaciones. X2 c=10 c/2=5. Sistema no simétrico. Hay numeros desparovechados. X3 c=8 c/2=4. Sistema ideal Para la representación se utilizara un sistema convencional ponderado de base r i n dígitos, entonces el rango es: rango = 0 < Xe < rn-1 TIPOS DE SISTEMAS COMPLEMENTADOS Hay dos tipos de sistemas complementados: - Complemento a la base, cuando c=rn, y por lo tanto c es par. - Complemento a la base disminuida, cuando c=rn-1, y por lo tanto c es impar. En este sistema tenemos dos representaciones diferentes del número cero. En todos los casos tenemos que x es el numero entero y Xe el numero natural que representa x. COMPLEMENTO A LA BASE (COMPLEMENTO A DOS) Con: base r=2 C=rn El rango queda como sigue: 0 Xe rn-1 En este sistema existe un número negativo mas que positivo, por lo tanto, el rango no es simétrico. C=2n C/2=2n-1 x si x 0 Xe x C+x si x < 0 Para r=2 Rango -2n-1x2n-1-1 Xe si Xe < rn/2 Xe-rn si Xern/2 Xe si Xe < 2n-1 x Xe-2n si Xe2n-1 COMPLEMENTO A LA BASE DISMINUIDA (COMPLEMENTO A 1) Con: base r=2 y c=rn-1 tenemos que Xe = x mod c = x mod (2n-1) Por ejemplo en n=3 tenemos que 23-1=7 i c pertenece a la numeración que utilicemos AC - 7 Las funciones de transformación enteros y naturales son:. x si x 0 Xe si Xe < rn-1/2 Xe Ahora tenemos un rango simétrico: x rn-1+x si x 0 rn rn 1 ... 1 2 2 Xe-rn+1 si Xern-1/2 Para r=2 tenemos que el rango es: -(2n-1) x (2n-1-1) MAPEO DIRECTO Z Nn X X=(Xn-1, Xn-2 , ...X0) Los positivos tienen un cero como bit más significativo y los negativos un uno. Complemento a dos. Xe si Xe < 2n-1 x Xe-2n si Xe2n-1 n2 n 1 Xe= Xi ·2 i x=-Xn-1·2n-1+ Xi ·2 i i0 i0 Complemento a uno. Xe si Xe < 2n-1/2 n2 x=Xn-1-Xn-2·2n-1+ Xi ·2 i x i0 Xe-(2n-1) si Xe>2n-1/2 SUMA EN SISTEMAS COMPLEMENTADOS s= x + y Tenemos por lo tanto la siguiente expresión: Se= Xe + Ye. Donde Se queda como: Se= s mod c= (x + y) mod c= [(x mod c)+(y mod c)]mod c= (Xe + Ye) mod c. Xe Ye + Natural Mod c Se SUMA EN COMPLEMENTO A DOS Tenemos los siguientes datos: c=rn=2n; Se= (Xe + Ye) mod 2n Se= We mod 2n; We= (Wn, Wn-1, Wn-2, ..., W0) Donde Xe y Ye tienen n bits y We tiene n-1 bits. We = Wn2n+Wn-12n-1+ ,,,+ W1·2+W0 = Wn + Wn-1·2n-1+ ,,,+ W1·2+W0 2n 2n 2n D = c· d + r D/d= c + (r / d), así para calcular el resto solo tenemos que despreciar el primer bit. Xe Ye + Natural Se=We= (Wn-1, Wn-2, ..., W0) Bit n+1 (Wn) IRRESPRESENTABILIDAD O OVERFLOW Tenemos que el rango de s, x, y ( s= x + y) es el siguiente: [-2n-1..2n-1-1] y están compuestos por n bits. En cambio el resultado de la suma tiene el siguiente rango: [-2n..2n-2]. Por lo tanto se pueden representar dos números enteros diferentes con el mismo número natural, uno de positivo y el otro de negativo. Por lo tanto tenemos que se puede producir overflow en dos circunstancias: - Cuando se suman dos positivos y el resultado obtenido nos sale negativo. - Y cuando se restan dos negativos y el resultado obtenido nos sale positivo. Overflow=Xn-1Yn-1Sn-1 + Xn-1Yn-1Sn-1 Otra formula es: OVF= Cn Cn-1 AC - 8 SUMA EN COMPLEMENTO A 1 Los datos que tenemos son: c = rn-1 = 2n-1; Xe =x mod c; We =Xe + Ye y sabemos que Se =We mod (2n-1) y que el rango de We es: 0 We 2·(2n-1). Para esta suma en complemento a uno tenemos dos puntos de vista diferentes: Cuando Wn=0: Se =We mod c= (Wn-1, Wn-2, ..., W0) We si We < 2n-1 Se= We mod c 0 si We=2n-1 Cuando Wn=1: Se=We mod c= We –(2n-1)= We-2n+1 (1, Wn-1, Wn-2, ..., W0)- (1, 0, ..., 0)+1= (0, Wn-1, Wn-2, ..., W0)+1 We – (2n-1) si 2n-1 < We < 2·2n-1 Se= We mod c 0 si We=2·(2n-1) La suma en complemento a uno consiste, por lo tanto, en lo siguiente: Coger los bits de menos peso y sumarle el bit de mas peso a estos. El esquema de un sumador en complemento a uno es el de la derecha. DETECCIÓN DE SIGNO Xe Ye + Naturales Cout Cin Se Sumador en complemento a uno La detección de signo se hace como ya se ha mencionado antes, si el bit de mas peso es un cero entonces el número es positivo, y si por el contrario es un uno tendremos un número negativo. Hay que tener en cuenta que en complemento a uno tenemos dos representaciones del número cero. (00..0 y 11..1). CAMBIO DE SIGNO EN SISTEMAS COMPLEMENTADOS Z N Nn x Xe X El cambio de signo en caso general se deduce de la siguiente forma: Ze = Z mod c= (-x) mod c = c – (x mod c)= c-Xe Ze= c-Xe CAMBIO DE SIGNO EN COMPLEMENTO A UNO n 1 c = rn-1= ( r 1)·r i con base r=2 Zi i0 n 1 Ze= c - Xe= n 1 ( r 1)·r - i i0 i0 Zi n 1 i Xi ·r = (r 1 n 1 i Xi )·r = i0 (2 1 i0 n 1 Xi )·r = (1 Xi )·r i i i0 El cambio de signo queda como sigue: - Si Xi=0 1-Xi=1 Zi=1 - Si Xi=1 1-Xi=0 Zi=0 Por lo tanto Zi =Xi, es decir se han de cambiar ceros por unos y unos por ceros. CAMBIO DE SIGNO EN COMPLEMENTO A DOS c= rn y Ze=c-Xe=rn-Xe=rn-1+Xe+1 Donde rn-1+Xe es el cambio de signo en complemento a uno, y por lo tanto en cambio de signo en complemento a dos consiste en cambiar ceros por unos y unos por ceros, y después sumar al resultado un uno. OVERFLOW EN EL CAMBIO DE SIGNO En complemento a uno nunca se puede producir overflow, ya que el rango es simétrico. En cambio en complemento a dos no puede haber overflow cuando se cambia de signo un número positivo, pero en cambio si se puede producir a la hora de cambiar de signo el número mas pequeño negativo, es decir, el número -2n-1. AC - 9 Ahora podemos observar el caso descrito: x =-2n-1 = 100...0 si hacemos el cambio de signo tenemos: x=011....1 + 1 100....0 Como podemos observar obtenemos el mismo número al cual queríamos cambiar el signo, por lo tanto obtenemos overflow cuando queremos cambiar de signo un número negativo y como resultado nos da otro número negativo. RESTA DE ENTEROS EN SISTEMAS COMPLEMENTADOS Podemos deducir que la suma se puede convertir en una suma, veámoslo: z =x – y = x + (-y) El valor –y que se suma es un simple cambio de signo y por lo tanto hemos reducido la resta a una suma de los enteros. Para realizar esta resta por lo tanto tenemos dos etapas: - Cambio de sign.o de y - Suma de x+(-y). La implementación de la resta en complemento a dos queda como sigue: X3 Cout Y3 X2 FA Y2 X1 FA Y1 X0 FA Y0 Cin=1 FA Z3 Z2 Z1 Z0 Esquema de un restador en complemento a dos La implementación de la resta en complemento a uno es la siguiente: X3 Y3 X2 Y2 X1 Y1 X0 Y0 Cout Cin FA Z3 FA FA FA Z2 Z1 Z0 Esquema de un restador en complemento a uno OVERFLOW EN LA RESTA En complemento a uno en el cambio de signo no puede haber overflow y solo se puede producir en la suma. En cambio en complemento a dos puede haber overflow en el cambio de signo y en la suma, pero según como se implemente se puede evitar el overflow en la etapa del cambio de signo, la forma de implementarlo es primero haciendo el cambio de signo de y en una etapa y sumarle uno, y en la segunda etapa hacer la suma. REPRESENTACIÓN DE ENTEROS EN SIGNO Y MAGNITUD REPRESENTACIÓN Los números enteros en signo y magnitud se representan mediante dos números, uno que indica el signo (Xs) y el otro que indica la magnitud (Xm). Ejemplo: -6 1 110 6 0 110 Mapeo directo Mapeo indirecto Z N2 Z N Nn Nn x (Xs,Xm) x=(Xn-1, Xn-2, ..., X0) x Xe X Mapeo indirecto: x si x0 Xe si Xe2n-1 Xe= n-1 x= n-1 2 -x si x0 2 -Xe si Xe 2n-1 AC - 10 Mapeo directo: n2 x= Xi ·2 i si Xn-1=0 i0 n2 2n-1-2n-1- Xi ·2 i si Xn-1=1 n2 x=(1-2·Xn-1) Xi ·2 i i0 i0 Con esta representación tenemos un rango simétrico: -(2n-1-1) x 2n-1-1 SUMA EN SIGNO MAGNITUD 4 +3 7 0100 -4 1100 4 0100 -4 1100 0011 +(-3) 1011 +(-3) 1011 +3 0011 0111 -7 1111 1 0001 -1 1001 Si los dos sumandos son del mismo signo la suma se realiza mediante la suma de magnitudes y donde se mantiene el signo de cualquiera de ellos. Si los dos sumandos son de diferentes signos la suma se realiza mediante la resta de magnitudes y se coge el signo del número mayor en valor absoluto. Z’m=Xm-Ym Z’m > 0 Zm=Z’m Zs=Xs Z’m < 0 Zm=-Z’m Zs=Ys El algoritmo queda como sigue: If (Xs =Ys) then Zm =(Xm +Ym) mod (2n-1-1) /* por tener los números codificados en Ca1*/ Zs =Xs OVF =Cn-1 Else Z’m =Xm-Ym OVF =no hay If (Z’m 0) then Zm =Z’m Zs =Xs Else Zm =-Z’m Zs =Ys Endif Endif 0 Xn-2 Xn-3 ..... X1 X0 Cn-2 =Cn-1 Xm -Ym= Xm + (-Ym) 1 Yn-2 Yn-3 ..... Y1 Y0 Z’n-2 Z’n-3 ... Z’1 Z’0 El carry out se introduce en carry in 0 Xn-2 Xn-3 ..... X1 X0 0 Yn-2 Yn-3 ..... Y1 Y0 OVF Cn-2 Cn-1 Xm +Ym El carry out se introduce en carry in, porque se hace la suma en Ca1. OTRAS OPERACIONES - Cambio de signo: cambiar solo el bit de signo. x =(Xs, Xm) -x =(Xs, Xm) Resta: x- y =x+ (-y) REPRESENTACIÓN DE ENTEROS EN EXCESO O POLARIZADO REPRESENTACIÓN Z N Nn Xe = x +c x Xe X En general para que el sistema sea simétrico el valor de c será 2n-1-1 o 2n-1. Por lo tanto la formula de la expresión será: Xe=x+2n-1-1. Ejemplo con 3 bits: Xe x AC - 11 000 001 010 011 100 101 110 111 0 1 2 3 4 5 6 7 -3 -2 -1 0 1 2 3 4 N =3 2n-1-1=3 Xe =x +3 x =Xe -3 El cero es el número: 2n-1-1 Los x 0 tienen Xn-1=0 Los x > 0 tienen Xn-1=1 El rango es asimétrico. Tenemos un número positivo mas que negativo: -(2n-1-1) x 2n-1 SUMA EN EXCESO Ze =(x +y)+ 2n-1-1 Xe =x +2n-1-1 x =Xe –(2n-1-1) Ye =y +2n-1-1 y= Ye –(2n-1-1) Ze= (Xe –(2n-1-1) + Ye –(2n-1-1)) + 2n-1-1 = Xe -2n-1 +1 +Ye –2n-1 +1 +2n-1 –1= Xe +Ye –(2n-1-1) Ze =Xe +Ye –2n-1 +1 * Z e =Xe +Ye +1 Esto se implementa con un solo sumador poniendo Xe Ye en la señal Cin un uno. n n Ze=Z*e-2n-1 Cout Z*n-1 Z*n-2 .... Z*1 Z*0 Z*n-1 =1 Zn-1 =0; carry =0 Cout ++ 1 0 .............. 0 2n-1 0 Z*n-1 =0 Zn-1 =1, carry =1 * * * * Ze Z n-1 Z n-2 .....Z 1 Z 0 OVF= Cout Zn-1 n-1 z =x +y ; Cin=’1’ Xe OTRAS OPERACIONES - Cambio de signo: Z =-X Ze = -x +2n-1 –1 Xe = x +2n-1-1 -x = -Xe +2n-1-1 Cambio de signo en Ca1 Ze Esquema del sumador en exceso - 2n -1 –Xe -1= Xe-1 Ze =-Xe +2 -1 + 2 -1 - 2n -1 –(Xe +1)= Xe+1 Resta en exceso: z =x –y =x +(-y) Ze = x –y +2n-1 –1 Cout Xe = x +2n-1 –1 = Xe –2n-1 +1 Ye = y +2n-1 –1 -y = 2n-1-1-Ye Ze = (Xe –2n-1 +1) + (2n-1-1-Ye) + 2n-1 –1 = Xe –2n-1 +1 +2n-1 -Ye-1 = Xe +Ye -2n-1 n-1 - n Ye Xe Ye n-1 n n ++ Cin=’1’ Xe n-1 n Ze Esquema del restador en exceso AC - 12 RESUMEN Xe representación del número Xe x+y Xe = x mod (2n-1) Ca1 Xe +Ye +Cout x si x 0 2n-1+x si x 0 Xe = x mod(2n) Ca2 (Xe + Ye) mod 2n x si x 0 n 2 +x si x < 0 x si x 0 SyM Algoritmo 2n-1-x si x 0 Xe = x +2n-1-1 Z*e = Xe +Ye +1 Ex 2n-1-1 Ze =(Z*n-1 Z*n-2 ... Z*1 Z*0) -x x-y Xe Xe +Ye Xe+1 Xe+Ye+1 (Xs, Xm) (Xs, Xm) + (Ys, Ym) Xe-1 Xe+1 Z*e = Xe +Ye Ze =(Z*n-1 Z*n-2 ... Z*1 Z*0) TEMA 4 – ACELERACIÓN DE LA SUMA GENERACIÓN Y PROPAGACIÓN DEL ACARREO Tenemos que de un sumador completo la salida es función de tres elementos: Si = f( Xi, Yi, Ci-1) Ci+1 = g(Xi, Yi, Ci)= g’(Xi, Yi, Xi-1, Yi-1, Ci-1)= gn(Xi, Yi, ..., X0, Y0, Cin) Primero calcular todos los acarreos (a dos niveles) y después calcular la suma. Xi Yi Ci FA Ci+1 Si Esquema de un Full Adder X 0 0 1 1 Y 0 1 0 1 Cout 0 Cin Cin 1 El acarreo de entrada se absorbe El acarreo de entrada se propaga El Cin se genera para la siguiente etapa CSA. CARRY SAVE ADDER El CSA es un sumador con retraso en la propagación del acarreo, en cambio el CPA es el sumador con propagación de acarreo, el visto hasta ahora. El CSA permite la suma de tres números diferentes (X, Y, C), y devuelve dos números (C 0, S) los cuales se han de sumar como si fuera una multiplicación, es decir el número Co se suma un bit desplazado a la izquierda. xxxxxxx A + xxxxxxx B O (1) xxxxxxx C xxxxxxx S O(n) xxxxxxx C0 xxxxxxxx A+B+C Utilizamos un solo CPA al final, y por lo tanto se guarda el carry hasta el final. Estos sumadores se utilizan a la hora de realizar los multiplicadores. AC - 13 CLA. CARRY LOOKAHEAD ADDER (transparencias grupo 10) El CLA es un sumador con anticipación de acarreo. Xi Yi xi yi Ci X Y Cout 0 0 0 FA 0 1 Cin 1 0 Cin Ci+1 Si 1 1 1 Esquema de un Full Adder Gi =Xi ·Yi Pi =Xi Yi Gi 0 0 0 1 Pi 0 1 1 0 pi gi Esquema de un HA que da los valores de Gi y Pi Ci+1 = Xi·Yi + (Xi Yi)· Ci Si = Xi Yi Ci Ci+1 = Gi + Pi · Ci Si = Pi Ci En estas dos ultimas formulas es en las que se basa el CLA. Necesitamos un modulo que calcule todos los acarreos y que después realice la suma solo con una puerta XOR. Ci+1 = Gi + Pi · Ci = Gi + Pi · (Gi-1 + Pi-1 · Ci-1) = Gi + Pi · Gi-1 + Pi · Pi-1 · Ci-1 = Gi + Pi · Gi-1 + Pi · Pi-1 · (Gi-2 + Pi-2 · Ci-2) = Gi + Pi · Gi-1 + Pi · Pi-1 · Gi-2 + Pi · Pi-1 · Pi-2 · Ci-2 = ........ De esta formula podemos desprender que tendremos carry si se genera en el bloque, si se genera en el bloque anterior y se propaga, etc. Esta fórmula se puede reformular de la siguiente forma. n 1 k Ci+1 = G n0 in · Pi m Gi-k =Ci-k+1 m 0 En el caso de particular de k sea 3 tenemos que: Gi Ci+1 = Gi + Pi · Gi-1 + Pi · Pi-1 · Gi-2 + Pi · Pi-1 · Pi-2 · Ci- Gi-1Pi Gi-2 Pi-1 Pi Ci-2Pi-2 Pi-1 Pi 2 El método para sumar con CLA sigue los tres siguientes pasos: 1.- Calcular Pi y Gi con un primer nivel formado por el semisumador. 2.- Calcular los acarreos Ci en dos niveles. Esquema de la derecha a dos niveles. 3.- Calcular Si mediante una XOR entre Ci i Pi. Mediante esta forma de sumar obtenemos 4 niveles de puertas que dan un tiempo de: 4 niveles 4 Con la propagación del acarreo (CPA) obteníamos un tiempo de 9. Ci+ 1 Calculo del carry en función Gi y Pi SUMADOR CLA Y PROPAGACIÓN ENTRE MÓDULOS Con los CLA solo se tiene que propagar el acarreo y por lo tanto solo se propaga el segundo paso. Es decir, el paso 1 y 3 se hace de forma paralela y por lo tanto solo se espera la propagación de los Ci. Por lo tanto el tiempo total dedicado a la suma es el siguiente: T = + n/p· 2 + = 2· (n/p+1) calculo de Si calculo de Ci Calculo de Gi y Pi AC - 14 Ejemplo de la ganancia en tiempo que se obtiene al utilizar un sumador CLA en frente del sumador habitual, CPA SCLA CPA Ganancia P=4 N=16 T= 10 T= 33 3,3 Obtenemos una ganancia con el SCLA de mas del doble N=32 T= 18 T= 65 3,6 N=64 T= 34 T=129 3,8 Aun de esta forma tenemos que propagar el acarreo mediante los diferentes módulos sumadores CLA. Para evitar esta propagación se puede obtener otro CLA superior a los bloques SCLA, y así sucesivamente, hasta sumar el número de bits que queramos. La ecuación de un CLA para sumar niveles de SCLA es la siguiente: C4 =G3 +G2P3 +G1P2P3 +G0P1P2P3 +C0P0P1P2P3 =G*0 + C0 P*0 G*0 P*0 C8= G7 +G6P7 +G5P6P7 +G4P5P6P7 +C4P4P5P6P7 =G*1 +C4P*1 =G*1 +(G*0 +C0P*0)P*1 =G*1 +G*0P*1 +C0P*0P*1 TEMA 5 – OTRAS OPERACIONES EXTENSIÓN DE RANGO La extensión de rango consiste en codificar un mismo número con más dígitos que los iniciales, tiene que ver con el overflow, ya que se considera que hay overflow si el resultado necesita más dígitos que el rango inicial, y con la extensión de rango podemos hacer que las operaciones sean correctas. Esto es útil para la multiplicación ya que sí no se perderían muchos de los posibles resultados de la operación y de esta forma podemos obtener el valor correcto. x=(Xn-1, .... X1, X0) y=(Ym-1, Ym-2, ... Yn, ....., Y0) y =x pero codificado con más dígitos, es decir: y =x m>n. Naturales: todos los dígitos que añadimos a la izquierda tendrán el valor 0. n 1 m 1 M>n Yi=Xi si i=0, ..., n-1 x= X i ·r i y= Y i ·r i X=y Yi=0 si i=n, ..., m-1 i0 i0 En resumen tenemos que la extensión de rango de naturales es como sigue: y=(0, 0, ...., 0, Xn-1, Xn-2, ...., X1, X0) Enteros: tenemos dos casos, ya que pueden estar codificados en complemento a 1 o complemento a dos: - Ca2: Xe =x mod 2n Ye =y mod 2m, donde y =x i m > n Xe =x m m-1 n x 0 Ye =Xe es el mismo caso que con los Ye = y 1 0 ...... 0 ........... 0 (2m) naturales y =x 0 0 ....... 1 0......... 0 (2n) 0 1 ....... 1 0 .........0 (2m-2n) x <0 Xe =x + 2n 0 .........0 Xn-1 ....X0 Ye = y+ 2m Ye =y +2m =x +2m =Xe –2n +2m 1 .........1 Xn-1 ....X0 (2m-2n+Xe) y=x Por lo tanto la extensión de signo queda como sigue: y =(Xn-1, Xn-1, ...., Xn-1, Xn-2, ...X0) - Ca1: y =(Xn-1, Xn-1, ...., Xn-1, Xn-2, ...X0) se realiza de la misma forma que en complemento a dos ya que estamos en un sistema de base dos. DESPLAZAMIENTOS ARITMÉTICOS Un desplazamiento es una operación de escalado que equivale a multiplicar o dividir por la base. - Desplazamiento a la izquierda: z =r · x donde r es la base. - Desplazamiento a la derecho: z= (x/r) + ; || < 1. AC - 15 NATURALES Desplazamiento a la izquierda: z = 2 · x n 1 n 1 i0 i0 z = 2 · x = 2( Xi ·2 i ) = Xi ·2 i 1 = (Xn-12n + Xn-22n-1+ .... + X122+X021+0·20) y = (Xn-1, Xn-2, ..., X1, X0, 0) Podemos tener overflow ya que necesitamos un bit mas para representar el valor. El overflow se mira comprobando el bit n+1, es decir el bit de mas peso. Desplazamiento a la derecha: z=(x/2) + n 1 z= Xi ·2 i0 i + = 2 X n 1 2 n 1 .... X 1 2 X 0 1 += Xn-12n-1 +Xn-22n-3 +.... +X1 +( 2 X 2 0 +); =- X 0 2 y =(0, Xn-1, Xn-2, ..., X2, X1) donde nunca podrá haber overflow. SISTEMAS COMPLEMENTADOS CA2 Desplazamiento a la izquierda: z = 2 · x Xe = x mod 2n ; Ze = x mod 2n+1 Xe =x x 0 Ze = z Ze =2·x = 2·Xe caso de los naturales z = (Xn-1, Xn-2, ..., X1, X0, 0) z =2·x x <0 Xe =x + 2n Ze = 2·x +2n+1 =2(Xe-2n)+2n+1=2Xe-2n-1+2n+1=2Xe n+1 Ze = z + 2 Igual que con los naturales. Necesitamos un bit mas para que no se z =2·x produzca overflow y el resultado sea valido. Si Xn-2 fuera 0 habría overflow. Desplazamiento a la derecha: z =(x/2) + Xe = x mod 2n ; Ze = x mod 2n Xe =x x 0 Ze = z Igual que los naturales z = (0, Xn-1, Xn-2, ..., X1) z =(x/2) + x <0 Xe =x + 2n Ze = x +2n =(x/2) + +2n =(Xe -2n)/2 +2n + = (Xe/2) –2n-1+2n + = 2n-1 + n Ze = z + 2 (Xe/2) + z =(x/2) + z = ( 1, Xn-1, Xn-2, ..., X1) Conclusión es que se replica el bit de signo en el desplazamiento a la derecha: (Xn-1, Xn-1, Xn-2, ... X1) CA1 Desplazamiento a la derecha: se realiza de la misma forma que en complemento a dos. z = (x/r) + ; || < 1 donde r es la base y en nuestro caso vale dos. Si tenemos el siguiente valor x=(Xn-1, Xn-2, ..., X1, X0) obtendremos el desplazamiento de la siguiente forma: z =(Xn-1, Xn-1, ..., X2, X1) Desplazamiento a la izquierda: z= r · x z = 2·x = x+ x donde x =(Xn-1, ..., X0) Xn-1, Xn-2, ..., X1, X0 Xn-1 Xn-1, Xn-2, ..., X1, X0 Xn-2, Xn-3, ..., X0, Xn-1 Los posibles valores de sumar dos dígitos iguales son: la suma es el acarreo que venga y el acarreo siguiente es el valor del dígito que se suma, es decir: Si = Xi Ci+1 = Xi De esta forma el desplazamiento a la izquierda en complemento a uno es el siguiente: z =(Xn-2, ..., X1, X0, Xn-1) AC - 16 TEMA 6 – ALGORITMOS PARA MULTIPLICAR NATURALES Para realizar la multiplicación de dos naturales primero miraremos cuantos dígitos necesitaremos para representar la solución de la multiplicación. Dicho de número de dígitos necesarios es: zmin = xmin · y = x· ymin = 0 zmax = xmax ·ymax = (rn-1)(rn-1)= r2n+1-2rn. Todos los valores posibles de la multiplicación están entre: [0 .. r2n+1-2rn] Con 2n dígitos podremos codificar todos los posibles resultados pero desaprovecharemos números sin representación. MULTIPLICACIÓN SECUENCIAL n 1 n 1 n 1 z =x·y = x Y i ·r i = ( X i ·r i )( Y i ·r i ) = ...... = i0 i0 n 1 z =x·y = x Y i ·r i = i0 i0 2 n 1 Z ·r j j0 n 1 x ·Y i ·r i x·ri=((((x·r)·r)·r)....) son desplazamientos i0 consecutivos. Algoritmo aritmetico:Existen dos versiones. z=0 z=0 do i =0...n-1 do i =0...n-1 z =z +x(Yi)·ri aux =x·Yi·rn edndo z = (z+aux)·r-1 endo Implementación secuencial z = (z +x·Yi·rn)·r1 Primer algoritmo Segundo algoritmo z = (z +x·Yi·rn)·r-1 n 1 z =x·y = x ·Y i ·r i i0 Primero haremos la extensión de rango a los multiplicadores hasta los 2n dígitos y despues haremos la suma. x x y n n n 1 * n+1 1 ri Sumador de 2n dígitos 2n 1 * y DESPL 2n j Sumador de n dígitos n 1 n bit menos peso Carry 2n z z En el primer algoritmo: Utiliza 2n Full-Adders y realmente solo necesitaríamos n+1 sumador que es lo que suma el algoritmo (solo n bits). Sumamos dos filas i generamos una fila nueva. La forma que sigue a la hora de multiplicar es la siguiente: AC - 17 0000 0 0 0 0 ACC0 0000 x x x x xY020 00 0A4A3A2A1A0 ACC1 00 0 y y y y 0 xY121 00B4B3B2B1B0A0 ACC2 00z z z z 0 0 xY222 0C4 C3C2C1C0B0A0 ACC3 0 v v v v 0 0 0 xY323 D4D3D2D1D0C0B0A0 ACC4 resultat En el segundo algoritmo: Tenemos que A4 es el carry de la suma de los últimos dígitos. Ahora no hacemos ningún desplazamiento, ya que desplazamos el bit a la derecha del acumulador. Y por lo tanto no lo hacemos después de realizar la multiplicación. El resultado de la multiplicación son los bits desplazados del acumulador mas los bits que queden en el acumulador. 0 0 0 0 ACC0 x x x x xY020 A4A3A2A1A0 (desplazamiento a la derecha, nos quedamos con A0) A4A3A2A1 ACC1 y y y y xY121 B4B3B2B1B0 (desplazamiento a la derecha, nos quedamos con B0) B4B3B2B1 ACC2 z z z z xY222 C4C3C2C1C0 (desplazamiento a la derecha, nos quedamos con C0) C4C3C2C1 ACC3 v v v v xY323 D4D3D2D1D0 ACC4 El modulo de multiplicación consiste en una batería de ANDs por la siguiente razón: Yi=0 0 Yi=1 x Por lo tanto el multiplicador secuencial queda como sigue: O(n2) xYi X FA FA Y FA FA 0 ACC Esquema de un multiplicador secuencial binario ACCELERACIÓN DE LA MULTIPLICACIÓN SECUENCIAL Para acelerar la multiplicación podemos realizar dos operaciones: - Hacer las sumas más rápidas, utilizando CSA - O haciendo menos iteraciones, utilizando una base más grande (base 2k). MULTIPLICACIÓN CON CSA Un Full Adder tiene tres entradas (contador de 3 bits) y lo que hace es contar el número de entradas que están a uno y da el numero codificado en binario. Las entradas tienen todas el mismo peso, pero una de las salidas tienen un peso mayor que la otra. La función que realiza el CSA es la siguiente: AC - 18 Xn-1 Yn-1 Zn-1 C5 x x x S4 C4 x x x S3 C3 x x x S2 C2 x x x S1 C1 x x x S0 FA ............. X0 Y0 Z0 FA Sn-1 Cn S0 C1 Esquema de un CSA El multiplicador con CSA queda como sigue: O(2n) X Y n 1 1 bit de menos peso n CSAn ‘0’ CP n-1 SP CPAn 0 n Esquema de un multiplicador con CSA UTILIZANDO UNA BASE MÁS GRANDE (BASE 2K) Partiendo de una base que sea potencia de dos, porque así trabajaremos con bloques de bits y tendremos que hacer menos iteraciones. Para k =2 tendremos que: YRj=2·Y2j+1+Y2j a este hecho se le llama recodificación ya que se pasa de la base 2 a 2k. n 1 n k i0 j0 z =x·y = x· Yi ·2 i x · Y jR ·( 2 k ) j Para k=2 el esquema de la implementación quedaría como sigue: AC - 19 0 x 2x n+2 n+2 n+2 2x x y + n+2 Y2j+1 Y2j 2 bits menos peso 00 n+2 + n+2 0 n+2 n n ACC Esquema de un multiplicador con base 2k ALGORITMOS PARALELOS PARA LA MULTIPLICACIÓN (ARRAYS) Tenemos que la expresión de la multiplicación es la siguiente: z =x·y = x3 x2 x1 x0 n 1 n 1 n 1 n 1 y3 y2 y1 y0 = X i ·2 i · Y j ·2 j X i ·Y j ·2 i j ; 30 20 10 00 i0 j0 i0 j0 Matriz de subíndices X Y 2i+j = n2 ANDS en paralelo. 31 21 11 01 i i de la multiplicación 32 22 12 02 La suma de los índices de una de una 33 23 13 03 columna ha de dar el mismo valor i este valor es Peso 3 el peso del dígito. Existen dos métodos para aplicar algoritmos paralelos: REPLICANDO LOS CPA Generamos los productos en paralelo mediante una batería de AND’s y después hacemos la suma pertinente. Se necesitan n-1 CPA para poder multiplicar dos números e n bits. En la siguiente figura vemos el esquema general de la replicación de CPA. Ex: n=4 replicar CPA (diseño a la figura 1.1) xy4 xy3 xy2 xy1 xy0 0 30 20 10 00 31 21 11 01 CPA 32 22 12 02 función de 33 23 13 03 un CPA CPA C S S S S 00 0 –extensión 32 22 12 02 de rango CPA 33 23 13 03 C S S S S S 00 33 23 13 03 C S S S S S S 00 En la figura 1.1 podemos ver el esquema de un multiplicador replicando los CPA de 4 bits. El tiempo general que tarda en realizar la multiplicación es: (n + n-2 + n-2) Tfa =(3n-4) Tfa CPA AC - 20 fotocopia 1 AC - 21 REPLICANDO CSA El método de la multiplicación es el mismo que en la replicación de CPA, se hacen todas las AND’s en paralelo y después se realiza la suma, ahora mediante CSA. Utilizando CSA necesitamos n-2 sumadores CSA (siendo n el numero de bits de los números a multiplicar). En la siguiente figura vemos el esquema general de la replicación de CSA. xy4 xy3 xy2 xy1 xy0 Ex: n=4 replicar CSA (diseño a la figura 1.2) 0 30 20 10 00 CSA 31 21 11 01 función de 32 22 12 02 0 un CSA CSA 33 23 13 03 0 –extensión 32 S S S S 00 de rango C C C C CSA 33 23 13 03 0 33 S S S S S 00 función de CSA C C C C un CPA C S S S S S S 00 CPA El tiempo total que se tarda en realizar la multiplicación en este tipo de circuitos es: (n-2+n)·Tfa= (2n-2)·Tfa Donde n-2 es tiempo de los CSA y n es el tiempo del CPA (n-2+n). Tfa es el tiempo de un FullAdder. MULTIPLICACIÓN EN ARBOL xy8 xy7 xy6 xy5 xy4 xy3 xy2 xy1 xy0 CSA CSA CSA CSA CSA CSA Estos dos algoritmos que acabamos de ver (la replicación de CPA’s y la replicación de CSA’s) son algoritmos lineales pero existen otros tipos de algoritmos que son los que utilizan la multiplicación en árbol. Si el CPA ultimo fuera un CLA el multiplicador seria mas rápido que los que hemos visto hasta ahora, pero con un CPA normal la multiplicación tarda más tiempo en realizar la multiplicación que si empleamos la replicación de CSA. CSA CPA Esquema de un multiplicador en árbol TEMA 7 – MULTIPLICACIÓN DE ENTEROS EN C’2 Queremos hacer la multiplicación de dos enteros codificados en complemento a dos de n bits y queremos tener el resultado siempre correcto. Para saber el rango hacemos lo siguiente: z = x·y; x,y [-2n-1..2n-1-1] zmax = xmin·ymin = (-2n-1)(-2n-1) = (-2n-1)2 zmin = xmin·ymax = xmax·ymin = (-2n-1)(2n-1-1) El rango es el mismo que en los naturales pero ahora tenemos un solo número mas que hace que necesitemos un bit mas para codificarlo. En total necesitamos 2·n bits para poder expresar el resultado de forma correcta. AC - 22 MULTIPLICACIÓN SECUENCIAL El algoritmo secuencial que se obtiene es el siguiente: n2 z = x·y = x·(-2n-1·Yn-1 + Yi ·2 ) = -2n-1·Yn-1·x + i 0 n2 x ·Y ·2 i i 0 La siguiente explicación es respecto a la implementación secuencial con CPA’s Ex: n=4 . x =-3 C=24=16 Xe=16-3=13 1101 y =-5 Ye=16-5=11 1011 0 0 0 0 0 AC 1- Resultado 1 1 1 0 1 xY0 1 1 1 1 0 1 0- Extensión de 1 1 1 0 1 xY1 rango 1 1 1 0 1 1 0 0 0 0 0 xY2 1 1 1 1 0 1 0 0 0 1 0 xY3 1 1 para completar la resta 0 0 0 0 1 Resultado final = 00001111 Todas las sumas se hacen con CPA’s x y 1 n 1-bit menos peso s/r n 1 n 1 n + n+1 ACC Esquema de un multiplicador secuencial de enteros en C’2 La implementación de la multiplicación secuencial para enteros en C’2 con CSA es análoga a la implementación de la multiplicación secuencial para naturales por lo tanto solo se ha de seguir los pasos siguientes al realizar la multiplicación: Todas las sumas se hacen con CSA’s excepto la ultima (que utiliza un CPA) que suma los carry’s con las sumas. Ex: n=4 . x =-3 C=24=16 Xe=16-3=13 1101 y =-5 Ye=16-5=11 1011 0 0 0 0 S 1- Resultado 0 0 0 0 C 1 1 0 1 xY0 0-Extensión de 1 1 1 0 1 rango 0 0 0 0 1 1 0 1 xY1 0 0 0 1 1 1 1 0 0 0 0 0 0 xY2 1 1 1 0 1 0 0 0 0 0 0 1 0 xY3 1 1 1 0 0 0 0 1 0 1 1 para completar la resta 0 0 0 0 1 CPA Resultado final = 00001111 AC - 23 ALGORITMOS PARALELOS (ARRAYS) PARA MULTIPLICACIONES EN C’2 Estos algoritmos paralelos consisten en las dos siguientes reglas: - Hacemos todas las operaciones AND (multiplicación de un bit) en paralelo, es decir, se construye la matriz (n2 AND’s en paralelo) - Reducimos la matriz a un número de 2n bits. Se puede hacer con CSA y CPA, o con implementaciones lineales o con implementaciones en árbol. El esquema general de lo que se tendría que hacer es el siguiente: x x x x x x x x x x x x x x x x 0 1 Una primera opción seria extender todos los números hasta 2n bits i realiza la suma, pero este método tarda mucho y por lo tanto es muy ineficiente. Otra forma de realizar la multiplicación es como sigue: Pasos ha realizar con CSA: Pasos ha realizar con CPA: 30 30 30 20 10 00 x x x x x x 31 31 21 11 01 x x x x x 32 22 12 02 x x x x 33 23 13 03 x x x x 1 1 S S S S S S 00 x S S S S S x C C C C C x x x x x 33 23 13 03 x x x x 1 1 S S S S S S S 00 S S S S S S S 00 C C C C C x x x x x 1 1 S S S S S S S 00 S S S S S S S 00 Hacemos dos extensiones de rango en el La suma del uno es para terminar de hacer la primer paso ya que 30 y 31 tienen peso resta y ademas en los CPA’s entra po el Cin del negativo y se estaría sumando con dígitos sumador. de peso positivo dando así un error. x- extensión de rango. Aquí solo se utilizan CSA’s S- parte del resultado Otra forma de multiplicar los enteros de forma paralela es formando el array optimo: n2 n2 z = x·y = x (-2n-1Yn-1+ Y i ·2 i )=-2n-1Yn-1·x+ x ·Y i ·2 i 0 0 n2 n2 n2 z = x·y = x (-2n-1Yn-1+ Y i ·2 i )=(-2n-1Xn-1+ X i ·2 i )(-2n-1Yn-1+ Y i ·2 i ) = 0 0 0 n2 n2 n2 n2 0 0 0 0 = 2n-2Xn-1Yn-1 + ( X i ·2 i )( Y i ·2 i ) -2n-1Xn-1· Y i ·2 i -2n-1Yn-1· X i ·2 i Los dos primeros términos de la suma son positivos y los dos últimos son negativos. En la parte positiva pondremos por delante ceros, que seria la x x x x extensión de signo del complemento a dos pero para números positivos. x x x x Por lo tanto lo que s hace es extender el rango de los números positivos x x x x hasta el número de bits deseado y se realiza la suma. Después se ha de restar x x x x los dos números negativos lo que se consigue complementando todos los bits y Números positivos sumando uno (estamos en complemento a dos). Números negativos El esquema seria el siguiente: AC - 24 0 0 0 0 0 0 0 0 0 x 0 0 0 x x 0 x 0 0 x x x 1 0 0 x x x 1 x x x x x x 11 1 +11 +1 x10 10 x no nos interesa 0 0 0 0 0 0 0 0 0 x 0 0 0 x x 0 x 1 0 x x x 0 0 x x x 1 0 x x x x x x TEMA 8 – REPRESENTACIÓN Y OPERACIONES CON REALES Los números reales para el procesador no hacen falta, solo hicieron falta por una necesidad de los usuarios. Con los naturales i los enteros tenemos el problema del overflow y la representación tenia un rango donde el cero se encontraba en el centro. Pero con los reales no podemos representar todo el rango posible, ya que entre dos reales hay infinitos números). Con los reales aparece el concepto de precisión que indica el número de números que queremos, y también aparece el redondeo (codificar un número para el que no tenemos suficientes bits con su error). REPRESENTACIÓN DE NÚMEROS REALES PUNTO FIJO Este sistema considera que el punto que diferencia la parte real de la imaginaria esta siempre fijo en un lugar y por lo tanto solo podemos representar los números con ese punto. Hasta ahora el punto siempre lo hemos tenido a la derecha del todo, por lo tanto solo trabajábamos con la parte entera de un número: 23 22 21 20 x x x x. Esta representación esta bien para número grandes ya que el error será pequeño, pero en cambio para número muy pequeños el error será mas alto. Con el punto a la derecha del todo el rango es el siguiente: [0..2n-1] Y la distancia entre dos números representables es 1. Con el punto fijo a la izquierda del todo 2-1 2-2 2-3 2-4 0.x x x x. n El rango es [0..1-2 ] [0 .. 0.111..1] Y la distancia entre dos números representables es de 2-n = 1/2n. La codificación de un número en punto fijo es: r 1 x= X i ·2 i m Donde –m es el bit de menos peso y r-1 el bit más peso. Des del bit m hasta el r-1 han de salir los n bits utilizados para la representación. En punto fijo, todas las operaciones se pueden realizar con el hardware destinado a realizar las operaciones de los números enteros y de los naturales. PUNTO FLOTANTE El punto flotante permite escoger donde queremos que vaya el punto según que número queramos representar. En este sistema, una palabra del computador se divide en tres partes, el signo, un exponente y una mantisa (número con el punto fijo). Es decir, este sistema esta basado en la notación científica que necesita: - El signo. - Un exponente dentro de un rango; e [emin, emax] - Una mantisa. AC - 25 x =0.a1a2a3...at·be Donde 0.a1a2a3...at es la mantisa, b es la base, e es el exponente i t el número de bits. La fórmula para obtener el numero que representa una tira de bits un punto flotante es: t x= ( a i ·b i )·be 1 e Ejemplo: 0.xx·2x Dist =0.5 Todos los números que se pueden representar con el mismo exponente están a la misma distancia. 1 Dist =0.25 0 Dist =0.125 -1 * * * * * * * * * * Man 00 01 10 11 00 01 10 11 00 01 10 11 x 0 0.5 1 1.5 0 0.25 0.5 0.75 0 0.125 0.25 0.375 0.00*21 0.01*21 = (0·20+0·2-1+1·2-2)*21= 2-1 0.10*21 0.00*20 0.01*20 0.00*2-1 0.01*2-1 * * 1 0 0.125 0.25 0.375 0.5 0.75 1.5 Como se puede observar el sistema es redundante, ya que podemos representar un mismo número con diferentes codificaciones (el cero tiene tres codificaciones). MANTISA NORMALIZADA CON BIT ESCONDIDO La mantisa normalizada con bit escondido tiene la siguiente formula: 1.xx*2x Donde xx es la fracción y la mantisa es 1.fracción. Este sistema elimina la redundancia que producía el punto flotante. Esto se consigue con un 1 a la izquierda del punto, pero este uno no se guarda ja que se pone mediante hardware. El poner este uno implica que no podemos representar el número 0. Punto flotante Mantisa normalizada 1-2=-1 # bits desplazados 0.01*21 1.00*2-1 0,5 0 0.10*2 1.00*2-1 REPRESENTACIÓN PUNTO FLOTANTE IEEE 754 Este estándar especifica cuatro precisiones: simple, simple extendido, doble y doble extendido. Los dos primeros disponen de 32 bits para la representación y los dos últimos de 64 bits. Los números en simple precisión se representan utilizando 32 bits: 1 para el signo, 8 para el exponente y 23 para la fracción. El exponente es un número con signo que se representa, utilizando el exceso en 127. La fracción representa un número menor que uno, pero la mantisa del número es uno más la parte fraccionaria. 31 30 23 22 0 1 8 23 s EXPe Fracción Tenemos la mantisa en signo y magnitud. El exponente está en exceso 2n-1-1. Exceso 127 EXPe = EXP+127 La mantisa esta normalizada con bit escondido. La ecuación de la codificación queda como sigue: x =(-1)s*1.F*2EXPe-127 Con esta codificación hay dos valores para el exponente que no podemos utilizar y que estan reservados para codificar otros valores. El rango de EXPe es el siguiente: [1..254] AC - 26 Los exponente 0 y 255 son los exponentes reservados, que permiten codificar: - Los Not-a-Number (NaN) que son los números que se producen al realizar un raiz de un número negativo. (-) - El valor infinito, pudiendo realizar la operación 1/=0 - Como hemos visto en la línea de arriba, estos exponentes también permiten, codificar el número 0. - También permite codificar los números denormales o subnormales, que serian los números más pequeños que utilizando el exponente mas pequeño, estos números están muy cerca del valor cero. La codificación del cero es: · EXPe=0, F=0 0 Y la codificación de los denormales es: · EXPe=0, F 0 Denormales. x =(-1)s·0.F*2-127 Esta es una codificación de los denormales pero con redundancia. La codificación del infinito es: · EXPe=255, F=0 La codificación de los NaN es: · EXPe=255, F0 NaN El rango que obtenemos con la norma IEEE 754 es el siguiente: max = 1.11....1*2254-127 = 11.....1.*2254-127-23= (224-1)*2104= 2128-2104 23 24 min (normalizado) = 1.00.....0*21-127= 21-127=2-126 min (denormales) = 0.00.....01*2-127= 2-127-23 = 2-150 El estándar también define cuatro formas de hacer el redondeo pero nosotros solo nos basaremos en una: - Redondeo al más próximo (Round to nearest) que redondea al número mas cercano, y en caso de empate se redondea al número par. 38 39 40 41 42 38,3 38; 38,6 39; 38,5 38 La precisión (o error) consiste en que si sale un número que no podemos codificar, cual es la diferencia entre el número codificado mas cercano al deseado con dicho número. Error absoluto: 2 23 ·2 EXP = 2-24·2EXP 2 Error relativo: 2-24 MULTIPLICACIÓN EN PUNTO FLOTANTE - x 1 .F1 x 2 e y 1 .F 2 x 2 1 e2 z xy ( 1 .F1 )( 1 .F 2 ) 2 e1 e 2 Se ha de normalizar, redondear y obtener la máxima precisión del resultado. x 1. X X 1. Y Y x x x 1 z z. z x x x x x z z z G R z AC - 27 - Redondeo (después v v 1 .xxxxz | vyyyy v v de normalizar) 0 1 .xxxxz 1 , yyyy 0 1 .xxxxz 1 1 , yyyy 0 , z 0 1 .xxxxz 1 , yyyy 0 , z 1 1 .xxxxz 1 - Algoritmo 1. Multiplicar mantisas. Sumar exponentes en exceso a 127. 2. Test de casos especiales de mantisa (normalizar). Si bit mas peso de la mantisa es 1, desplazar 1 bit a la derecha y sumar 1 al exponente. 3. Redondear. 4. Test de overflow de mantisa. Si overflow volver al punto 2. 5. Test de casos especiales de overflow del exponente. 6. Test de valores especiales del resultado. Tenemos 48 bits y solo podemos almacenar 23 por lo tanto tenemos que redondear. La multiplicación se realiza multiplicación la mantisa y los exponentes por separado. 3*102 5*10-3 15*10-1 SUMA/RESTA EN PUNTO FLOTANTE - Algoritmo 1. Si e 1 e 2 intercambiar x por y. d e 1 e 2 . e e 1 2. 3. Desplazar m 2 ‘d=e1-e2’ posiciones a la derecha. Activar bits G,R i S Sumar o restar les nuevas mantisas en un sumador de n+3 bits en SyM 4. 0 Codificar el 0. Goto 9 OVF de mantisa Goto 5a Test de valores especiales k 1 zeros en major pes Goto 5a Normalitza t Goto 6 5. Normalizar a ) desplaçar m 1 posició a la dreta. Exp 1. Goto 6 b ) desplaçar m k posicions a la dreta. Exp - k. Goto 6 6. Redondear. 7. Si overflow mantisa: normalizar. 8. Test de casos especiales de overflow al exponente. 9. Test de valore especiales. Primero tenemos que pasa el punto flotante a punto fijo y después hacer la suma normal. x = 3*102 3,00000 *102 y = 5*10-3 0,00005 *102 3,00005 *102 AC - 28