La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Procesadores Vectoriales

Presentaciones similares


Presentación del tema: "Procesadores Vectoriales"— Transcripción de la presentación:

1 Procesadores Vectoriales
Orientados a ejecutar eficientemente algoritmos numéricos sobre estructuras regulares de un gran número de elementos. Incluyen en su repertorio de instruciones, instrucciones capaces de procesar vectores  aparece un nuevo tipo de datos Vector. Cada vez que una instrucción es ejecutada, se ejecuta idealmente sobre todos los componentes del Vector. Las operaciones sobre vectores pueden realizarse más rápido que una secuencia de operaciones escalares sobre el mismo número de elementos Es necesario realizar una selección de aplicaciones, datos y compiladores

2 Introducción: características de las operaciones vectoriales
El enfoque tradicional = explotar el paralelismo a nivel de instrucciones (ILP). (Ejecución segmentada, superescalar, …) Límites al ILP: Rendimiento (puede mejorarse aumentando la profundidad de los pipes. Problema: mayor número de etapas = más dependencias. Se emplea tiempo en adquirir y decodificar las instrucciones

3 Introducción: características de las operaciones vectoriales
Secuencia de cálculos independientes: Ausencia de dependencias (determinado en tiempo de compilación o por el programador) Alto contenido semánticos. (Se entiende mejor el programa) Patrón de acceso a memoria conocido. Elementos adyacentes en memoria = bancos entrelazados Se puede ocultar la alta latencia de acceder a memoria versus caché.

4 Introducción: características de las operaciones vectoriales

5

6

7 Introducción: características de las operaciones vectoriales
Idea básica: introducir operaciones vectoriales en el lenguaje máquina Objetivo: sintonizar la arquitectura con: La estructura de los cálculos La estructura de los accesos a memoria

8 Tipos de Proc. Vectoriales
Segmentados: CDC STAR 100 y TI ASC (1972) Cray-1 (1976) En array (procesamiento simultáneo de varias componentes mediante la replicación de unidades de procesamiento) Unger (1958) Illiac IV

9 Tipos de Proc. Vectoriales
Extensiones multimedia de procesadores de propósito general (procesamiento de varios datos pequeños, empaquetados en un registro, mediante la división de las unidades funcionales en sub-unidades independientes). Tipos de datos pequeños: pixeles (8 bits), audio (16 bits), … Se empaquetan datos y se opera con ellos formando estructuras de tipo vectorial Cómputo intensivo 3D Streaming INTEL (MMX),MOTOROLA(AltiVec),AMD(32Now),Sun UltraSparc (VIS), …

10 Arquitectura Básica Típicamente consta de una unidad escalar de proceso y una unidad vectorial. Dos tipos fundamentales: Memoria - Memoria. Todas las operaciones vectoriales son entre memoria. Gama CDC: Cyber205, ETA10... Vector - Registro. Todas las operaciones vectoriales – excepto load y store – se realizan entre registros de vectores. Es el modelo utilizado actualmente. Gama Cray: 1, X-MP, Y-MP, C90, J90, T90, SV1, SV2. Supercomputadores japoneses: Hitachi, NEC, Fujitsu VPP

11 ESQUEMA GENERAL DE UN PROCESADOR VECTORIAL
Controlador de memoria y generador de direcciones Unidades Aritméticas Segmentadas Memoria Local (Registros) Procesador Escalar Controlador Vectorial Datos Programa Parámetros de Direccionamiento Parámetros y estado Control y estado Datos

12

13

14

15

16

17

18

19 Rendimiento

20 Rendimiento

21 Propiedades de los Procesadores Vectoriales
La computación de cada resultado es independiente de la computación de los resultados previos. Una simple instrucción vectorial especifica una gran cantidad de trabajo. Las instrucciones vectoriales que acceden a memoria tienen un patrón de acceso a memoria conocido. Al sustituir un bucle entero por una única operación vectorial, desaparecen las dependencias de control.

22 Funcionamiento Segmentado

23 Funcionamiento Segmentado

24 Funcionamiento Segmentado
Algunas arquitecturas vectoriales proporcionan mayor eficiencia al permitir que la salida de un pipeline se pueda encadenar con la entrada de otro pipeline Encadenamiento elimina la necesidad de almacenar el resultado del primer pipeline antes de enviarlo al segundo

25 OPERACIONES BÁSICAS Hay más tipos de datos (vectores)  aparecen más operaciones. Las operaciones se pueden clasificar en: V  V V  S V op V  V V op S  V V op V  S

26 EJEMPLOS DE OPERACIONES SOBRE VECTORES
Suma Vectorial A = B + C Suma Escalar Producto Vectorial A = B  C Producto Escalar Mover Vectores Máximo de un Vector a = max(B(i)) i = 1, 2, ..., n Operaciones Lógicas A(i) = B(i) and C(i) i = 1, 2, ..., n Comparar Vectores A(i) = 1 si B(i) > C(i) i = 1, 2, ..., n Producto de un Escalar por un Vector A = k ·B

27 Repertorio de instrucciones DLXV

28 Repertorio de instrucciones DLXV

29 REQUERIMIENTO BÁSICO DE LA EJECUCIÓN VECTORIAL
El resultado debe ser idéntico que si el cálculo se resolviera en un computador escalar. Ejemplo: A[i] = B[i] + C[i]; B[i] =2 * A[i+1]; i A B C

30 A(1) = B(1) + C(1) = 20 + 10 = 30 A(1:N) = B(1:N) + C(1:N)
Ejecución Secuencial A(1) = B(1) + C(1) = = 30 B(1) = 2 * A(2) = 2 * = 12 A(2) = B(2) + C(2) = = 32 B(2) = 2 * A(3) = 2 * = 14 ... Ejecución Vectorial A(1:N) = B(1:N) + C(1:N) B(1:N) = 2 * A(2:N+1) B(1) = 2 * A(2) = 2 * 32 = 64 B(2) = 2 * A(3) = 2 * 34 = 68 Diferentes

31 Memoria Entrelazada Se organizan los chips en bancos
Se intenta aprovechar el ancho de banda de todos, enviando a todos la misma dirección de memoria (para acceder en paralelo) Cada banco tiene líneas de dirección y de datos independientes para realizar accesos independientes Normalmente no son líneas dedicadas sino una red de conmutación multietapa

32 MEMORIA ENTRELAZADA Dividir la Mp en módulos independientes de acceso en paralelo al objeto de: Reducir el tiempo de acceso efectivo a Mp. Aminorar el efecto de “cuello de botella” que se produce en el acceso a Mp por parte de los elementos que la comporten. ¿Cómo se distribuyen las direcciones entre los módulos? Entrelazamiento de orden alto. Cada módulo contiene un conjunto de direcciones consecutivas. Entrelazamiento de orden bajo. Direcciones consecutivas en módulos consecutivos.

33 ENTRELAZAMIENTO DE ORDEN ALTO
Sea Mp de 2n palabras. Se divide en 2m módulos de 2n-m palabras cada uno. Cada módulo alberga 2n-m palabras consecutivas. El módulo i contiene las direcciones [i*2n-m, ..., (i+1) * 2n-m - 1]

34 Dirección dentro del módulo
Direccionamiento: n-m Módulo Dirección dentro del módulo n –m bits m bits RDi RDa i 2m -1 Decodificador 2m i m    RDi: Registro de Dirección RDa: Registro de Datos Los m bits más significativos se usan para seleccionar el módulo. Los n-m bits menos significativos se usan para direccionar el módulo.

35 Ventajas: Fácil expansión de la memoria (más M  más módulos). Fiabilidad. Un error en un módulo no provoca un gran fraccionamiento de la memoria. Inconveniente: Localidad Espacial. Conflictos de acceso a un mismo módulo.

36 ENTRELAZAMIENTO DE ORDEN BAJO
Sea Mp de 2n palabras. Se divide en 2m módulos de 2n–m palabras cada uno. El módulo i contiene las direcciones: i + K * 2m, K = 0, 1, 2, ... , 2n-m - 1

37 Dirección dentro del módulo
Direccionamiento: Módulo Dirección dentro del módulo n –m bits m bits RDi RDa i 2m -1 Decodificador 2m i m    RDi: Registro de Dirección RDa: Registro de Datos n-m Los m bits menos significativos se usan para seleccionar el módulo. Los n-m bits más significativos se usan para direccionar el módulo. Direcciones consecutivas están en módulos consecutivos.

38 Ventajas e Inconvenientes:
Los contrarios del enfoque anterior. Se podría adoptar una política mixta: Se puede acceder a palabras consecutivas tanto en la parte alta como en la baja. Combina las ventajas e inconvenientes de ambos modos de direccionamiento (alto y bajo).

39 Ejemplo Orden Alto. Orden Bajo.
Nº de bits de dirección en módulo (n-m) = 3 Nº de bits de selección del módulo (m) = 2 Orden Alto. X X X X X m n - m 1 2 3 4 5 6 7 Mod. 0 8 9 10 11 12 13 14 15 Mod. 1 16 17 18 19 20 21 22 23 Mod. 2 24 25 26 27 28 29 30 31 Mod. 3 Orden Bajo. X X X X X m n - m 4 8 12 16 20 24 28 Mod. 0 1 5 9 13 17 21 25 29 Mod. 1 2 6 10 14 18 22 26 30 Mod. 2 3 7 11 15 19 23 27 31 Mod. 3

40 Mixto. X X X X n - m m 2 4 6 8 10 12 14 Mod. 0 1 3 5 7 9 11 13 15 Mod. 1 16 18 20 22 24 26 28 30 Mod. 2 17 19 21 23 25 27 29 31 Mod. 3

41 TIEMPO DE EJECUCIÓN El tiempo de ejecución de una secuencia de operaciones vectoriales depende principalmente de tres factores: La longitud de los vectores sobre los que se opera. Dependencias Estructurales entre las operaciones. Dependencias de datos. Con unidades segmentadas, se produce un resultado por ciclo de reloj; el tiempo que se tarda en ejecutar una instrucción sobre un vector es aproximadamente igual a la longitud del vector.

42 Convoy. Conjunto de instrucciones vectoriales que podrían potencialmente empezar su ejecución, juntas en un período de reloj. Las instrucciones en un convoy no deben contener ninguna dependencia estructural o de datos. Chime. Medida aproximada del tiempo de ejecución para una secuencia vectorial. Es independiente de la longitud del vector. Se ignoran todas las cargas adicionales (overheads)

43 Depende de la profundidad del pipeline.
Tiempo de Arranque. Tiempo transcurrido hasta que se llenan las unidades funcionales segmentadas. Depende de la profundidad del pipeline. Introduce un retardo entre los convoys, ya que estos no se pueden solapar. El tiempo para completar un convoy está determinado por la longitud del vector y el tiempo de arranque. T. de ej. de un convoy = long. Vector + tiempo de arranque La sobrecarga debida al tiempo de arranque de un vector no es muy significativa cuando se trabaja con vectores largos.

44 LONGITUD DEL VECTOR Una máquina con registros vectoriales tiene una longitud natural determinada por el número de elementos de cada registro vectorial. La longitud de una operación vectorial particular, es con frecuencia desconocida en tiempo de compilación e incluso en tiempo de ejecución. La solución es crear un registro de longitud vectorial (VLR), el cual controla la longitud de cualquier operación vectorial. Determina el número de componentes sobre las que actúa la operación vectorial. MVL = Valor Máximo. ¿Si n < MVL? Cargar registro VLR = mtc1 VLR,r1 y ejecutar el resto de operaciones vectoriales. ¿Qué sucede si n > MVL?  seccionamiento (strip mining).

45 STRIP MINING Seccionamiento. Generación de código tal que cada operación vectorial se realiza para un tamaño  MVL Al coste de arranque hay que añadir los costes de seccionamiento. n / MVL operaciones de longitud MVL. Primer bucle realiza la parte corta n mod MVL y el resto VL = MVL

46 STRIP MINING

47 STRIP MINING LD F0,a ADDI R4,Rx,#512 ; última dirección a cargar
LD F2,0(Rx) ; carga X(i) MULTD F2,F0, F2 ; a· X(i) LD F4, 0(Ry) ; carga Y(i) ADDD F4,F2,F4 ; a· X(i) + Y(i) SD F4, 0(Ry) ; almacena en Y(i) ADDI Rx,Rx,#8 ; incrementa índice a X ADDI Ry,Ry,#8 ; incrementa índice a Y SUB R20,R4,Rx ; calcula límite BNZ R20, loop ; comprobación si se ha terminado LD F0,a ; carga escalar a LV V1,Rx ; carga vectorX MULTSV V2,F0,V1 ; multiplicación vector-escalar LV V3,Ry ; carga vector Y ADDV V4,V2,V3 ; suma SV Ry,V4 ; almacena el resultado

48 STRIP MINING

49 RENDIMIENTO DE UN BUCLE VECTORIZADO
Depende de 3 factores: El tiempo de cada operación vectorial en el bucle para procesar un elemento, ignorando los costes de arranque: Telemento. El coste adicional de las instrucciones vectoriales para cada bloque seccionado: Tbucle + Tarranque. Los costes adicionales del cálculo de las direcciones de comienzo y escritura del vector de control: Tbase. El tiempo total de ejecución para una secuencia vectorial operando sobre un vector de longitud n es:

50 SEPARACIÓN ENTRE ELEMENTOS DE UN VECTOR
La posición en memoria de los elementos adyacentes de un vector puede no estar localizada secuencialmente en memoria. Ej: A(i,j) = A(i,j) + B(i,k) · C(k,j) La distancia entre elementos consecutivos que van a formar un vector se denomina separación (stride). Los procesadores vectoriales tienen la capacidad de acceder a elementos cuyo acceso en memoria no es secuencial y reconfigurarlos en una estructura de datos densa (compacta). La distancia entre elementos depende del tamaño de los elementos y de la longitud de los vectores; se calcula de forma dinámica, ya que el tamaño de los vectores puede no saberse en tiempo de compilación o puede variar a lo largo de la ejecución.

51 La dirección de comienzo del vector y la separación se pueden guardar en un registro de propósito general. Al introducir separaciones no unitarias es posible que se realicen accesos a un mismo banco a una frecuencia mayor que el tiempo de acceso a memoria  conflicto del banco de memoria. Los conflictos de bancos de memoria suponen que cada carga necesita un mayor tiempo de acceso a memoria. Los conflictos del banco de memoria se presentarán si:

52 TÉCNICAS DE VECTORIZACIÓN
Objetivo: Aprovechar el hardware vectorial disponible con el fin de acelerar (optimizar) la ejecución de secuencias vectorizables. Dos Aproximaciones: Desarrollo de lenguajes (o extensiones a los lenguajes existentes) que pueden expresar el paralelismo inherente en el algoritmo. Desarrollo de compiladores que reconozcan las porciones de código secuencial y las vectoricen. Vectorizar: Indentificar las construcciones vectorizables y sustituirlas por el conjunto de instrucciones vectoriales equivalentes  determinar las dependencias entre operandos del bucle.

53 El compilador debe poder reconocer que un bucle (o parte) es vectorizable y generar el código apropiado. Ejemplo: for (i = 0; i < 100; i++) { A[i+1] = A[i] + B[i]; // S1 B[i+1] = B[i] + A[i+1]; // S2 } Posibles tipos de Dependencias: S1 utiliza un valor calculado por S1 en una iteración anterior. S1 utiliza un valor calculado por S2 en una iteración anterior. S2 utiliza un valor calculado por S1 en la misma iteración.

54 Si las operaciones están segmentadas (latencia grande) puede ocurrir que una iteración anterior no se complete antes de que empiece la iteración posterior (dependencias para los dos primeros casos)  la vectorización del bucle introduce un riesgo LDE (lectura después de escritura). Riesgo LDE  bucle no vectorizable  el compilador no genera instrucciones vectoriales para este código. El tercer caso puede ser detectado por el Hw normal de detección de riesgos  puede vectorizarse. Las dependencias de las dos primeras situaciones se denominan dependencias entre iteraciones del bucle (loop-carried dependences).

55 La primera tarea del compilador es determinar si en el cuerpo del bucle hay dependencias de iteración (algoritmo de análisis de dependencias). Es un análisis complejo. Ejemplo: for (0 = 1; i < 100; i++) { A[i] = B[i] + C[i]; D[i] = A[i] + E[i]; } Si los arrays A, B, C, D y E son diferentes entonces no pueden existir dependencias entre iteraciones del bucle. Existen dependencias entre las dos sentencias para el vector A.

56 Si el mismo vector es fuente y destino, puede haber dependencias arrastradas si el valor de dicho vector depende del valor calculado en una iteración anterior  recurrencia. Ejemplo: for (i = 0; i < 100; i++) { Y[i] = a ·X[i] + Y[i]; } for (i =1; i < 100; i++) { Y[i] = Y[i-1] + Y[i]; Sin dependencias arrastradas Con dependencias arrastradas: recurrencia

57 DETECCIÓN DE DEPENDENCIAS
Sea i el índice de la iteración (de m a n); a · i + b elemento del array escrito. Existe dependencia al acceder al elemento c · i + d si se mantienen dos condiciones: Hay dos índices de iteración, j y k dentro de los límites del bucle. El bucle almacena un elemento del array indexado por a · j + b; posteriormente busca ese mismo elemento del array indexado por c · k + d. Esto es a · j + b = c · k + d. Un test sencillo para detectar dependencias es el máximo común divisor (GCD). Si existe una dependencia entre iteraciones del bucle, entonces GCD(c,a) debe dividir a (d-b). Puede detectar dependencias falsas (no existentes).

58 Una dependencia verdadera de datos surge de un riesgo LDE.
También hay dependencias correspondientes a riesgos EDL (escrituras después de lectura), antidependencias; y a riesgos EDE (escritura después de escritura), dependencias de salida. Antidependencias y dependencias de salida, no son verdaderas dependencias de datos. Se pueden eliminar renombrando los registros. El compilador debe generar código de seccionamiento y asignara los registros vectoriales. La asignación eficiente de los registros vectoriales es una tarea muy importante y difícil.

59 Ejemplo: for (i = 0; i < 100; i++) {
Y[i] = X [i] / s; X [i] = X [i] + s; Z [i] = Y [i] + s; Y [i] = s - Y [i]; } for (i = 0; i < 100; i++) { Y renombrado a T T [i] = X [i] / s; X renombrado a X1 X1[i] = X [i] + s; Z [i] = T [i] + s; Y [i] = s - T [i]; antidependencia Dependencia de salida

60 TÉCNICAS DE MEJORA DEL RENDIMIENTO VECTORIAL
ENCADENAMIENTO (chaining) Ejemplo: MULTV V1, V2, V3 ADDV V4, V1, V5 Debido a las dependencias, MULTV debe finalizar antes de que ADDV pueda comenzar. El tiempo en el cual estas instrucciones se ejecutan es, por tanto: Telemento · Longitud del vector + TarranqueADDV + Tdetención + TarranqueMULTV = 2 ·Longitud del vector = 2 ·Longitud del vector + 17

61 Para evitar que ADDV tenga que esperar  encadenamiento (chaining).
Es un forwarding (adelantamiento) sobre los elementos de los vectores entre los que existe dependencia, hacia la siguiente unidad funcional que tiene que operar con ellos. Las operaciones vectoriales no se tratan como una única entidad, sino como un conjunto de resultados individuales (componentes del vector). El encadenamiento permite que una operación vectorial comience tan pronto como los elementos individuales estén disponibles. El encadenamiento permite que las operaciones se ejecuten en paralelo sobre diferentes elementos del vector (aun existiendo dependencias).

62 Longitud del vector + TarranqueADDV + TarranqueMULTV
Ejemplo: El tiempo total de ejecución para la secuencia anterior se convierte en: Longitud del vector + TarranqueADDV + TarranqueMULTV Para vectores de longitud 64, el tiempo de ejecución de la versión encadenada y de la no encadenada son por tanto: Tno encadenada 7 4 64 (MULTV) 6 64 (ADDV) = 145 Tencadenada = 77

63 SENTENCIAS CONDICIONALES
La aparición de una sentencia condicional en un bucle impide la paralelización de éste (introduce dependencias de control en el bucle). Ejemplo: for (i = 0; i < 64; i++) { if ( A[i] != 0 ) { A[i] = A[i] - B[i]; } El bucle interior se ejecuta para las iteraciones donde A[i]  0.

64 Para solucionarlo: Control de máscara vectorial. Se crea un registro de máscara vectorial donde se indica (con 1) los componentes del vector sobre los cuales hay que realizar la próxima operación. En la siguiente operación se limpia la máscara del vector (todos sus componentes a 1), así se efectúa sobre todas las componentes del vector. Desventajas: Las operaciones vectoriales con máscara necesitan más tiempo para ejecutarse (comprobar la máscara y marcar los elementos que la satisfacen) aunque no se satisfaga la condición. En algunas máquinas la máscara sólo desactiva el almacenamiento, pero la operación se sigue realizando  pueden aparecen excepciones de punto flotante falsas.

65 MATRICES DISPERSAS (ESPARCIDAS)
Incluso con un número significativo de 0’s en la máscara es más rentable utilizar la vectorización. MATRICES DISPERSAS (ESPARCIDAS) Sus componentes están dispersos por la memoria. Ejemplo: for (i = 0; i < 100; i++) { A[K [i]] = A[K[i]] + C[M[i]]; } Los vectores índice K y M (punteros a los elementos) designan el desplazamiento de los elementos de A y C por la memoria.

66 El código anterior nunca se vectorizaría automáticamente, ya que un compilador no puede saber si los valores de K son diferentes, y por ello, que no existen dependencias. Para tratar con matrices dispersas utilizamos las operaciones de dispersar y agrupar usando vectores de índices. Una instrucción de agrupar (gather) usa un vector de índices, y busca en memoria el vector cuyos elementos están en las direcciones obtenidas al sumar a la dirección base los desplazamientos indicados por el vector de índices. Las operaciones de agrupar reúnen los componentes dispersos por la memoria y los depositan de forma compacta en un registro vectorial. Estas operaciones raramente se ejecutan a un elemento por ciclo de reloj, pero son todavía mejor que la alternativa escalar.

67 El ejemplo anterior de puede codificar como:
LV Vk, Rk ; carga K LVI Va, (Ra + Vk) ; carga A(K(I)) LV Vm, Rm ; carga M LVI Vc, (Rc + Vm) ; carga C(M(I)) ADDV Va, Va, Vc ; los suma SVI (Ra + Vk), Va ; almacena A(K(I)) Las cargas / almacenamientos indexados y los vectores de índices proporcionan un método alternativo para soportar la ejecución condicional.

68 REDUCCIÓN VECTORIAL Reducción: un bucle que reduce un array a un único valor (escalar) por aplicación repetida de una operación. Ejemplo: producto escalar de dos vectores producto = 0.0; for (i = 0; i < 64; i++) { producto = producto + A[i]  B[i]; } Existe una dependencia entre iteraciones del bucle  dividimos el bucle para separar la parte vectorizable y la recurrencia.

69 for (i = 0; i < 64; i++) { producto[i] = A[i]  B[i]; } for (i = 1; i < 64; i++) { producto[1] = producto[1] + producto[i]; La variable producto se ha expandido en un vector (expansión escalar). Para compilar el bucle con recurrencia añadimos secuencias de vectores progresivamente más cortos (doblamiento recursivo).

70 El segundo bucle quedaría como:
longitud = 32; for (j = 0; j < 6; j++) { for (i = 0; i < longitud; i++) { producto[i] = producto[i] + producto[i+longitud]; } longitud = longitud / 2;


Descargar ppt "Procesadores Vectoriales"

Presentaciones similares


Anuncios Google