2.10. INSTRUCCIONES DE DURACIÓN VARIABLE • Hay operaciones que requieren mayor tiempo de ejecución EX que otras. • Operaciones como multiplicación y división de enteros, u operaciones de punto flotante necesitan un tratamiento especial en su etapa de ejecución. • Mantener 5 etapas en la cadena pipeline implicaría alargar el periodo de reloj, para amoldarse a las operaciones de larga duración. Por otra parte, si añadimos más fases para las instrucciones largas, sería poco eficiente que todas las instrucciones tuvieran todas esas fases, puesto que las instrucciones largas son poco frecuentes. • Luego se aumenta el número de etapas en la cadena sólo donde se necesita: en las etapas de ejecución EX de operaciones largas. • Solución: Se tiene más de una unidad funcional para soportar estas nuevas instrucciones. Estas nuevas unidades funcionales pueden trabajar en paralelo con las demás. La cadena pipeline será la misma, pero la etapa EX se repite tantas veces como la operación lo requiera. • DLX: Se define con una unidad funcional (U.F.) para operaciones enteras simples, otra para multiplicaciones de enteros/FP, otra para divisiones de enteros/FP y otra para suma/resta FP, las cuales necesitan más de un ciclo para concluir su etapa EX. • Actualmente se disponen de muchas U.F. diferentes para enteros y para FP. 2.10. Instrucciones de duración variable. Arquitectura de Sistemas Paralelos I. 1 • Típicamente el DLX (1990) tiene una duracion de 1 ciclo para las operaciones de enteros simples, 5 ciclos para las multiplicaciones, 2 ciclos para sumas FP y 20 ciclos para divisiones FP. EX Enteros EX IF ID FP/Ent * MEM WB EX FP +/- EX FP/Ent / • Las unidades funcionales pueden estar segmentadas. Es decir, si la suma FP tiene 2 ciclos ⇒ A1 y A2 como etapas de ejecución, las cuales pueden estar ejecutando instrucciones diferentes. Para permitir esto es necesario añadir latches entre ambas subetapas para almacenar los valores intermedios. Las no segmentadas pueden producir bloqueos estructurales. 2.10. Instrucciones de duración variable. Arquitectura de Sistemas Paralelos I. 2 • Duración de una U.F.: número de ciclos desde que empieza la fase EX hasta que se produce un dato (como suponemos todos los bypasses en el DLX, entonces el nº c.bq. por RAW coincide con la Duración-1). • Intervalo de repetición/iniciación: número de ciclos entre el lanzamiento de 2 instrucciones del mismo tipo. Ej: si está segmentada vale 1. Unidad Funcional Fase Duración % SPEC- Intervalo de FP ALU entera simple Carga de memoria(Ent/FP) Suma / Resta FP Multiplicación (Ent/FP) División (Ent/FP) EX EX,MEM A1, A2 M1,…,M5 D1,…,D20 1 2 2 5 20 7.0 / 3.0 1.0/ 8.0 0.0/ 0.4 iniciación 1 1 1 1 20 (no segmentada) Para SPEC-INT el % de instr MUL es 0.02% y de DIV es prácticamente 0% • Aparecen los riesgos WAW. Ej: MULTU R1, R2, R3 BEQZ... ADD R1, R4, R5 • Los ciclos bloqueo por RAW crecen. Tip. CPIdatos(prog FP) >> CPIdatos(prog INT) • Aparecen bloqueos estructurales al no haber una duración fija de la cadena pipeline. En el DLX sin planif dinámica los consideraremos todos (así lo hace WINDLX). Es decir, los recursos (reg temp) de una fase no pueden estar replicados para 2 instr. 2.10. Instrucciones de duración variable. Arquitectura de Sistemas Paralelos I. 3 INSTR. PUNTO FLOTANTE EN EL DLX • Formato instrucciones DLX. ADDD Dd,Da,Db ADDF Fd,Fa,Fb SUBD Dd,Da,Db SUBF Fd,Fa,Fb Add double-precision numbers Add single-precision numbers Subtract double-precision numbers Subtract single-precision numbers. MULTD Dd,Da,Db MULTF Fd,Fa,Fb Multiply double-precision Floating point numbers Multiply single-precision Floating point numbers DIVD Dd,Da,Db DIVF Fd,Fa,Fb Divide double-precision Floating point numbers Divide single-precision Floating point numbers CVTF2D Dd,Fs CVTD2F Fd,Ds CVTF2I Fd,Fs CVTI2F Fd,Fs CVTD2I Fd,Ds CVTI2D Dd,Fs Converts from type single-precision to type double-precision Converts from type double-precision to type single-precision Converts from type single-precision to type integer Converts from type integer to type single-precision Converts from type double-precision to type integer Converts from type integer to type double-precision __D Da,Db Double-precision compares: "__" may be EQ, NE, LT, GT, LE or GE; sets comparison bit in FP status register Single-precision compares: "__" may be EQ, NE, LT, GT, LE or GE; sets comparison bit in FP status register __F Fa,Fb BFPT Dest BFPF Dest Test comparison bit in the FP status register (true) and branch; 16-bit offset from PC Test comparison bit in the FP status register(false) and branch;16-bit offset from PC 2.10. Instrucciones de duración variable. Arquitectura de Sistemas Paralelos I. 4 • Registros de punto flotante en el DLX. Hay 32 registros de simple precisión flotante: de F0 a F31. Tamaño 32 bit según IEEE754 (float de lenguaje C). Estos 32 registros se agrupan de 2 en 2 para formar 16 registros de doble precisión flotante con índice par: F0, F2, … F30. F0(double)=[F0,F1]. Tamaño 64 bit según IEEE754 (double de lenguaje C). NOTA: el tamaño de 64 bits provoca algunas dificultades en la implementación DLX, que no vamos a considerar. • Directivas .double y .float para declaración de variables FP en memoria. Ejemplo: Cronograma del código siguiente: LD F4, 0(R2) MULTD F0, F4, F6 ADDD F2, F0, F8 SD 0(R2), F2 Nota: Cálculo aproximado y rápido de c.bq. de datos: 1 + 4 + (1-1) = 5. (Duración-1 por cada RAW. El -1 último por Store). Es aprox. porque algunos c.bq. pueden enmascararse. Además pueden aparecer bloqueos estructurales. 2.10. Instrucciones de duración variable. Arquitectura de Sistemas Paralelos I. 5