IA64-Itanium

9
IA-64 y el Intel Itanium Jos´ e Galaviz Casas * 1. Antecedentes Una de las primeras computadoras que us´ o pipeline (probablemente la segunda) fue el modelo 6600 de Control Data Corporation (CDC). La CDC 6600 apareci´ o en 1964 y fue la primera a la que se le denomin´ o “supercompu- tadora”, fue dise˜ nada por Seymour Cray quien en 1972 dej´ o Control Data para fundar su propia empresa, la que prolongar´ ıa la estirpe de las super- computadoras, Cray Research 1 . Hoy en d´ ıa los procesadores que utilizamos cotidianamente poseen pipeline. La primera m´ aquina con memoria cache fue el modelo 85 del sistema IBM 360 en 1968, un mainframe ıpico. Hoy en d´ ıa nuestras computadoras personales tienen t´ ıpicamente uno o dos niveles de cache. En las ´ ultimas d´ ecadas hemos sido testigos de como las caracter´ ısticas que antes solo pose´ ıan los equipos de c´ omputo de alto desempe˜ no, se han incorporado paulatinamente a los equipos m´ as peque˜ nos y comunes. En 1984 no hab´ ıa modo de comparar una Apple Macintosh o una IBM PC AT con una HP 9000, el desempe˜ no de la HP era muy superior al de las dos prime- ras, sus contempor´ aneas. Pero con el paso del tiempo el desempe˜ no de las computadoras personales ha ido acerc´ andose, hasta finalmente superar, el de las minicomputadoras y estaciones de trabajo, las que a su vez desplazaron a los mainframes de anta˜ no. Las mejoras tecnol´ ogicas y la disminuci´ on de costos han hecho posi- ble incorporar en peque˜ nos microprocesadores lo necesario para dotarlos de pipeline, caches, buses veloces, y dem´ as. Los procesadores de las compu- tadoras personales se parec´ ıan cada vez m´ as a los CPU’s de las “m´ aquinas grandes”. Cuando, durante la d´ ecada de 1980, el paradigma RISC se adue˜ no del mercado de alto desempe˜ no, los microprocesadores de equipos PC co- menzaron a disfrazarse de RISC. Actualmente casi cualquier PC moderna * Departamento de Matem´ aticas, Facultad de Ciencias, UNAM. [email protected] 1 Cray Research dej´ o de existir hace poco, en 1997 fue absorbida por Silicon Graphics. En buena medida las m´ aquinas Origin son producto del equipo “Cray” en Silicon Graphics. 71

description

Analysis of IA64 and Itanium architecture

Transcript of IA64-Itanium

  • IA-64 y el Intel Itanium

    Jose Galaviz Casas*

    1. Antecedentes

    Una de las primeras computadoras que uso pipeline (probablemente lasegunda) fue el modelo 6600 de Control Data Corporation (CDC). La CDC6600 aparecio en 1964 y fue la primera a la que se le denomino supercompu-tadora, fue disenada por Seymour Cray quien en 1972 dejo Control Datapara fundar su propia empresa, la que prolongara la estirpe de las super-computadoras, Cray Research1. Hoy en da los procesadores que utilizamoscotidianamente poseen pipeline.

    La primera maquina con memoria cache fue el modelo 85 del sistemaIBM 360 en 1968, un mainframe tpico. Hoy en da nuestras computadoraspersonales tienen tpicamente uno o dos niveles de cache.

    En las ultimas decadas hemos sido testigos de como las caractersticasque antes solo posean los equipos de computo de alto desempeno, se hanincorporado paulatinamente a los equipos mas pequenos y comunes. En 1984no haba modo de comparar una Apple Macintosh o una IBM PC AT conuna HP 9000, el desempeno de la HP era muy superior al de las dos prime-ras, sus contemporaneas. Pero con el paso del tiempo el desempeno de lascomputadoras personales ha ido acercandose, hasta finalmente superar, el delas minicomputadoras y estaciones de trabajo, las que a su vez desplazarona los mainframes de antano.

    Las mejoras tecnologicas y la disminucion de costos han hecho posi-ble incorporar en pequenos microprocesadores lo necesario para dotarlos depipeline, caches, buses veloces, y demas. Los procesadores de las compu-tadoras personales se parecan cada vez mas a los CPUs de las maquinasgrandes. Cuando, durante la decada de 1980, el paradigma RISC se aduenodel mercado de alto desempeno, los microprocesadores de equipos PC co-menzaron a disfrazarse de RISC. Actualmente casi cualquier PC moderna

    *Departamento de Matematicas, Facultad de Ciencias, UNAM. [email protected] Research dejo de existir hace poco, en 1997 fue absorbida por Silicon Graphics.

    En buena medida las maquinas Origin son producto del equipo Cray en Silicon Graphics.

    71

  • obtiene rendimientos comparables a los de las estaciones de trabajo RISC.Las supercomputadoras han dejado de ser rentables, su nicho de sobreviven-cia se mantiene difcilmente, clusters de equipos personales pueden obtenerrendimientos similares por una fraccion del costo.

    Lo que hemos observado es que los desempenos de las diferentes ca-tegoras de equipos de computo se han ido acercando hasta hacerse casiindistinguibles. La brecha se ha reducido.

    Pero ahora que sigue? como se puede mejorar el desempeno aun mas?Hay dos posibilidades [6]:

    1. Haciendo las operaciones mas rapido. Esto depende esencialmente de latecnologa de semiconductores y de metodos de diseno que minimicenlos niveles de logica digital necesarios para hacer las operaciones.

    2. Haciendo mas cosas al mismo tiempo. Esto es, incrementar, en la me-dida de lo posible el paralelismo a nivel de instrucciones (ILP o Ins-truction Level Parallelism). Hacer muchas instrucciones o trozos deellas al mismo tiempo, algo que se logra parcialmente con pipeline,pero que se puede hacer aun mejor.

    Luego de exito obtenido por Intel en 1971 con el primer microprocesador,el 4004, una compana fabricante de terminales para mainframes, Datapoint,solicito a Intel el diseno de un microprocesador para ser incorporado ensus terminales. La respuesta de Intel fue el primer procesador de 8 bits,el 8008 (1972), que contena todo lo necesario para manejar la logica deuna terminal, sus 8 bits e instrucciones especficas para manipular datos encodigo ASCII y BCD, le hacan posible manipular los caracteres enviadosdesde y hacia la computadora, tambien posea instrucciones especficas paramanipular cadenas.

    En 1974 salio al mercado el Intel 8080, otro procesador de 8 bits compati-ble con el 8008 pero que incrementaba las capacidades de este, por ejemplo,poda direccionar mas memoria (64Kb. contra los 16Kb. del 8008). En 1978sale el Intel 8086 y en 1979 el 8088 ambos de 16 bits y casi identicos (salvoel tamano del bus de datos y el de la cola de prefetch). Por supuesto am-bos podan ejecutar las mismas instrucciones del 8080, que a su vez podaejecutar las del 8008, y muchas mas. El 8088 fue el procesador elegido porIBM para su linea de computadoras personales en 1980 y esa decision hamarcado en buena medida las ultimas dos decadas en equipo de computo.

    Generacion tras generacion los procesadores de Intel para equipo decomputo personal han mantenido la lnea senalada por el 8086/8088. El

    72

  • poco conocido 80186, el 80286, 80386, 80486 y la familia Pentium son ca-paces de ejecutar aun las instrucciones de un 8008. Esas extranas operacio-nes aritmeticas con codigos ASCII y BCD y de manejo de cadenas siguenall. Esto ha sido una espada de doble filo. Por una parte Intel siempre hagarantizado que lo que se invierta en software no sera una inversion per-dida, si se compra un programa para una IBM PC XT se podra ejecutaren una AT, una 386, una con Pentium III. Por otra parte Intel ha tenidoque redisenar sus procesadores para competir en un mercado en constanteevolucion, sobrevivir contra los disenos RISC, competir con ellos y hasta ven-cerlos en desempeno no ha sido facil, seguramente todo ha sido mas difcildado que siempre han tenido que cargar con el pesado fardo de las masprimitivas maquinas CISC, con el desorganizado conjunto de instruccionesque crecio anarquicamente, como una enfermedad degenerativa que hay quearrastrar.

    Aparentemente las cosas estan por cambiar. Cuando Intel anuncio en1999 su nueva arquitectura IA-64 (Intel Architecture 64 bits), anuncio tam-bien su ruptura con el pasado y de hecho con buena parte del presente.El Itanium, el primer procesador de IA-64 tiene un nuevo conjunto de ins-trucciones, no es ya una maquina CISC, para ejecutar el codigo que podanejecutar sus ancestros tendra que traducir las instrucciones mediante hard-ware especfico para tal proposito. Esto hara, en principio, la ejecucion deprogramas viejos mas lenta, de hecho mas lenta de lo que sera su ejecucion enla arquitectura de Intel que mantendra la estirpe de 80X86 (IA-32 de la queel pentium 4 es el mas reciente representante). Literalmente se dice [7] Paraobtener un maximo desempeno en IA-32 debe considerarse fuertemente laarquitectura de Intel IA-32 en vez de IA-64.

    As que la arquitectura del Itanium, IA-64, no sera CISC (de hecho lasultimas generaciones de Intel IA-32 ya no pueden considerarse CISC). Tam-poco es RISC, mas bien es del tipo VLIW (Very Large Instruction Word),aunque Intel prefiere decir que es EPIC [2] (Explicitly Parallel InstructionComputing, siempre es bueno ponerle otro nombre a las cosas, sobre todosi hay que pagar derechos de patente). VLIW o EPIC como prefiere Intel,es el paradigma idoneo para incrementar el ILP. La segunda de las dos al-ternativas mencionadas para elevar el desempeno y que implica aun mascolaboracion compilador-arquitectura.

    Con las arquitecturas RISC que poseemos actualmente y las CISC quesobreviven incorporando cualidades RISC es ya difcil obtener mas ILP. Elprocesador no sabe ni puede saber, ni tiene por que saber, todo lo necesariopara lograr mas paralelismo. Quienes si saben lo necesario por poseer unavision mas global, son los compiladores y los sistemas operativos. Mucho

    73

  • del trabajo necesario para lograr sistemas de computo de mayor desempenorecaera en el software del sistema y en su perfecta coordinacion con el hard-ware.

    2. Dos tecnicas para incrementar el paralelismo

    IA-64 incorpora dos tecnicas hasta ahora poco explotadas para incremen-tar el paralelismo a nivel de instruccion, ambas deben ser usadas explcita-mente por los compiladores que generen codigo para IA-64 [1]: especulaciony predicacion.

    La especulacion consiste en hacer por adelantado algo que se consideramuy probable que ocurra. Consideremos el siguiente codigo en una maquinaload-store, supongamos ademas que el if es casi siempre verdadero y que elregistro R14 esta disponible.

    ; if (!a) a=b; else a+=4;

    LW R1, (R3) ; R3 direcccion de a

    BNEQZ R1, salto1 ; si R1 no es cero salto1

    LW R1, (R2) ; a=b, R2 direccion de b

    J salto2

    salto1: ADD R1, R1, 4 ; a+=4

    salto2: SW R1, (R3) ; guarda R1 en a

    haciendo especulacion, suponiendo que la parte del if casi siempre seejecuta podemos hacer lo siguiente:

    1 ; if (!a) a=b; else a+=4;2 LW R1, (R3) ; a en R13 LW R14, (R2) ; b en R144 BEQZ R1, salto2 ; si R1(a) es cero salto2, R14 tiene b5 ADD R14, R1, 4 ; si a no es cero sobreescribimos en R146 salto2: SW R14, (R3) ; guarda R14 en a

    Esta transformacion es redituable si es muy frecuente ejecutar el codigode la parte if de la instruccion, de ser as podramos de hecho cargar a yb con suficiente anticipacion y distanciando ambos LW de tal forma que nose atore el pipeline. El unico que puede saber lo necesario para hacer unatransformacion as es el compilador, asi que es el quien debe especular.

    Pero imaginemos que en la segunda version del codigo presentado arriba,ocurre un error al acceder a la localidad apuntada por R2 en la lnea 3.Estamos en problemas, la lnea 3 es pura especulacion, quizas ni siquieradebimos acceder a la localidad (R2), porque en la ejecucion del programa,la variable a es cero. Eso no lo puede saber el compilador porque es algo que

    74

  • ocurre en tiempo de ejecucion, as que debe haber intervencion del hardwarepara resolver el problema.

    En IA-64 en particular y en general en las arquitecturas con soportepara especulacion, se provee de mecanismos para verificar si lo que se hizofue correcto o no. Las instrucciones que hacen especulacion se diferencian yluego pasan por una verificacion que se encarga de que ocurra justo aquelloque hubiera ocurrido de ejecutar el programa original. En nuestro ejemplo lainstruccion de la lnea 3 debe ser marcada, si es un error acceder a (R2) hayque esperar hasta ver si se ejecuta la lnea 6 en ese caso el error realmentedebe ocurrir, si en cambio se ejecuta la lnea 5 hay que tomar las accionespertinentes para corregir el error. Esto se hace insertando una instruccionespecial para verificar los datos cargados especulativamente.

    En un Itanium una carga no especulada [4] se vera as:

    1 br.cond.spkt L1 ; salto condicional a L12 ld8 r3=[r5] ; carga 8 bits3 add r7=r3,r87 ; suma r3+r87 en r7

    Si suponemos, conservadoramente, que la latencia de memoria es de dosciclos entonces la secuencia de arriba produce un atoron de 1 ciclo en la lnea3. Especulando:

    1 ld8.s r3=[r5] ; carga 8 bits, especulacion2 ; otras instrucciones3 br.cond.spkt L1 ; salto condicional a L14 chk.s r3, recuperacion ;5 add r7=r3,r87 ; suma r3+r87 en r7

    donde recuperacion es la etiqueta asociada a la instruccion de iniciode la rutina de recuperacion para esta especulacion en particular, codigogenerado por el compilador. sptk significa que el salto es estaticamentepredicho como tomado (static predicted taken).

    Otra tecnica que favorece el paralelismo es la predicacion. Normalmentecuando el procesador se topa con un salto debe predecir si este sera tomadoo no, s la prediccion resulta incorrecta habra que hacer flush tirando a labasura lo que se haya cargado en el pipeline luego de la instruccion de salto,el trabajo ya hecho sobre el codigo cargado incorrectamente de pierde, amayor longitud del pipeline la perdida es mayor.

    La tecnica de predicacion permite incluso eliminar saltos. Consideremosel siguiente codigo en un Itanium;

    1 ; if (r1) r2 = r3 + r4;2 ; else r7 = r6 - r5;3 cmp.eq p1,p2=r1,0 ; p1=(r1==0)

    75

  • 4 (p1) br.cond cero5 add r2=r3,r46 br final7 cero: sub r7=r6,r58 final:

    En la lnea 4 se prueba el resultado de la comparacion de la lnea anterior.De ser verdadero que r1 es cero entonces p1 es verdadero. p1 es lo que seconoce como un predicado, es verdadero o falso de acuerdo con el resultadode la comparacion que le asigna su valor. Entonces en la lnea 4, si p1 esverdadero se lleva a cabo el salto a cero de otro modo se ejecutan las lneas5 y 6. p2 es tambien un predicado y es el complemento de p1. El salto de lalnea 5 debe predecirse.

    Ya que tenemos predicados podemos aprovecharnos de ellos y escribirtodo como sigue:

    1 ; if (r1) r2 = r3 + r4;2 ; else r7 = r6 - r5;3 cmp.eq p1,p2=r1,0 ; p1=(r1==0)4 (p1) sub r7=r6,r55 (p2) add r2=r3,r4

    Con esta traduccion es posible insertar algunas instrucciones entre laslneas 3 y 4 que haya que hacer de todos modos y entonces nunca perdemosel tiempo, no tenemos que predecir ni correr el riesgo de equivocarnos. ElItanium posee 64 registros de 1 bit para guardar predicados (formalmentehablando las evaluaciones de predicados) [4].

    3. Unidades funcionales

    El Itanium posee 9 unidades funcionales paralelas (superescalar) todasellas con pipeline [3]:

    Dos unidades de acceso a memoria (calculo de direcciones, load, store).

    Dos unidades de ejecucion de operaciones con enteros.

    Dos de ejecucion de operaciones de punto flotante y multimedia

    Tres de ejecucion de saltos.

    Las instrucciones de IA-64 estan divididas en cuatro categoras:

    I Operaciones con enteros.

    76

  • Figura 3.1: Dispersion de bundles (ternas de operaciones) en las unidadesfuncionales del Itanium. La tercera terna no puede ser completamente dis-tribuida, as que debe esperar un ciclo de reloj.

    F Operaciones con numeros en punto flotante.

    M Operaciones de acceso a memoria.

    B Saltos.

    Cada categora, como puede apreciarse corresponde a un rubro distinto delas unidades funcionales descritas arriba. As que pueden ser despachadasal mismo tiempo diferentes instrucciones a diferentes unidades funcionales.De hecho el Itanium maneja grupos de tres instrucciones, lo que Intel llamabundle y que en terminologa mas usual es la palabra de instrucciones de unaarquitectura VLIW. Cada palabra de instruccion o bundle consiste de tresoperaciones elementales de algunas de las categoras mencionadas, es labordel compilador procurar que los bundles esten construidos de tal forma queno ocurran, en la medida de lo posible, hazards de datos, que se llenen lamayor cantidad de unidades funcionales y que no ocurra hazard estructuralcuando ya no alcanzan las unidades funcionales de algun tipo.

    Para auxiliar al compilador el Itanium procesa una ventana de dos bund-les y es capaz de hacer algo llamado rotacion en caso de que las unidadesfuncionales no alcancen. Supongamos la situacion en la que son enviados loscinco bundles que se observan en la figura 3. Los primeros dos de la primeraventana no tiene problema. Pero cuando se toma la segunda ventana ya noalcanzan las unidades de enteros, as que hay que esperar un ciclo de reloj ymover la ventana, no al siguiente par de bundles como se hubiera hecho encondiciones ideales, sino solo un bundle mas.

    Como consecuencia del manejo de bundles a traves de la ventana deejecucion el Itanium tiene un throughput maximo de 6 instrucciones porciclo de reloj.

    4. Caractersticas

    Como ya se dijo antes, el desempeno del Itanium dependera, mas delo usual, de la correcta relacion entre el software y el hardware [1]. Loscompiladores, a traves de instrucciones especficas para ello, tendran controltotal, si asi lo desean, sobre la prediccion de salto, el orden de las operaciones,la predicacion y la especulacion. En particular el compilador puede decidir,

    77

  • como en uno de nuestros ejemplos previos, si un salto debe ser predichoestaticamente o dinamicamente con base en su historial. Tambien puededecidir si un salto debe ser predicho tomado o no tomado, en caso de serestatica la prediccion. El Itanium posee el hardware necesario para poderofrecer estas facilidades al compilador. En particular posee diversas tablasrelacionadas con saltos [3]:

    BPT (Branch Prediction Table) y MBPT (Multiway Branch PredictionTable). Ambas para predecir dinamicamente si seran o no tomadoslos saltos, cada tabla se encarga de diferentes tipos de bundles. Porejemplo la BPT se ocupa de los saltos contenidos en ternas del tipoMMB mientras que la MBPT se encarga de los MBB o BBB (ternascon mas de un salto en general). Ambas tablas son asociativas deconjunto de 4 opciones

    TAR (Target Address Register) una tabla de cuatro entradas manipu-lada directamente por el compilador para especificar la direccion desaltos predichos estaticamente y TAC (Target Address Cache) una ta-bla de 64 entradas responsable de proporcionar la direccion de saltopara los predichos dinamicamente.

    Una pila de direcciones de retorno.

    El Itanium poseera tres niveles de cache, L1 y L2 en el chip y L3 exterior.el cache L1 sera asociativo de conjunto de 4 opciones con bloques de 32 bitscapaz de hacer dos accesos por ciclo con latencia de dos ciclos, write throughty no-write allocate [3]. El nivel L1 esta dividido en datos y codigo.

    El cache de nivel L2 es unificado, asociativo de conjunto de 6 opciones,write back y write allocate con bloques de 64 bytes, dos accesos por ciclo conlatencia de 6 a 9 ciclos.

    Adicionalmente el Itanium posee buffers de traduccion de direccionesreales a direcciones de cache, para evitar tener que traducir direcciones realesa direcciones de cache todo el tiempo, basandose en el principio de locali-dad. Para ello posee dos niveles de buffers de traduccion de direcciones oTLBs (Translation Lookaside Buffer) para datos. Ambos completamenteasociativos. El TLB de datos de nivel L1 tiene 32 entradas y el de nivel L2tiene 96 entradas. El TLB de codigo es de un solo nivel y es completamenteasociativo de 64 entradas.

    El Itanium posee 128 registros de proposito general de 64 bits y el mis-mo numero de registros para punto flotante. 64 registros de un bit parapredicados [2, 4].

    78

  • Adicionalmente tiene registros para manejo de saltos, unos obscuros re-gistros de aplicacion, registros para monitoreo de desempeno y registros deidentificacion de la version de IA-64 implementada que identifican al proce-sador (CPUID).

    Los registros de proposito general poseen un bit adicional (i.e. en realidadson de 65 bits), este sirve para indicar si el estado del registro es valido o no,algo util cuando se hace reordenamiento de instrucciones, este bit se llamaNaT (Not A Thing).

    Referencias[1] Zahir, Rumi, J. Ross, D. Morris y D. Hess, OS and Compiler Consi-

    derations in the Design of the IA-64, en Computer Architecture NewsACM, 28(5), diciembre de 2000, pp. 212-221.

    [2] Monson, Heidi, The Arrival of the 64bit CPUs, Itanium and Sled-gehammer, en http://www.sysopt.com, octubre de 1999.

    [3] Itanium Processor Microarchitecture Reference, Intel, marzo de 2000,en http://www.intel.com.

    [4] IA-64 Architecture Software Developers Manual, junio de 2000, enhttp://www.intel.com.

    [5] Intel Itanium (Merced) 64 bit, en http://www.geek.com.

    [6] Diefendorff, Keith, PC Processor Microarchitecture, MicroprocessorReport, julio 12, 1999.

    [7] Inside Intels Merced: An Executive White Paper, Intel, julio 1999.

    79