Está en la página 1de 15

Capítulo 6

Procesamiento vectorial

Aquí va la intro…
Problemas
1. 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 4 × 4 elementos, 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
0xa6bb.

b) ¿Puede el procesador leer la segunda columna realizando un único acceso a


memoria? ¿Por qué?

c) Obtenga el tiempo mínimo que necesitaría el procesador vectorial para


acceder a la segunda columna de la matriz suponiendo que funciona a una
frecuencia de 100 MHz y que la memoria tiene un tiempo de acceso
Tacceso = 8t, donde t es el tiempo de ciclo del procesador.

Solución
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 que está almacenada por filas, la matriz se situará en la memoria según se
indica en la Tabla 1.

MÓDULO

DESPLAZAMIENTO 000 001 010 011 100 101 110 111


0000 0000 1010 0110 1011 1 (0,0) (0,1) (0,2) (0,3) (1,0)
0000 0000 1010 0110 1100 0 (1,1) (1,2) (1,3) (2,0) (2,1) (2,2) (2,3) (3,0)
0000 0000 1010 0110 1100 1 (3,1) (3,2) (3,3)

Tabla 1. Ubicación de los elementos de la matriz en los módulos de memoria del problema 1.

Esto quiere decir que las direcciones de los elementos son (uniendo los 21 bits más significativos que
indican el desplazamiento dentro del módulo en la primera columna de la tabla, con los bits que
indican el módulo en la columna correspondiente):

 Elemento (0,2): 0000 0000 1010 0110 1011 1101 = 0x00a6bd

 Elemento (1,2): 0000 0000 1010 0110 1100 0001 = 0x00a6c1

 Elemento (2,2): 0000 0000 1010 0110 1100 0101 = 0x00a6c5

 Elemento (3,2): 0000 0000 1010 0110 1100 1001 = 0x00a6c9

Como el acceso a memoria es de tipo S, se podrá acceder simultáneamente al mismo desplazamiento


en todos los módulos de memoria. Sin embargo, dado que los elementos de la segunda columna de la
matriz están situados en tres desplazamientos diferentes, será necesario realizar tres accesos a memoria
para leer la columna completamente. Considerando que se desea acceder a los elementos de la
columna de forma ordenada, en el primer acceso a memoria se podrá acceder al elemento (0, 2)
necesitándose un tiempo Tacceso. Mientras se lee el elemento del búfer correspondiente, se realiza el
segundo acceso para acceder a los elementos (1, 2) y (2, 2). Finalmente, mientras se extraen esos
elementos de los correspondientes búferes, se realiza el tercer acceso para acceder al elemento (3, 2).
Al terminar el acceso, hay que extraer el elemento (3, 2) del búfer, necesitándose un tiempo t. En la
Figura 1 se esquematiza esta secuencia de accesos a memoria. Por lo tanto, teniendo en cuenta que la
frecuencia del procesador es de 100 MHz (t = 10 ns), el tiempo total para acceder a la columna 2 es:

Tcolumna_2  3  Tacceso  t  3  8  t   t  25  t  25  10  250 ns

Tacceso t (0, 2)

Tacceso t t (1, 2), (2, 2)

Tacceso t (3, 2)

Tacceso Tacceso Tacceso t

Figura 1. Secuencia de accesos a memoria para leer la columna 2 de la matriz del problema 1.

2. Se dispone de una memoria de 8 Mbytes con entrelazado de orden inferior y acceso de tipo S
distribuida en módulos de 256 Kbytes. Se ha almacenado un vector de 138 componentes en
posiciones de memoria consecutivas a partir de la posición 0x34bc5.

a) ¿Cuántos accesos se necesitan para leer el vector completo?

b) ¿Y si el entrelazado fuera de orden superior (manteniendo el acceso de tipo


S)?

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 8 MB = 223 Bytes, repartida en
módulos de 256 KB = 218 Bytes, lo que quiere decir que tendremos un total de 2 5 = 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 0x34bc5 es 0x34bc0, los datos estarán
colocados en las posiciones de memoria resaltadas en la Tabla 2. 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.

MÓDULO

DIREC. 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f
0x34bc0 X X X X X X X X X X X X X X X X X X X X X X X X X X X
0x34be0 X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X
0x34c00 X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X
0x34c20 X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X
0x34c40 X X X X X X X X X X X X X X X

Tabla 2. Ubicación de los elementos de la matriz en los módulos de memoria del problema 2.

En el caso de que se utilizara entrelazado superior, las posiciones de memoria consecutivas se


encontrarían en el mismo módulo. Tanto la dirección de comienzo como la de final del vector se
encontrarían en el módulo de memoria 0, que contendría las posiciones de memoria comprendidas
entre la dirección 0x000000 y la 0x40000, con lo que harían falta 138 accesos a memoria, tantos como
componentes, para leer el vector.

3. 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 de un vector se encuentra en la posición
0xaa012, ¿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
Como la memoria tiene una capacidad de 1 Mpalabra, las direcciones estarán compuestas por 20 bits,
y como está distribuida en 8 módulos con entrelazado superior, la dirección de módulo corresponderá
a los 3 bits más significativos y los 17 bits restantes se usarán para determinar el desplazamiento
dentro de cada módulo. La dirección del primer elemento es 0xaa012, 1010 1010 0000 0001 0010 en
binario, por lo que el primer elemento estará colocado en el desplazamiento 0xa012 (0 1010 0000
0001 0010) dentro del módulo 5 (101).

Para que el acceso sea lo más rápido posible, y teniendo en cuenta que el acceso a memoria es de
tipo C, la única restricción que debemos cumplir es que las direcciones de los demás elementos se
encuentren en módulos de memoria diferentes. Aunque es lógico considerar que los 8 elementos del
vector se encuentren en direcciones consecutivas de memoria, esto supondría un cuello de botella a la
hora de acceder a sus componentes, ya que al utilizarse entrelazado superior las posiciones de
memoria consecutivas estarán en el mismo módulo. Una forma posible para situar el vector es la que
muestra la Tabla 3.

DESPLAZAMIENTO

MÓDULO 0 1010 0000 0001 0010 0 1010 0000 0001 0011


000 Elemento 3
001 Elemento 4
010 Elemento 5
011 Elemento 6
100 Elemento 7
101 Elemento 0
110 Elemento 1
111 Elemento 2

Tabla 3. Ubicación de los elementos del vector en los módulos de memoria del problema 3.

La Figura 2 muestra la secuencia de accesos necesaria para acceder a todos los elementos del vector
una vez situado en las posiciones adecuadas. Asumiendo que el sistema de memoria está diseñado para
que Tacceso = 8 × t, el tiempo de acceso sería de:

Tvector  Tacceso  8  t  2  Tacceso


Tacceso t Elemento 0

Tacceso t Elemento 1

Tacceso t Elemento 2

Tacceso t Elemento 3

Tacceso t Elemento 4

Tacceso t Elemento 5

Tacceso t Elemento 6

Tacceso t Elemento 7

Tacceso t t t t t t t t

Figura 2. Secuencia de accesos a memoria para leer el vector del problema 3.

4. En un procesador vectorial a 2 GHz, con registros vectoriales de 8 componentes, una única


unidad de carga/almacenamiento de memoria, un único multiplicador y un único sumador,
se ejecuta el siguiente bucle:

for (i = 0 ; i < n ; i++)


Y[i] = a * X[i][0] + b;

donde Y es un vector de n elementos y X es una matriz de n filas por 6 columnas almacenada


por filas. Si la memoria de este computador está separada físicamente en 8 módulos
accedidos con entrelazado inferior,

a) Determine en qué posición de cada módulo de memoria estará colocada


cada componente de la primera columna de X si X[0][0] está colocado en la
posición 0x00120 y n = 8.

b) Con esta colocación de los elementos de X en memoria, ¿cuál sería el


tiempo de latencia inicial (TLI) y el tiempo por componente (TPC) para la
lectura de la primera columna de X si el acceso a memoria es de tipo C y el
tiempo de acceso para cada módulo es Tacceso = 8 ciclos?

Solución
La Tabla 4 muestra 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). Con esta colocación de los elementos, un acceso a memoria concurrente
(tipo C) no podrá servirnos la primera columna de X a un ritmo de una componente por ciclo, ya que
se puede comprobar que tenemos contención de memoria en los módulos 0, 2, 4 y 6. Por tanto, para
acceder a la primera columna de una matriz n filas, se podrán solapar las lecturas de cuatro en cuatro,
sufriendo una contención de cuatro ciclos cada cuatro accesos, como muestra la Figura 3.

En consecuencia, podemos concluir que debido a la colocación de los datos en memoria, para acceder
a la primera columna de X tendremos un TLI = Tacceso y un TPC = 2, ya que para cada cuatro datos
empleamos cuatro ciclos en su lectura más otros cuatro ciclos de contención, por tanto, para leer una
columna de n datos colocados en memoria de esta forma emplearíamos:
T n   TLI  TPC  n  8  2  n ciclos

MÓDULO

DIRECCIÓN 0 1 2 3 4 5 6 7
0x00120 X[0][0] X[0][1] X[0][2] X[0][3] X[0][4] X[0][5] X[1][0] X[1][1]
0x00128 X[1][2] X[1][3] X[1][4] X[1][5] X[2][0] X[2][1] X[2][2] X[2][3]
0x00130 X[2][4] X[2][5] X[3][0] X[3][1] X[3][2] X[3][3] X[3][4] X[3][5]
0x00138 X[4][0] X[4][1] X[4][2] X[4][3] X[4][4] X[4][5] X[5][0] X[5][1]
0x00140 X[5][2] X[5][3] X[5][4] X[5][5] X[6][0] X[6][1] X[6][2] X[6][3]
0x00148 X[6][4] X[6][5] X[7][0] X[7][1] X[7][2] X[7][3] X[7][4] X[7][5]

Tabla 4. Ubicación de los elementos de la matriz en los módulos de memoria del problema 4.

Tacceso (Módulo 0) t X[0][0]

Tacceso (Módulo 6) t X[0][1]

Tacceso (Módulo 4) t X[0][2]

Tacceso (Módulo 2) t X[0][3]

Tacceso (Módulo 0) t X[0][4]

Tacceso (Módulo 6) t X[0][5]

Tacceso (Módulo 4) t X[0][6]

Tacceso (Módulo 2) t X[0][7]

Tacceso (Módulo 0) t X[0][8]

Tacceso t t t t Contención t t t t Contención t …

Figura 3. Secuencia de accesos a memoria para leer la primera columna de una matriz de n filas en el
problema 4.

5. ¿Cuál es el tiempo de ejecución, T(n), y el número de ciclos por resultado, CPR, para la
operación vectorial A = B × s, donde s es un escalar y A y B son vectores de 200
componentes? 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 TLImem = 12 ciclos, TLImult = 7 ciclos,


y el tiempo de encaminamiento entre las unidades de ejecución y la memoria
es de 4 ciclos.

Solución
A continuación se muestra el código DLXV que implementa la multiplicación:
lw r1, n ; r1 = número de elementos de los vectores
add r2, r0, r0 ; r2 = desplazamiento en los vectores
ld f0, s ; f0 = s
andi r3, r1, #63 ; r3 = n % 64
movi2s vlr, r3 ; vlr = n % 64
addi r3, r0, #64 ; r3 = MVL

bucle: lv v0, B(r2) ; v0 = 8 componentes de B


multsv v1, f0, v0 ; v1 = s * B
sv v1, A(r2) ; A = 8 primeros componentes de s * B

addi r2, r2, #512 ; Desplazamiento de los siguientes elementos


subi r1, r1 ,#64 ; Quedan 64 elementos menos
movi2s vlr, r3 ; vlr = MVL
bnez r1, bucle ; Saltamos si quedan elementos

Teniendo en cuenta los datos del problema, la expresión correspondiente al modelo de prestaciones
con troceado de vector es:

 n  n 
T n   Tbase     Tbucle  TLI  n  TPC  10   64   15  TLI  n  3
 MVL   

donde falta conocer el valor de TLI. Para estimarlo, tal y como muestra la Figura 4, se tienen en
cuenta los tiempos de latencia de los cauces de acceso a memoria y multiplicación, considerando
además los ciclos necesarios para encaminar los datos desde un cauce hasta el otro, obteniéndose:

TLI  TLI load  Tenc  TLI mult  Tenc  TLIstore  12  4  7  4  12  39

lv v0, B(r2)

multsv v1, f0, v0

sv v1, A(r2)

12 64 4 7 64 4 12 64

Figura 4. Temporización de las operaciones vectoriales del problema 5.

La organización de los cauces que se muestra en la Figura 4 se deduce al considerar que el valor de
TPC es igual a 3 ciclos, y por lo tanto tienen que aparecer tres secuencias de componentes no
solapadas.

Si se sustituye el valor de TLI en la expresión de T(n), para n = 200 se tiene que:

 200 
T 200  10     15  39  200  3  826 ciclos
 64 

Por tanto, el número de ciclos por resultado es de:

T 200 826
CPR 200    4.13
200 200

6. En un procesador vectorial que funciona a 500 MHz, con registros vectoriales de 16


componentes, una sola unidad de carga/almacenamiento de memoria y un único
multiplicador, se ejecuta el bucle:
for (i = 0 ; i < 342 ; i++)
Z[i] = a * Z[i] + b * X[i];

Teniendo en cuenta la temporización de la secuencia de instrucciones vectoriales que


implementan Z = a * Z + b * X para un trozo de vector de 16 componentes mostrado en la
Figura 5, y considerando que Tbase = 15 ciclos y Tbucle = 10 ciclos,

a) Calcule para el bucle, los valores del tiempo de ejecución, T(342), y el valor
de R∞.

b) ¿Cuáles serían los valores anteriores si se dispusiese de 2 multiplicadores y


de 3 unidades de carga/almacenamiento?

TLI lv v1, rz

TLI lv v2, rx

TLI multsv v1, fa, v1

TLI multsv v2, fb, v2

TLI addv v3, v1, v2

TLI sv v3, rz

8 10 16 10 5 8 16

Figura 5. Temporización de las operaciones vectoriales del problema 6.

Solución
Teniendo en cuenta la temporización de la Figura 5, podemos calcular el tiempo completo de
procesamiento para un registro vectorial como:

TCV  8  10  MVL  10  5  8  MVL  41  2  MVL

por lo que se puede concluir que TLI = 41 y TPC = 2. Utilizando estos parámetros se puede calcular
el tiempo de ejecución mediante la siguiente expresión:

 n  n
T n   Tbase     Tbucle  TLI  n  TPC  15   16   10  41  n  2
 MVL   

Una vez obtenida esta expresión, se puede calcular T(342):

 342 
T 342  15     10  41  342  2  15  22 * 51  684  1821ciclos
 16 

y para R∞ se tendrá que:

num. operaciones FP 3n


R   lim R n   lim  lim  289.16 MFLOPS
n  n  T n  n   n  1
 15     10  41  n  2   6
  16   500  10

En el caso en el que se tengan 2 multiplicadores y 3 unidades de carga/almacenamiento, el diagrama


de ejecución de las instrucciones vectoriales que procesan cada trozo de 16 o menos elementos se
muestra en la Figura 6. Como se observa en el diagrama, en este caso TLI = 31 y TPC = 1, por lo
tanto, utilizando las mismas expresiones que antes, se puede determinar T(342), que se ha reducido un
30.9% con respecto al caso original:

 342 
T 342  15     10  31  342  1  15  22 * 41  342  1259
 16 

Por tanto, el valor de R∞ se ha incrementado, en concreto un 45.6% con respecto al caso original:

3 n
R   lim  421.05 MFLOPS
n   n  1
 15   16   10  31  n  1  500  106
   

TLI lv v1, rz

TLI lv v2, rx

TLI multsv v1, fa, v1

TLI multsv v2, fb, v2

TLI addv v3, v1, v2

TLI sv v3, rz

8 10 5 8 16

Figura 6. Temporización de las operaciones vectoriales del problema 6 con tres unidades de memoria y
dos multiplicadores.

7. 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):

for (i = 0 ; i < n ; i++)


Z[i] = a * Z[i] + b * X[i] + c * Y[i];

Teniendo en cuenta que el tiempo de ejecución es TCV = 63 ciclos para la secuencia de


instrucciones vectoriales que implementan Z = a × Z + b × X + c × Y con los registros
vectoriales de 16 componentes, que el valor del tiempo de latencia de inicio es TLI = 15
ciclos, que el tiempo correspondiente a las operaciones escalares necesarias para preparar el
ciclo es Tbase = 10 ciclos, y que el tiempo correspondiente al control del bucle en el troceado
del vector es Tbucle = 20 ciclos, calcule para el bucle:

a) El tiempo de ejecución para n = 317 elementos, T(317).

b) El número de operaciones ejecutadas por unidad de tiempo para un vector


de longitud infinita, R∞.

Solución
Sabemos que en un procesador vectorial, el tiempo para procesar una operación completa vectorial
(para los MVL elementos que caben en un registro vectorial) es:

TCV  TLI  MVL  TPC


Por lo tanto, podemos obtener el tiempo por componente de la secuencia de instrucciones vectoriales
como:

TCV  TLI 63  15
TCV  TLI  MVL  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:

 n  n
T n   Tbase     Tbucle  TLI  n  TPC  10   16   20  15  n  3
 MVL   

Por tanto, el tiempo para procesar 317 elementos sería de:

 317 
T 317  10     20  15  317  3  1661ciclos
 16 

El rendimiento de un cauce vectorial se obtiene mediante la siguiente expresión:

num. operaciones FP 5n 2500  n


R n     MFLOPS
T n   n  1 n
 10     20  15  n  3   10   16   35  n  3
  16   500  10
6
 

Por tanto, el máximo rendimiento se obtendrá cuando el tamaño del vector tienda a infinito, es decir,

2500 n
R   lim R n   lim  481.93 MFLOPS
n  n  n
10     35  n  3
 16 

8. Considere que el siguiente bucle, donde X e Y son vectores de números en coma flotante y a
es un escalar:

for (i = 0 ; i < n ; i++)


X[i] = a * Y[i];

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
TLImem = 5 ciclos y TLImult = 10 ciclos, y los registros vectoriales tienen 64 componentes
(MVL = 64). Se tiene que Tbase = 15 ciclos, Tbucle = 10 ciclos, y la frecuencia del procesador
es igual a 1 GHz.

a) ¿Cuál es el valor de R∞?

b) Si el vector que se multiplica por el escalar tiene n = 1024 elementos,


¿Cuánto tarda en ejecutarse?

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 = 0;
VL = (n % MVL);
for ( j = 0 ; j <= (n / MVL) ; j++)
{
for ( i = low ; i < low + VL ; i++) ; Este código se cambiará por
X[i] = a * Y[i]; ; instrucciones vectoriales
low += VL;
VL = MVL;
}

Dado que R∞ se define como:

num. operaciones FP n
R   lim R n   lim  lim
n  n  T n  n  T n 

el primer paso consistirá en estimar el tiempo T(n). 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 una carga vectorial de Y, una multiplicación, y un almacenamiento del
resultado en X, como muestra la Figura 7. Como sólo tenemos una unidad de carga/almacenamiento,
la instrucción sv debe esperar a que termine la instrucción lv, por tanto, tenemos que el tiempo por
componente es TPC = 2 y que el tiempo de latencia inicial TLI = 5 + 5 = 10, ya que la multiplicación
ha quedado solapada con las instrucciones de carga y de almacenamiento. Con estos valores de TLI y
TPC y con los valores de Tbase y Tbucle que nos dan en el enunciado del problema, podemos calcular
T(n) como:

 n  n 
T n   Tbase     Tbucle  TLI  n  TPC  15   64   10  10  n  2
 MVL   

lv v1, y(r1)

multsv v2, f0, v1

lv v2, x(r1)

5 64 5 64

Figura 7. Temporización de las operaciones vectoriales del problema 8.

Una vez obtenido T(n), obtenemos R∞:

num. operaciones FP n
R   lim R n   lim  lim  432.43 MFLOPS
n  n  T n  n   n   1
 15     10  10  n  2   6
  64   1000  10

El tiempo de ejecución del programa en el procesador vectorial para un vector de n = 1024 elementos
es de:

 1024 
T 1024  15     10  10  1024  2  2383 ciclos
 64 

9. En un procesador vectorial a 500 MHz, con registros vectoriales de 32 componentes, tres


unidades de carga/almacenamiento de memoria, un único sumador, y un único
multiplicador, se ejecuta el siguiente bucle:

for (i = 0 ; i < 342 ; i++)


Z[i] = a * Z[i] + X[i];
Determine el valor de R teniendo en cuenta que el procesador puede encadenar y solapar
los cauces y que cada uno de esos cauces puede terminar un componente por ciclo.

NOTA: TLImult = 16 ciclos; TLIadd = 8 ciclos; TLImem = 8; Tbase = 8 ciclos; Tbucle = 10 ciclos.

Solución
Como el tamaño de los vectores es mayor que el de los registros vectoriales, el compilador empleará
strip-mining para optimizar el código. El primer paso para resolver este problema consiste en obtener
los valores de TLI y TPC de las operaciones vectoriales que empleará el compilador. Para ello
usaremos el diagrama mostrado en la Figura 8, del que se puede deducir que el tiempo de latencia
inicial es TLI = 8 + 16 + 8 + 8 = 40 ciclos, ya que las tres operaciones de acceso a memoria se
pueden solapar porque hay tres unidades de acceso a memoria. El tiempo por componente es
TPC = 1 ciclo porque hemos podido encadenar las operaciones vectoriales.

TLI lv v1, z(r1)

TLI lv v2, x(r1)

TLI multsv v3, f0, v1

TLI addv v4, v2, v3

TLI sv v4, z(r1)

8 16 8 8 32

Figura 8. Temporización de las operaciones vectoriales del problema 9.

Una vez calculados TLI y TPC y con los valores de Tbase y Tbucle que nos dan en el enunciado del
problema, podemos calcular T(n) como:

 n  n 
T n   Tbase     Tbucle  TLI  n  TPC  8   32   10  40  n  1
 MVL   

A partir de esta expresión, obtenemos R∞ como:

num. operaciones FP 2n


R   lim R n   lim  lim  390.24 MFLOPS
n  n  T n  n   n   1
 8     10  40  n  1  6
  32   500  10

10. En un procesador vectorial a 1 GHz, con registros vectoriales de 64 componentes, tres


unidades de carga/almacenamiento de memoria, un sumador y un multiplicador, se ejecuta el
siguiente bucle:

for (i = 0 ; i < 342 ; i++)


Z[i] = Z[i] + X[i] * Y[i];

Determine el valor de R teniendo en cuenta que el procesador puede encadenar y solapar


los cauces y que cada uno de esos cauces, por separado, puede terminar un componente por
ciclo.

NOTA: TLImult = 16 ciclos; TLIadd = 8 ciclos; TLImem = 8 ciclos; Tbase = 8 ciclos; Tbucle = 10 ciclos.
Solución
La Figura 9 muestra la temporización de la secuencia de operaciones vectoriales generadas por el
compilador para el código del enunciado. Como sólo tenemos tres unidades de acceso a memoria, la
instrucción sv debe esperar a que terminen las instrucciones lv, por tanto, tenemos que el tiempo por
componente es TPC = 2 y que el tiempo de latencia inicial TLI = 8 + 8 = 16, ya que la multiplicación
y la suma han quedado solapadas con las instrucciones de carga y de almacenamiento.

lv v1, x(r1)

lv v2, y(r1)

lv v3, z(r1)

multv v4, v1, v2

addv v5, v3, v4

lv v5, z(r1)

8 64 8 64

Figura 9. Temporización de las operaciones vectoriales del problema 10.

Con estos valores de TLI y TPC y con los valores de Tbase y Tbucle que nos dan en el enunciado del
problema, podemos calcular T(n) como:

 n  n 
T n   Tbase     Tbucle  TLI  n  TPC  8     10  16  n  2
 MVL   64 

Una vez obtenido T(n), obtenemos R∞:

num. operaciones FP 2n


R   lim R n   lim  lim  831.17 MFLOPS
n  n  T n  n   n   1
 8     10  16  n  2   6
  64   1000 10

11. En un procesador vectorial a 1 GHz, con registros vectoriales de 16 componentes, tres


unidades de carga/almacenamiento de memoria, un sumador y un multiplicador, se ejecuta el
siguiente bucle:

for (i = 0 ; i < 500 ; i++)


Z[i] = Z[i] + X[i] * Y[i];

Determine el valor de R teniendo en cuenta que el procesador puede encadenar y solapar


los cauces y que cada uno de esos cauces, por separado, puede terminar un componente por
ciclo.

NOTA: TLImult = 20 ciclos; TLIadd = 15 ciclos; TLImem = 25 ciclos; Tbase = 8 ciclos; Tbucle = 10 ciclos.

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 diagrama de tiempos mostrado en la Figura 10. Teniendo en cuenta este
diagrama, el programa tiene un TLI = 25 + 20 + 15 + 25 = 85 y un TPC = 1. Con estos valores y con
los valores de Tbaase y Tbucle que nos dan en el enunciado del problema, podemos calcular T(n) como:

 n  n
T n   Tbase     Tbucle  TLI  n  TPC  8   16   10  85  n  1
 MVL   

TLI lv v1, rx

TLI lv v2, ry

TLI lv v3, rz

TLI multv v4, v1, v2

TLI addv v5, v3, v4

TLI sv v5, rz

25 20 15 25 16

Figura 10. Temporización de las operaciones vectoriales del problema 11.

Una vez obtenido T(n), calculamos R∞ como:

num. operaciones FP 2n


R   lim R n   lim  lim  288.29 MFLOPS
n  n  T n  n   n  1
 8     10  85  n  1  6
  16   1000  10

ÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑ

0000 0
0001 1
0010 2
0011 3
0100 4
0101 5
0110 6
0111 7
1000 8
1001 9
1010 a
1011 b
1100 c
1101 d
1110 e
1111 f
^﹏^¡¡..

También podría gustarte