Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Capítulo 6
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:
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
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):
Tacceso t (0, 2)
Tacceso t (3, 2)
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.
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.
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
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:
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
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.
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:
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
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:
lv v0, B(r2)
sv v1, A(r2)
12 64 4 7 64 4 12 64
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.
200
T 200 10 15 39 200 3 826 ciclos
64
T 200 826
CPR 200 4.13
200 200
a) Calcule para el bucle, los valores del tiempo de ejecución, T(342), y el valor
de R∞.
TLI lv v1, rz
TLI lv v2, rx
TLI sv v3, rz
8 10 16 10 5 8 16
Solución
Teniendo en cuenta la temporización de la Figura 5, podemos calcular el tiempo completo de
procesamiento para un registro vectorial como:
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
342
T 342 15 10 41 342 2 15 22 * 51 684 1821ciclos
16
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 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):
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 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
317
T 317 10 20 15 317 3 1661ciclos
16
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:
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.
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;
}
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)
lv v2, x(r1)
5 64 5 64
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
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.
8 16 8 8 32
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
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)
lv v5, z(r1)
8 64 8 64
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
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 sv v5, rz
25 20 15 25 16
ÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑ
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
^﹏^¡¡..