02
02
1 (Ejercicios de clase)
La memoria principal de un procesador vectorial con capacidad de 16 Mpalabras se
encuentra distribuida entre 8 módulos utilizando entrelazado de memoria de orden
inferior y acceso de tipo S. Suponiendo que el compilador ha almacenado en memoria,
por filas, una matriz 4x4, obtenga: (a) Las posiciones de memoria en las que se sitúa la
segunda columna de la matriz teniendo en cuenta que la matriz comienza a partir de la
posición A6BBh. (b) ¿Puede el procesador leer la segunda columna realizando un único
acceso a memoria? ¿Por qué?
Solución.
(a) Puesto que la memoria tiene 16 Mpalabras, las direcciones serán de 24 bits, y como
se encuentra distribuida en 8 módulos con entrelazado de orden inferior, los 3 bits (23=8
módulos) menos significativos de la dirección indican el módulo en que se encuentra la
palabra direccionada.
Según esto, y teniendo en cuenta está almacenada por filas, la matriz se situará en la
memoria según se indica en la siguiente tabla, donde se indican en gris las posiciones
donde están los elementos de la columna 2
0 1 2 3 4 5 6 7
(000) (001) (010) (011) (100) (101) (110) (111)
0000 0000 1010 0110 1011 1 (1,1) (1,2) (1,3) (1,4) (2,1)
0000 0000 1010 0110 1100 0 (2,2) (2,3) (2,4) (3,1) (3,2) (3,3) (3,4) (4,1)
0000 0000 1010 0110 1100 1 (4,2) (4,3) (4,4)
Esto quiere decir que las direcciones de los elementos son (uniendo los 21 bits más
significativos que indican la profundidad dentro del módulo en la primera columna de la
tabla, con los bits que indican el módulo en la columna correspondiente):
(1,2) 0A6BCh
(2,2) 0A6C0h
(3,2) 0A6C4h
(4,2) 0A6C8h
(b) puesto que las posiciones de los elementos de la columna están en tres
profundidades diferentes y el acceso es de tipo S, en el que se pueden leer en el mismo
acceso las palabras que estén a la misma profundidad, se necesitarán tres accesos a
memoria. No se puede acceder a la comuna en un sólo acceso.
2 (Ejercicios de clase)
En la situación del problema anterior, obtenga el tiempo mínimo que necesitaría el
procesador vectorial para acceder a la segunda columna de la matriz suponiendo una
frecuencia de 100 Mhz y un tiempo de acceso a memoria Ta=8t, donde t es el tiempo de
ciclo del procesador.
Solución.
Teniendo en cuenta que el acceso es de tipo S y los elementos de la columna están a tres
profundidades diferentes, se necesitarán tres accesos.
t (1,2)
t t (2,2) (3,2)
Ta t (4,2)
Ta
Ta
Figura 5.7 Secuencia de accesos a memoria para leer la columna 2 de la matriz
Direcció 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
00
n 1 2 3 4 5 6 7 8 9 A B C D E F 0 1 2 3 4 5 6 7 8 9 A B C D E F
0x34BC0
0x34BE0
0x34C00
0x34C20
0x34C40
Con lo que para acceder a todos los datos del vector tendremos que generar las 5
direcciones de la primera columna de la tabla anterior, es decir, que son necesarios 5
accesos a memoria.
Solución.
El primer paso para resolver este problema es ver cómo se encuentran repartidos los
elementos del vector entre los módulos de memoria. Tenemos una memoria de 16 MB =
224 Bytes, repartida en módulos de 512 KB = 219 Bytes, lo que quiere decir que
tendremos un total de 25 = 32 módulos de memoria. Si se utiliza entrelazado inferior y
acceso tipo S para acceder a ellos, las posiciones de memoria consecutivas se
encontrarán en módulos de memoria consecutivos, y como hay 32 módulos, en el
módulo 0 estarán todas las direcciones múltiplo de 32, 0x20 en hexadecimal. Teniendo
esto en cuenta, y que el mayor múltiplo de 0x20 por debajo de 0x021BC5 es 0x034BC0
(escribimos las direcciones con 6 dígitos para hacer hincapié en que la memoria tiene 16
MB, y que por tanto, se direcciona con direcciones de 24 bits o 6 dígitos
hexadecimales), los datos estarán colocados en las posiciones de memoria sombreadas
de la siguiente figura:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
Dirección 00
1 2 3 4 5 6 7 8 9 A B C D E F 0 1 2 3 4 5 6 7 8 9 A B C D E F
0x021BC0
0x021BE0
0x021C00
0x021C20
Con lo que para acceder a todos los datos del vector tendremos que generar las 4
direcciones de la primera columna de la tabla anterior, es decir, que son necesarios 4
accesos a memoria.
5 (Ejercicios de clase)
Un procesador vectorial con registros vectoriales de 8 elementos tiene una memoria de
1 Mpalabra distribuida entre 8 módulos con entrelazado de orden superior y acceso de
tipo C. Suponiendo que la primera componente se encuentra en la posición AA012h,
¿en qué posiciones situaría los restantes 7 componentes para que el acceso a dicho
vector sea lo más rápido posible?
Solución.
Teniendo en cuenta que la memoria tiene una capacidad de 1 Mpalabra la dirección de
palabra consta de 20 bits, y como está distribuida en 8 módulos con entrelazado
superior, la dirección de módulo corresponde a los 3 bits más significativos. En la
Figura 5.6 se muestra la distribución de bits de direcciones y la estructura de
interconexión para el acceso tipo C.
Señales
R/W Ocupado/
Completo M7 M6 M0
Registros de
Direcciones y
Controlador control
de Memoria
a19
a18 decod
a17
a16
a[16:0]
a0
Entrelazado Superior y Acceso C
Figura 5.6 Direcciones y estructura para el acceso C
La dirección del primer elemento a cargar en memoria es:
Por lo que los tres bits más significativos son 101, indicando que se encuentra en el
módulo 5 (101) a la profundidad
Para que el acceso sea lo más rápido posible, teniendo en cuenta que el acceso es tipo C,
la única restricción es que las direcciones de los demás elementos se encuentren en
módulos de memoria diferentes. Además, aunque es lógico considerar que los 8
elementos 0,1,2,..,7 del vector se encuentren en direcciones crecientes de memoria, esto
es contradictorio con la necesidad de que el acceso sea lo más rápido posible ya que al
utilizarse entrelazado superior posiciones de memoria consecutivas estarán en el mismo
módulo. Una forma posible para situarlas es que estén en profundidades consecutivas
Con lo que se han introducido las componentes del vector en los 8 módulos y a dos
profundidades distintas (la 0 1010 0000 0001 0011 y la 0 1010 0000 0001 0010.
El tiempo de acceso a la línea será Ta+8 es decir, el tiempo de acceso a memoria para
captar la primera palabra, más un tiempo necesario para extraer la componente leída
desde los circuitos de acceso a memoria.
Solución.
Para responder al primer apartado, dibujaremos el contenido de la memoria desde la
posición 0x00120, en la que se encuentra X[0][0], hasta la posición 0x0014F, en la que
se encuentra X[7][5], ya que X es una matriz de 6 columnas por 8 filas (n = 8).
0 1 2 3 4 5 6 7
0x00120 X00 X01 X02 X03 X04 X05 X10 X11
0x00128 X12 X13 X14 X15 X20 X21 X22 X23
0x00130 X24 X25 X30 X31 X32 X33 X34 X35
0x00138 X40 X41 X42 X43 X44 X45 X50 X51
0x00140 X52 X53 X54 X55 X60 X61 X62 X63
0x00148 X64 X75 X70 X71 X72 X73 X74 X75
8 Contención Contención
7 (Ejercicios de clase)
Suponiendo que el tiempo de latencia de inicio (start-up), TLI, para una multiplicación
vectorial es de 10 ciclos de reloj y que después, el tiempo por resultado, TPC, es de 1
ciclo de reloj. ¿Cuál es el número de ciclos de reloj por resultado, CPR, para un vector
de 64 componentes?
Solución.
Aplicando la expresión del tiempo de cálculo vectorial TCV
TC V TLI K *TPC
se tiene que TCV = 10 + 64*1 = 74 ciclos, y por lo tanto el número de ciclos por
resultado es
TCV 74
C PR 1 .1 5 6
K 64
8 (Ejercicios de clase)
Si el tiempo de latencia de inicio (TLI) para una operación en un cauce vectorial es
(4/3)T, siendo T el tiempo de ejecución de dicha operación sobre un cauce escalar, y el
cauce vectorial genera un resultado cada T/3. ¿Cuál es el valor de Nv (número de
componentes que debe tener un vector para hacer que el modo vectorial sea más rápido
que el escalar) para dicho cauce?
Solución.
En la operación vectorial se tiene que
T*Nv ≥ (T/3)(4+Nv)
de donde
(4/3) ≤ (2/3)Nv → Nv ≥ 2
Es decir, que a partir de dos componentes, el modo vectorial es más rápido que el
escalar. Esta situación es ideal para un procesador vectorial puesto que el número de
componentes a partir del que interesa realizar la operaciones sobre un conjunto de
números como operación vectorial es el menor posible (dos, es decir más de una
operación a realizar). Las razones de esta situación se pueden encontrar es que el tiempo
de latencia de inicio no es mucho mayor que el tiempo de operación secuencial y el TPC
es reducido (tres veces menor que el tiempo secuencial).
9 (Ejercicios de clase)
Para un valor de TLI fijo, ¿es cierto que, a medida que TPC aumenta, disminuye la
longitud mínima del vector a la que el valor de TLI no es mayor que una fracción de
TCV dada?
Solución.
En el problema se indica que el tiempo de latencia TLI no debe ser mayor que una
fracción dada de TCV, por lo tanto se tiene que:
TLI TLI
C onst
TC V TLI K *TPC
T L I * (1 C o n s t )
K *TPC
C o n st
T L I * (1 C o n s t )
c
C on st
Por consiguiente, si
K*TPC = c
cuando TPC crece, K decrece; y si TPC decrece, K crece, como se quería demostrar.
Lo que se ha demostrado significa que, para un valor de TLI dado, a medida que el
cauce es más rápido (es decir, TPC es más pequeño), aumenta la longitud de los
operadores vectoriales necesaria para que el TLI sea un porcentaje prefijado del tiempo
de procesamiento total. Dicho de otra manera, cuanto más rápido genera resultados un
cauce vectorial, más largos tendrán que ser los vectores para hacer despreciable el valor
del tiempo de latencia inicial.
10 (Ejercicios de clase)
Si para un cauce el tiempo de latencia de inicio, TLI, es de 6 ciclos, y el tiempo por
resultado, TPC, es 1 ciclo.¿Cuál ha de ser la longitud mínima del vector que procese ese
cauce para que el TLI no representa más de un 5% del total del procesamiento?
Solución.
Teniendo en cuenta que TLI =6 y TPC=1, se cumple que
TCV = TLI + K*TPC = 6 + K
Si el tiempo de latencia de inicio no puede ser mayor que el 5% del tiempo total se tiene
que
y despejando,
Es decir que, para vectores mayores de 114 componentes se tendrá que el tiempo de
latencia de inicio es menor del 5% del tiempo de cómputo total.
Para que este resultado sea correcto debe cumplirse que el número de componentes de
los registros vectoriales del procesador vectorial sea mayor que 114 (un valor posible y
realista en ciertos procesadores, sobre todo de fabricantes japoneses puede ser 128).
Si el tamaño de los registros vectoriales es menor que 114 (MVL ≤ 114) entonces hay
que explicar la expresión del tiempo de procesamiento para el caso de troceado de
vector:
K
T L I 0 .0 5 * ( T B A S E * (T BUCLE T L I ) K * T P C
M V L
Para poder determinar explícitamente K, habría que conocer los valores de MVL,
TBUCLE, y TBASE. Supondremos valores típicos para ellos, utilizados en problemas
anteriores:
y sustituyendo
K
6 0 .0 5 * ( 1 0 * 2 1 K )
64
Para determinar K:
- Si se supone K ≤ 64 : Al despejar K de la expresión anterior se tiene que K>89,
y no es coherente con la suposición.
- Si se supone 64 < K ≤ 128: Al despejar K de la expresión anterior se tiene que
K ≥ 68, que es coherente con la suposición.
Es lógico que ahora el valor de K sea menor que en el cálculo anterior (68, en lugar de
114) dado que el tiempo de cálculo aumenta al incluirse los tiempos TBUCLE y TBASE.
11 (Ejercicios de clase)
Calcule los valores de Rinf y N1/2 para la secuencia de instrucciones de la figura 5.3
suponiendo que se encuentran dentro de un bucle como resultado de aplicar la técnica
de troceado de vector ('strip minning'). La secuencia de instrucciones tarda un tiempo
TCV=241 ciclos, TPC=3 ciclos, la frecuencia de reloj es de 80 Mhz, y el tamaño de los
registros vectoriales es de 64 componentes. Los valores de los tiempos TLI se dan en la
Tabla 1, TBASE=10, y TBUCLE=15.
TABLA 1
Operación Suma Vectorial Mult. Vectorial División Vect. Carga Vectorial
TLI 6 7 20 12
Solución.
Para resolver el problema se parte de la expresión del tiempo de cálculo vectorial
cuando se aplica troceado del vector.
n
Tn T BASE * (T BU CLE T L I ) n * T P C
M V L
donde, para determinar los parámetros que se necesitan, se tiene en cuenta el tiempo de
procesamiento que se proporciona en la Figura 5.3 para vectores de 64 componentes
(caben en los registros vectoriales del procesador): TCV=241 ciclos
Utilizando el modelo de prestaciones del cauce que definen las operaciones vectoriales
realizadas, TCV=TLI+k*TPC, donde k≤MVL. En este caso MVL=64, y k=64 (Figura
5.3), y como en el enunciado se indica que TPC=3 se puede despejar TLI:
TCV = (12+1+12+1+6+1+4+12)+3*64
TLI=49 TPC=3
Figura 5.4 Secuencia de operaciones vectoriales (encadenamientos y concurrencia)
n n
Tn 1 0 * ( 1 5 4 9 ) 3 * n 1 0 6 4 * 6 4 3 * n
64
O p e r a c .V e c t o r .* n * f r e c u e n c i a 2 * n *80
Rn M FLO PS
T n ( c ic lo s ) n
10 64 * 3* n
64
Para determinar el valor de Rinf hay que obtener el límite de Rn. Esto se puede realizar
teniendo en cuenta que se pueden establecer las cotas
2 * n *80 2 * n *80
Rn
n n
10 ( 1) * 6 4 3n 10 ( )* 64 3* n
64 64
1 2 * n *80
R 20
2 in f
n
10 * 64 3* n
64
y para despejar n, en primer lugar supondremos que n<64 y se comprueba que el
resultado final es coherente con dicha suposición (si no lo fuera habría que comprobar
con n mayor que 64 y menor que 128, y así sucesivamente). Por tanto, para n menor o
igual a 64 se tendría que
20 = (160*n)/(10+64+3*n)
12 (Ejercicios de clase)
Determine el valor de T66 y Rinf para la secuencia de instrucciones del problema anterior,
suponiendo que al añadir dos cauces de acceso a memoria más, TCV=104 ciclos y
TPC=1 ciclo. Los valores de TLI se dan en la Tabla 1, y TBASE=10, y TBUCLE=15.
Solución.
En este problema se considera un procesador vectorial que, comparado con el del
problema anterior, dispone de más cauces de acceso a memoria (dos más) de forma que,
la secuencia de instrucciones vectoriales se ejecuta en menos tiempo. Concretamente, se
indica que para vectores de 64 componentes (el tamaño de los registros vectoriales):
6+1 12 64
12+1 7+1
TLI= (12+1)+(7+1)+(6+1)+12=40
TPC=1
Figura 5.5 Secuencia temporal de operaciones vectoriales (encadenamientos y
concurrencia)
Así pues, teniendo en cuenta que TBASE= 10 ciclos, TBUCLE=15, MVL=64, y usando la
expresión de Rn, para n=66:
66
T 66 T BASE * ( T B U C L E T L I ) 6 6 * T P C 1 0 2 * ( 1 5 4 0 ) 6 6 * 1 1 8 6 ciclos
M VL
O p e r a c i o n e s .V e c t o r .* n * ( f r e c u e n c i a ( M H z ) ) 2 * n *80
Rn (M FLO PS) (M FLO PS)
n n
(1 0 * (1 5 4 0 ) n * 1 )( c ic lo s ) 10 55* n
64 64
para aplicar el límite cuando n tiende a infinito se tienen en cuenta las cotas:
2 * n *80 2 * n *80
Rn
n n
10 ( 1) * 5 5 n 10 ( )*55 n
64 64
2 * n *80 160
R lim R n lim 8 6 .0 5 M F L O P S
in f
n n n 55
10 ( )*55 n 1
64 64
13 (Ejercicios de clase)
¿Cuál es el tiempo de ejecución, Tn, y el número e ciclos por resultado, CPR, para la
operación vectorial A=B*s, donde s es un escalar y los vectores tienen 200 componentes
(n=200)?
Suponga que:
- La máquina tiene registros vectoriales de 64 componentes
- TBASE=10, TBUCLE=15, y TPC=3
- Los tiempos de latencia de inicio son TLI(load/store)=12 ciclos,
TLI(multiplicación)=7 ciclos, TLI(encaminamiento unidad_de_datos/memoria o
viceversa)=4 ciclos.
Solución.
A continuación, en la Figura 5.1, se muestra el programa en DLXV, donde se considera
que los vectores A y B tienen sus direcciones de memoria cargadas inicialmente en los
registros Ra y Rb, y que el escalar s están en el registro Fs.
; low = low + VL
ADD Ra,Ra,R1 ; Apuntar al siguiente trozo de A
ADD Rb,Rb,R1 ; Apuntar al siguiente trozo de B
; VL = MVL
ADDI R1,R0,#512 ; Cada trozo de vector tiene 64 elementos de 8 bytes (512)
MOVI2S VLR,R3 ; La longitud del vector es 64 (VL=64)
SUB R4,R2,Ra ; R4 = R2 – Ra
BNZ R4,loop ; Si R4 no es 0 hay que repetir el bucle
Figura 5.1 Código DLXV del cálculo de A=s*B
Teniendo en cuenta los datos del problema, n=200, MVL=64 (número de componentes
de los registros vectoriales), y se define
n
Tn T BASE * (T BU CLE T L I ) n * T P C
M V L
200
Tn 1 0 * ( 1 5 T L I ) 2 0 0 * 3
64
donde falta conocer el valor de TLI. Para estimarlo, tal y como muestra la Figura 5.2, se
tienen en cuenta los tiempos de latencia de los cauces de carga de memoria (LOAD) y
multiplicación, considerando además los ciclos necesarios para encaminar los datos
desde un cauce hasta el otro (4 ciclos, según el enunciado), y el almacenamiento final
(STORE)
Tn 8 2 6
C PR 4 .1 3
n 200
LOAD
12 n<64
4
7 STORE
mult 4
12
14 (Ejercicios de clase)
En un procesador vectorial con registros vectoriales de 16 componentes, una sóla
unidad de carga/almacenamiento de memoria (LV/SV) y un único multiplicador, se
ejecuta el bucle
y considerando que TBASE =15 ciclos; y TBUCLE=10 ciclos; calcule para el bucle, los
valores del tiempo de ejecución, T342, y el valor de Rinf.. ¿Cuáles serían los valores
anteriores si se dispusiese de 2 multiplicadores y de 3 unidades de
carga/almacenamiento?
Solución.
Teniendo en cuenta los datos de comienzo y final de cada instrucción que se dan en el
enunciado se puede construir el diagrama que se da a continuación:
7 23
...
7 46
...
10 34
...
10 60
...
7 68
...
... 7
A partir de este diagrama se puede determinar la latencia del cauce. Para ello, basta
considerar la barra en la parte inferior de la figura. Los tramos claros corresponden al
tiempo fijo asociado a las latencias individuales de algunos de los cauces. Los tramos
más oscuros tendrán longitudes que variarán en función del número de componentes.
Además, hay tres ciclos más que considerar, correspondientes a las discontinuidades en
la barra.
Por tanto, el tiempo de procesamiento para n componentes, siendo n<16 (tamaño de los
registros vectoriales) es:
T(n<16) = 7 + 1 + 10 + n + 10 + 1 + n + 7 + 1 + 7 = 44 + 2*n
342
T 342 T BA SE T B U C L E T L I 3 4 2 T P C
M V L
342
T 342 1 5
16 1 0 4 4 3 4 2 2 1 9 0 9
y para Rinf se tendrá que:
3* n * f 3* n * (5 0 0 * 1 0 6 )
R in f lim
n T n ( c ic lo s)
lim
n n
2 7 9 .0 7 M F L O P S
15 ( 1 0 4 4 ) 2 n
16
T(n<16) = 7 + 2 + 10 + 1 + 7 + 1 + n + 7 = 35 +n
7 23
...
7 24
...
10 34
...
10 35
...
7
...
... 7
Por lo tanto, utilizando las mismas expresiones que antes, se puede determinar T342 y
Rinf:
342
T 342 T BA SE T B U C L E T L I 3 4 2 T P C
M V L
342
T 342 1 5
16 1 0 3 5 3 4 2 1 1 3 4 7
3* n * f 3* n * (5 0 0 * 1 0 6 )
R in f lim
n T n ( c ic lo s)
lim
n n
3 9 3 .7 M F L O P S
15 ( 1 0 3 5 ) n
1 6
En un procesador vectorial, con una frecuencia de reloj de 500 MHz y con registros
vectoriales de 16 componentes, se ejecuta el siguiente bucle utilizando la técnica de
troceado del vector (strip mining).
Solución.
Sabemos que en un procesador vectorial, el tiempo para procesar una operación
completa vectorial (para los 16 elementos que caben en un registro vectorial) es:
TCV TLI 63 15
TPC 3
MVL 16
Una vez obtenido el tiempo por componente, el tiempo de ejecución del programa se
obtiene mediante la siguiente expresión:
k
Tk TBASE TLI TBUCLE k TPC
MVL
317
T317 10 15 20 317 3 1661 ciclos 1661 6 segundos
16 500 10
Por tanto, el máximo rendimiento se obtendrá cuando el tamaño del vector tienda a
infinito, es decir,
25 10 8
R lim Rk 481.93 MFLOPS
k 35
3
16
for i=1 to N do X[i] = a*Y[i]; X[i], Y[i] y a son números en coma flotante
Se ejecuta en un procesador vectorial de 32 bits que dispone de una única unidad para
acceder a los datos de memoria. Los tiempos de latencia de inicio para los cauces son
TLI(LV)=5 ciclos, TLI(MULTSV)=10 ciclos, y TLI(SV)=5 ciclos, y los registros
vectoriales tienen 64 componentes (MVL=64). Se tiene que T BASE=15 ciclos, TBUCLE=10
ciclos, y la frecuencia del procesador es igual a 1 GHz
Solución.
Dado que el tamaño de los registros vectoriales del procesador propuesto en el problema
es MVL = 64 y que el vector que deseamos procesar tiene un tamaño N que no está
definido, tendremos que aplicar la técnica de strip-mining para trocear el vector y
procesarlo iterativamente. El compilador realizará un cambio al código similar a este:
low = 1;
VL = (n mod MVL); /* resto de la division */
for ( j = 0 ; j <= (n / MVL) ; j++)
{
for ( i = low ; i < low + VL ; i++)
X(i):= a*Y(i);
low += VL;
VL = MVL;
}
10 MULTSV VX, a, VY
5 SV RX, VX
5 64 64 5
k
Tk TBASE TLI TBUCLE k TPC 15 k 10 10 2·k ciclos
MLV 64
64
1024
T1024 15 10 10 2 1024 2383 ns
64
Solución.
Dado que el tamaño de los registros vectoriales del procesador propuesto en el problema
es MVL = 32 y que el vector que deseamos procesar tiene un tamaño n = 342 mayor,
tendremos que aplicar la técnica de strip-mining para trocear el vector y procesarlo
iterativamente. El compilador realizará un cambio al código similar a este:
low = 1;
VL = (n mod MVL); /* resto de la division */
for ( j = 0 ; j <= (n / MVL) ; j++)
{
for ( i = low ; i < low + VL ; i++)
Z(i) = a*Z(i) + X(i);
low += VL;
VL = MVL;
}
el primer paso consistirá en estimar el tiempo Tk. Teniendo en cuenta las latencias
iniciales del enunciado y la existencia de tres unidades de carga/almacenamiento, un
sumador y un multiplicador, el diagrama de tiempos de estas tres instrucciones es el
siguiente:
TLI = 8 LV V1, Rz
TLI = 8 LV V2, Rx
TLI = 8 SV V4, Rz
k
Tk TBASE TLI TBUCLE k TPC 8 k 40 10 k cilos
MLV 32
32 32
18 (Examen septiembre 2004)
En un procesador vectorial a 1 GHz, con registros vectoriales de 64 componentes, tres
unidades de carga/almacenamiento de memoria (LV/SV), un sumador y un
multiplicador, se ejecuta el bucle:
Solución.
Dado que el tamaño de los registros vectoriales del procesador propuesto en el problema
es MVL = 64 y que el vector que deseamos procesar tiene un tamaño n = 342 mayor,
tendremos que aplicar la técnica de strip-mining para trocear el vector y procesarlo
iterativamente. El compilador realizará un cambio al código similar a este:
low = 1;
VL = (n mod MVL); /* resto de la division */
for ( j = 0 ; j <= (n / MVL) ; j++)
{
for ( i = low ; i < low + VL ; i++)
Z(i):= Z(i)+X(i)*Y(i);
low += VL;
VL = MVL;
}
el primer paso consistirá en estimar el tiempo Tk. Para ello, debemos determinar las
instrucciones vectoriales que se ejecutarán dentro del bucle interno y la forma en que se
solaparán y encadenarán. Dichas instrucciones serán tres cargas vectoriales de X, Y, y Z,
una multiplicación, una suma y un almacenamiento del resultado en Z. El diagrama de
tiempos de estas instrucciones es el siguiente:
TLI=8 LV VX, RX
TLI=8 LV VY, RY
TLI=8 LV VZ, RZ
TLI=8 SV RZ, VZ
8 64 64 8
k
Tk TBASE TLI TBUCLE k TPC 8 k 16 10 2·k ciclos
MLV 64
64 64
Solución.
Dado que el tamaño de los registros vectoriales del procesador propuesto en el problema
es MVL = 32 y que el vector que deseamos procesar tiene un tamaño n = 350 mayor,
tendremos que aplicar la técnica de strip-mining para trocear el vector y procesarlo
iterativamente. El compilador realizará un cambio al código similar a este:
low = 1;
VL = (n mod MVL); /* resto de la division */
for ( j = 0 ; j <= (n / MVL) ; j++)
{
for ( i = low ; i < low + VL ; i++)
Z(i):= Z(i)+X(i)*Y(i);
low += VL;
VL = MVL;
}
el primer paso consistirá en estimar el tiempo Tk. Para ello, debemos determinar las
instrucciones vectoriales que se ejecutarán dentro del bucle interno y la forma en que se
solaparán y encadenarán. Dichas instrucciones serán tres cargas vectoriales de X, Y, y Z,
una multiplicación, una suma y un almacenamiento del resultado en Z. El diagrama de
tiempos de estas instrucciones es el siguiente:
TLI=8 LV VX, RX
TLI=8 LV VY, RY
TLI=8 LV VZ, RZ
TLI=8 SV RZ, VZ
8 32 32 8
k
Tk TBASE TLI TBUCLE k TPC 8 k 16 10 2·k ciclos
MLV 32
32 32
20 (Examen diciembre 2007)
En un procesador vectorial a 1 GHz, con registros vectoriales de 16 componentes, tres
unidades de carga/almacenamiento de memoria (LV/SV), un sumador y un
multiplicador, se ejecuta el bucle:
Solución.
El primer paso para calcular el rendimiento del procesador para el programa del
enunciado consiste en obtener el tiempo de latencia de inicio (TLI) y el tiempo que se
invierte por componente (TPC). Para ello nos ayudaremos del siguiente diagrama de
tiempos:
TLI=25 LV VX, RX
TLI=25 LV VY, RY
TLI=25 LV VZ, RZ
TLI=25 SV RZ, VZ
25 20 15 25 16
k
Tk TBASE TLI TBUCLE k TPC 8 k 85 10 1·k ciclos
MLV 16
16 16
Solución.
El tamaño de los registros vectoriales del procesador propuesto en el problema es MVL
= 32, que es bastante menor que el vector que deseamos procesar, que tiene un tamaño
n = 512 elementos. Por tanto, tendremos que aplicar la técnica de strip-mining para
trocear el vector y procesarlo iterativamente. Dado que R∞ se define como
el primer paso consistirá en estimar el tiempo Tk. Para ello, debemos determinar las
instrucciones vectoriales que se ejecutarán dentro del bucle interno y la forma en que se
solaparán y encadenarán. Dichas instrucciones serán tres cargas vectoriales de X, Y, y Z,
una multiplicación, una suma y un almacenamiento del resultado en Z. El diagrama de
tiempos de estas instrucciones es el siguiente:
TLI=8 LV VX, RX
TLI=8 LV VY, RY
TLI=8 LV VZ, RZ
TLI=8 SV RZ, VZ
44 32 8
k
Tk TBASE TLI TBUCLE k TPC 8 k 52 10 1·k ciclos
MLV 32
32 32
Si MLV = 64 TLI y TPC cambian, como se muestra en el siguiente diagrama.
TLI=8 LV VX, RX
TLI=8 LV VY, RY
TLI=8 LV VZ, RZ
TLI=8 SV RZ, VZ
8 64 64 8
En este caso, TLI = 8 + 8 = 16 y TPC = 2, ya que el SV debe esperar a los LV (sólo hay
tres unidades LV/SV). Con estos valores de TLI y TPC, obtenemos R∞:
64 64
Se dispone de dos cauces para acceder a los datos de memoria, pero las instrucciones de
carga LV no se encadenan (debe terminar completamente una para poder iniciar la
siguiente) ni entre ellas, ni con las demás. Las restantes instrucciones (MULTSV,
ADDV, SV) pueden encadenar sus cauces, los tiempos de latencia de inicio para los
cauces son TLI(LV) = 6 ciclos, TLI(MULTSV) = 9 ciclos, TLI(ADDV) = 5 ciclos, y
TLI(SV) = 6 ciclos, y los registros vectoriales tienen 64 componentes (MVL = 64). (a)
¿Cuál es el valor de Rinf suponiendo que TBASE = 15 ciclos, TBUCLE = 10 ciclos, y la
frecuencia del procesador es igual a 500 MHz?; (b) ¿Cuál sería el código escalar cor
arquitectura LOAD/STORE que implemente la secuencia de instrucciones vectoriales
anteriores? (c) Si ese código escalar se ejecuta en un procesador superescalar de 32 bits
a 500 MHz que consigue terminar un promedio de 2 instrucciones por ciclo en dicha
ejecución ¿es mejor utilizar el procesador superescalar que el vectorial para algún
tamaño del problema?
Solución.
El primer paso para calcular el rendimiento del procesador para el programa del
enunciado consiste en obtener el tiempo de latencia de inicio (TLI) y el tiempo que se
invierte por componente (TPC). Para ello nos ayudaremos del siguiente diagrama de
tiempos:
6 LV V1, R1
6 LV V2, R2
6 SV V4, R3
6 64 9+5+6 64
k
Tk TBASE TLI TBUCLE k TPC 15 k 26 10 2·k ciclos
MLV 64
Tk' 8 k /2 ciclos
Para ver si el uso de un procesador superescalar mejora al vectorial para algún tamaño
de vector sólo habría que comprobar si existe algún valor de k tal que Tk > Tk’. Como los
dos procesadores funcionan a una frecuencia de reloj de 500 MHz, podemos hacer la
comparativa en términos de ciclos, ya que el tiempo de ciclo de las dos máquinas es el
mismo. Por tanto, habría que ver para qué valores de k se cumple esta inecuación:
k k
15 36 2k 8k / 2 15 36 2k
64 64
Si 1 ≤ k ≤ 64, tenemos que 15 + 36 > 2k, o lo que es lo mismo, que k < 25.5.
Si 65 ≤ k ≤ 128, tenemos que 15 + 2·36 > 2k. Al resolver esta inecuación, tenemos que
k debería ser menor que 43.5, que está fuera del intervalo que habíamos supuesto. Esta
contradicción ocurre para también para valores más altos de k, por lo que podemos
concluir que para este programa concreto y con las dos arquitecturas del enunciado, se
mejorarían las prestaciones con el procesador superescalar solamente para vectores de
hasta 25 elementos. Para vectores mayores interesa más usar la arquitectura vectorial.
Se dispone de un único bus para acceder a los datos de memoria, y las instrucciones de
carga LV no se encadenan (debe terminar completamente una para poder iniciar la
siguiente) ni entre ellas, ni con las de almacenamiento SV. Los tiempos de latencia de
inicio para los cauces son TLI(LV)=5 ciclos, TLI(MULTSV)=10 ciclos, TLI(ADDV)=5
ciclos, y TLI(SV)=5 ciclos, y los registros vectoriales tienen 64 componentes
(MVL=64). (a) ¿Cuál es el valor de Rinf suponiendo que TBASE=15 ciclos, TBUCLE=10
ciclos, y la frecuencia del procesador es igual a 1 GHz?; (b) ¿Cuál sería el código
escalar para una arquitectura LOAD/STORE que implemente la secuencia de
instrucciones vectoriales anteriores? (c) Si ese código escalar se ejecuta en un
procesador superescalar de 32 bits a 1 GHz que consigue terminar un promedio de 2
instrucciones por ciclo en dicha ejecución ¿es mejor utilizar el procesador superescalar
que el vectorial para algún tamaño del problema?
Solución.
El diagrama de tiempos de la ejecución del código vectorial, teniendo en cuenta las
restricciones del enunciado, es el siguiente:
5 LV V1, R1
5 LV V2, R2
5 SV V4, R3
5 64 5 64 5 64
Al disponer tan solo de una unidad de acceso a memoria, se deben secuenciar las tres
operaciones de acceso a memoria, lo que nos causa un TPC = 3 ciclos y un TLI = 3·5 =
15 ciclos. Las instrucciones de multiplicación y suma se pueden solapar con las tres
operaciones de acceso a memoria. Con estos valores y con los valores de TBASE y TBUCLE
que nos dan en el enunciado del problema, podemos calcular Tk como:
k
Tk TBASE TLI TBUCLE k TPC 15 k 15 10 3·k ciclos
MLV 64
64 64
Contando sólo las instrucciones del cuerpo del bucle, se ejecutarían 8 × k instrucciones.
Como no se nos dice nada sobre el número de unidades funcionales o su latencia,
asumimos que no habrá riesgos en la ejecución y que se retirarán 2 instrucciones por
ciclo, con lo que el programa tardaría para un vector de tamaño k:
Tk' 8 k /2 ciclos
Para ver si el uso de un procesador superescalar mejora al vectorial para algún tamaño
de vector sólo habría que comprobar si existe algún valor de k tal que Tk > Tk’. Como los
dos procesadores funcionan a una frecuencia de reloj de 1 GHz, podemos hacer la
comparativa en términos de ciclos, ya que el tiempo de ciclo de las dos máquinas es el
mismo. Por tanto, habría que ver para qué valores de k se cumple esta inecuación:
k k
15 25 3k 8k / 2 15 25 k
64 64
Si 1 ≤ k ≤ 64, tenemos que 15 + 25 = 40 > k.
NOTAS: Los tiempos de latencia de inicio para los cauces son TLI(LV)=8 ciclos,
TLI(MULTSV)=9 ciclos, TLI(ADDV)=5 ciclos, y TLI(SV)=8 ciclos.
Solución.
Para poder calcular Rinf es necesario calcular primero los valores de TLI y TPC para el
programa del enunciado. Para ello es muy útil el siguiente diagrama, en el que se
muestra la temporización de la ejecución de cada una de sus instrucciones:
8 lv v1, A(r0)
8 lv v2, B(r0)
8 sv C(r0), v4
8 64 8 64 8 64
k
Tk TBASE TLI TBUCLE k TPC 15 k 24 10 3·k ciclos
MLV 64
Rk
k operaciones vectoriales frecuencia k 2 750 106
Tk k
15 34 3·k
64
8 lv v2, B(r0)
8 sv C(r0), v4
8 9 5 8 64
En este caso, TPC = 1 y TLI = 8 + 9 + 5 + 8 = 30, así que rehaciendo las cuentas
tenemos que:
k
Tk TBASE TLI TBUCLE k TPC 15 k 30 10 1·k ciclos
MLV 64
Y la productividad del cauce:
Rk
k operaciones vectoriales frecuencia k 2 750 10 6
Tk k
15 40 k
64
1 1
Tks NI CLI Treloj 8k 2 9 4k 1 10 9 s
2 10
k
15 34 3k
k 64 k
Tkv 15 34 3k ciclos s 20 45,3 4k 10 -9 s
64 750 10 6
64
Para saber si hay algún tamaño del problema tal que el procesador superescalar sea
mejor que el vectorial, hay que encontrar un valor de k tal que Tk Tk , es decir, hay
s v
k
4k 1 20 45,3 4k
64
O lo que es lo mismo:
k
19 45,3
64
que es cierto para cualquier valor de k, lo que implica que el procesador superescalar es
mejor que el vectorial para cualquier tamaño de problema.
25 (Examen febrero 2004)
En un procesador vectorial a 500 MHz, con registros vectoriales de 16 componentes,
una única unidad de carga/almacenamiento de memoria (LV/SV) y un único
multiplicador, se ejecuta el bucle:
(Nota: TLI(Mult) =16 ciclos; TBASE=8 ciclos; TBUCLE=10 ciclos; y la memoria es de tipo
S y está ajustada de forma que el tiempo de acceso T a=M*t, donde M es el número de
módulos y t el tiempo de ciclo del procesador).
Solución.
Dado que el tamaño de los registros vectoriales del procesador propuesto en el problema
es MVL = 16 y que el vector que deseamos procesar tiene un tamaño n = 342 mayor,
tendremos que aplicar la técnica de strip-mining para trocear el vector y procesarlo
iterativamente. El compilador realizará un cambio al código similar a este:
low = 1;
VL = (n mod MVL); /* resto de la division */
for ( j = 0 ; j <= (n / MVL) ; j++)
{
for ( i = low ; i < low + VL ; i++)
if (i mod 2 == 0) then Z(i) = a*Z(i);
low += VL;
VL = MVL;
}
el primer paso consistirá en estimar el tiempo Tk. Para ello hay que tener presente que
no se opera sobre todos los componentes del vector Z, sino solo sobre los componentes
pares del mismo. Para tratar esta situación podemos hacer uso del registro de máscara
VM fijándolo al valor (0101010101010101), de forma que solo se operará con los datos
situados en las posiciones pares de los registros vectoriales y los datos en las posiciones
impares permanecerán inalterados. Una vez inicializado el vector de máscara, el cuerpo
del bucle interno se reduce a una carga vectorial, una multiplicación y un
almacenamiento vectorial.
Ta = 16 LV
TLI(Mult) = 16 MULTV
Ta = 16 SV
k
Tk TBASE TLI TBUCLE k TPC 8 k 48 10 k cilos
MLV 16
Para calcular el valor de R∞ hay que tener en cuenta que para un vector de tamaño k se
realizarán k/2 operaciones flotantes, ya que solo se opera con los elementos pares, con
lo que debemos la expresión de R∞ queda como
1
k frecuencia 1
k 500 250k
R lim Rk lim 2
lim 2
lim 54,054 MFLOPS
k k Tk k k k k
8 48 10 k 8 58 k
16 16