• No results found

J. P Nettl viewed mobilization as a process which involves: (1) a commitment to action, and (2) a means of translating this

4. Interest articulation.

Generalmente el acceso a la tabla de correlación es directo, y no se utiliza una etiqueta (tag) para verificar que una entrada corresponda exactamente a

una determinada historia global. Así el mecanismo de selección de datos es simple y rápido, y se evita utilizar memoria para almacenar las etiquetas. El problema son los errores de alias, que una entrada de la tabla sea asignada a

varias combinaciones de historia diferentes, que se perjudiquen entre sí. El sistema de indexación debe tratar de reducir la probabilidad de estos errores, distribuyendo los datos de entrada de la forma más uniforme que sea posible entre los 2n posibles valores para el índice. Al aprovechar al máximo el

espacio disponible en la tabla de correlación es posible usar una historia global más larga para así aumentar la precisión.

El primer esquema de indexación que se ha utilizado es una variante de

gshare [YePa91], basada en el esquema propuesto en [JBSS97] y [JaRS97]. Este esquema ya fue presentado en el capítulo 3 y usado en los predictores definidos en el capítulo 4. La sección 3.5.1 mostraba cómo convertir un valor

v de más de n bits en un valor de n bits con una función que se denominaba xor-fold, basada en la operación “o-exclusivo”. En la Figura 5.14 volvemos a

mostrar el esquema para convertir la historia y la dirección del bloque básico o traza en varias secuencias intermedias de bits, que se juntan en una larga cadena para dar lugar al índice final.

historia(L) índice (L,I) dirección xor-fold-7 xor-fold-7 xor-fold-13 xor-fold-19 xor-fold-I xor-fold-13

Figura 5.14. Esquema de generación de índices, en función de la longitud en bits de

la historia, L, y de la longitud en bits del índice generado, I

En el esquema de indexación gshare los dos parámetros son la longitud en

bits del índice a la tabla, I, y la longitud en bits de la historia global, L. Cada

tamaño de tabla de correlación determina I, pero es necesario realizar

simulaciones para estimar el valor de L que proporciona mayor precisión.

El esquema de indexación denominado e-gskew, y propuesto en [MiSU97], divide el espacio de la tabla de correlación en tres tablas o bancos, cada uno de ellos indexado utilizando historias de diferente longitud. Las predicciones leídas de cada banco se comparan entre sí, y se escoge la predicción mayoritaria. En el caso de predecir números de traza de 2 o más bits, es posible que las tres predicciones difieran entre sí. En este caso, se escogerá la predicción de la tabla que utiliza una historia de menor longitud.

Un error de alias en uno solo de los tres bancos queda desapercibido por el esquema de selección mayoritaria. Al usar índices diferentes, se reduce

mucho la probabilidad de un error de alias en dos o más tablas a la vez. El banco que usa una menor longitud de historia aprende antes que los otros bancos, y por tanto es la mejor opción para realizar predicciones en frío.

5.3.4 Fase de Predicción

Las entradas en la fase de predicción son la dirección de una clase de trazas (Diri) y la historia global de saltos condicionales (ghisti). Los dos valores se

combinan para generar un índice con el que acceder a THT, tal como se ha

descrito en la subsección anterior. Simultáneamente, se usa la dirección de la clase de trazas (Diri) para indexar la tabla TTB y leer una entrada. El número

local de traza, LTN, leído de THT se utiliza para seleccionar la información de

TTB que corresponde a una de las 2K trazas (de trz0 a trz2K-1).

Para cada traza se utilizan 5 campos de información: v, Dir, tipo, nSaltos

y Ptrn (que se mostraron en la Tabla 5-3). El campo v es un bit que indica si

la información de la traza en la tabla es válida o no. El campo Dir contiene la

dirección de la clase de trazas que sigue a la traza, y que se utiliza para generar el valor Diri+1 con el que iniciar el siguiente ciclo de predicción. El

campo tipo codifica el tipo de instrucción con la que finaliza la traza. Si se

trata de un salto indirecto, o de una instrucción de retorno de subrutina, entonces se pueden utilizar predictores específicos para proporcionar mejor precisión que la obtenida por la dirección almacenada en Dir.

El campo nSaltos indica el número de instrucciones de salto condicional

que contiene la traza, y el campo Ptrn el patrón de resultados de estos saltos

condicionales. Ambos valores se utilizan para actualizar de forma especulativa la historia global y para generar el identificador de la traza predicha. La Figura 5.15 muestra que, en caso de acierto en la tabla TTB, la

historia global se actualiza desplazando la historia previa nSaltos bits hacia la izquierda y añadiendo por la derecha los nSaltos bits menos significativos

acierto: Diri+1 Dir

TIDi PC i · Ptrn

ghisti+1 (ghisti << nSaltos) · Ptrn

fallo: Diri+1 Diri + N

TIDi PC i · 000...0

ghisti+1 ghisti

Figura 5.15. Descripción formal del funcionamiento de la fase de predicción. La

operación “·” indica concatenar bits. La operación “<<” indica desplazar los bits hacia la izquierda.

El identificador de la traza (TIDi) se construye añadiendo los B bits del

campo Ptrn a la derecha de la dirección de la clase de trazas (Diri). Cabe

resaltar que LTP genera los patrones de saltos de las trazas con un ciclo de

retardo en comparación a como lo hace NTP. Si el valor de entrada es la dirección de la traza i, NTP predice la dirección de la clase i+1 y el patrón de

la traza i+1, mientras que LTP predice la dirección de la clase i+1 y el patrón

de la traza i.

En caso de fallo en TTB, se predice que la traza será un bloque básico

secuencial (sin saltos internos, nSaltos=0) y de tamaño máximo (N). La

dirección de la siguiente traza (Diri+1) se obtiene sumando N a la dirección de

la traza actual, y la historia global de saltos condicionales se deja tal como estaba. Por otro lado, el identificador de traza se construye añadiendo B

ceros a la derecha de la dirección de la traza.

La etapa del procesador posterior al predictor busca las instrucciones en memoria usando el valor TID. Para simplificar la interpretación de este

identificador, siempre se usan B bits para representar el patrón de saltos,

aunque algunos bits no proporcionen información. En cambio, al actualizar la historia global sólo se utilizan los bits que contienen información, para así maximizar la información contenida en la historia global. Para facilitar y acelerar la recuperación de un fallo de predicción se realizan múltiples copias de la historia global y, por tanto, cuanto menor sea su longitud, menor será la memoria requerida.