ALN- Matrices y Máquinas

Preview:

Citation preview

ALN- Matrices y Máquinas

In. Co.Facultad de IngenieríaUniversidad de la República

Versión 1.0 2

Evaluación de desempeño Máquina de Von Neumann (simplificada) Pipeline Computadores vectoriales Encadenamiento Jerarquías de memorias

Versión 1.0 3

Evaluación de desempeño

CPU time

CPU = NI * CPI * CCT

NI: número de instrucciones

CPI: número de ciclos de reloj por instrucción

CCT: tiempo del ciclo de reloj

Versión 1.0 4

Evaluación de desempeño

MIPS (Millons of Instructions Per Seconds)

Depende del conjunto de instrucciones del equipo. En un equipo depende del problema a resolver.

610*CPI

reloj del frecuenciaMIPS

Versión 1.0 5

Evaluación de desempeño

FLOPS (Floating Point Operations per Second)

FLOPS = NFPU * FPC * CPS

NFPU: número de unidades de PF

FPC: flops por ciclo

CPS: frecuencia del reloj (ciclos por seg Hz)

Versión 1.0 6

Evaluación de desempeño

El tiempo del proceso se divide en: tiempo de usuario: Tiempo que se dedica

a operaciones a nivel de usuario. tiempo del sistema: Llamadas a sistema

(ej: operaciones de E/S)

Versión 1.0 7

Evaluación de desempeño Tiempo de CPU: tiempo en que la cpu está

ocupada en ejecutar instrucciones del proceso.

Walltime: es el tiempo real que transcurre entre un evento y otro.

Ej: Comando time (linux) Real: tiempo “reloj” entre el inicio y el fin del programa. User: tiempo de cpu en el espacio de usuario System: tiempo de cpu en el espacio de sistema Real <= User + System

Versión 1.0 8

Evaluación de desempeño

Costo por cómputoSon necesarias soluciones ingenieriles.No necesariamente la más rápida, sino un

compromiso con los costos.

Comparar desempeño no es sencilloBenchmark: Ejecución de un programa (o un

conjunto de ellos) para evaluar el desempeño relativo de algo (cpu, memoria, so, software, etc.)

Versión 1.0 9

Benchmarks Micro benchmarks

Diseñados para medir el desempeño de un código pequeño y específico o cierta feature del hardware.

Velocidad del procesador Acceso a memoria

Kernel benchmarks Conjuntos de rutinas simples Evalúan el desempeño de hardware y compiladores Ej: Livermore Loops, LINPACK…

Aplicaciones completas Ej: procesadores de textos, aplicaciones de usuario

Versión 1.0 10

Evaluación de desempeño

Resumen

No evaluar desde un solo punto de vista (velocidad del procesador, conjunto de instrucciones, cantidad de ciclos de reloj por instrucción, otros).

Versión 1.0 11

Máquina de Von Neumann

Versión 1.0 12

Máquina de Von Neumann

Obtiene la siguiente instrucción desde la

memoria según el contador de programa.

Aumenta el contador de programa.

Decodifica la instrucción mediante la

unidad de control.

Se ejecuta la instrucción.

Versión 1.0 13

Pipeline (paralelismo fino)

Una tarea se divide en sub-tareas, la

unidad funcional se divide en sub-

segmentos.

Versión 1.0 14

Pipeline

Motivación se encuentra en varias

realidades

Línea de montaje

Lavandería (Ver ppts Arquitectura 2)

Desarrollo de software

Versión 1.0 15

Pipeline básico (prefetch): Ejecución de una instrucción dividida en dos etapas:

Fetch: traer la siguiente instrucción desde la memoria Execute: ejecutar la instrucción

Cada etapa es realizada por una unidad funcional independiente

Pipeline

Versión 1.0 16

Pipeline

Fetch de una instrucción. (FI)

Decodificar instrucción. (DI)

Calcular los operandos. (CO)

Fetch de los datos. (FO)

Ejecutar instrucciones. (EI)

Escribir en la memoria. (WO)

Versión 1.0 17

Pipeline

Versión 1.0 18

Pipeline Problemas:

Llenar el pipeline

Hazards (obstáculos) Pueden impedir que la próxima instrucción se ejecute en el

ciclo correspondiente Ej:

Bifurcaciones en el código Dependencias de datos Conflictos de hardware

Es necesario detener el pipeline y a veces vaciarlo (saltos) Existen estrategias para minimizar las penalizaciones: (Ej:

estrategias predictivas)

Versión 1.0 19

Pipeline

Latencia Tiempo en procesar una tarea

ThroughputRendimiento medido, en unidades producidas

por tiempo

Versión 1.0 20

Pipeline

Pipelining no mejora la latencia de cada tarea, sino el throughput de toda la carga de trabajo

Limitado por el estado más lento Largo desbalanceado de los pasos del

pipeline reduce la aceleración Aumentar la aceleración, aumentando la

cantidad de pasos del pipeline

Versión 1.0 21

Evaluación de desempeño

Velocidad asintótica: Velocidad necesaria para procesar vectores “largos” (n-->inf).

Largo de eficiencia media: Es el largo de vector que se procesa a un medio de la velocidad asintótica.

Versión 1.0 22

Evaluación de desempeño

t1 tiempo para ejecutar un ciclo de loop ns cantidad de estados (largo del pipeline) t0 tiempo de inicialización n largo del vector a procesar

nn

ttt

s

10

Versión 1.0 23

Evaluación de desempeño

nn

tt

n

t

nr

s

10

1t

nr s

r

ntt 0

02/1 trn t

nr 2/121

Versión 1.0 24

Otras ideas

Pueden trabajar en forma paralela varias sub-unidades de proceso

Unidad de suma de PF

Unidad de multiplicación de PF

Unidad lógica

Versión 1.0 25

Instrucciones Vectoriales

Máquinas que tienen registros vectoriales. Se carga los datos en forma vectorial

Se realizan las operaciones en forma vectorial

Equipos famosos Cray (Cray 1, Cray X-MP)

Fujitsu

NEC

Versión 1.0 26

Instrucciones Vectoriales

Generalmente los equipos disponen de

compiladores que transforman

automáticamente el código.

Utilizar notación matricial al programar (por ej.

en FORTRAN).

Versión 1.0 27

Instrucciones Vectoriales

Caído en desuso, máquinas generalmente

muy caras.

Idea utilizada en otro tipo de hardware

(tarjetas de video).

Versión 1.0 28

Encadenamiento

Combinar pipelines para que el resultado de

un proceso sea directamente la entrada de

otro.

Ejemplo típico: a+bc

Versión 1.0 29

Ordenes Evaluación de desempeño Máquina de Von Neumann (simplificada) Pipeline Computadores vectoriales Jerarquías de memorias Optimización al compilar Multiplicación de matrices

Versión 1.0 30

Ordenes Tiempo de ejecución de un programa en

función de N, lo que denominaremos T(N) for (int i= 0; i < N; i++)

a = a + t[i]*v[i];

Requiere T(N)= N (suma-multiplicación)

Versión 1.0 31

Ordenes

for (int i= 0; i < N; i++)

for (int j= 0; j < N; j++)

a = a + t[i]*v[j];

Requiere T(N)= 2N

Versión 1.0 32

Ordenes for (int i= 0; i < N; i++)

for (int j= 0; j < N; j++) {

a = a + t[i]*v[j];

b = b + a*b;

}

Requiere T(N)= 22N

Versión 1.0 33

Ordenes

Si definimos (nada formal) el Orden (O()) de un algoritmo como una función tal que c*f(N) > T(N) para una constante.

En los casos anteriores:

T(N) O(N)

N N

N N22N 2N

Versión 1.0 34

Ordenes ¿Cuán útil es medir el Orden de un

algoritmo ?

Solo mide operaciones a realizar !!!!

No tiene en cuenta otros aspectos …

Patrones de acceso a memoria

Localidad espacial / temporal

Etc…

Versión 1.0 35

Ordenes Evaluación de desempeño Máquina de Von Neumann (simplificada) Pipeline Computadores vectoriales Jerarquías de memorias Optimización al compilar Multiplicación de matrices

Versión 1.0 36

Estrategias de compilación

Cada compilador dispone de diversas opciones.

Algunas opciones del Intel Fortran para Linux...

Versión 1.0 37

Estrategias de compilación

Optimización:-O1,-O2,-O3

Generación de código:−x{code}: permite generar código específico

para ejecutar en los procesadores indicados por “code”

SSE2, SSE3, SSSE3,SSE4.2,…,AVX, etc.

-xHost: generar código con el set de instrucciones más alto disponible en el host

Versión 1.0 38

Estrategias de compilación

Generación de código:−mtune=cpu: Optimizar para una cpu

específica Pentium3,pentium4,pentium-m,core2,atom,corei7 Core-avx2: procesadores que soportan Advanced

Vector Extensions 2 Otras…

Versión 1.0 39

Estrategias de compilación

Optimización Interprocedural: −ip o −ipo: −ip busca en funciones del mismo

archivo, con −ipo se realiza la búsqueda en todos los archivos del sistema.

Expansión de funciones inline. Propagación de constantes. Eliminación de código muerto. Pasaje de argumentos por registros. Sacar los códigos invariantes de los loops.

Versión 1.0 40

Estrategias de compilación

Punto Flotante:-fp-model {nombre}:

Fast, Precise, Source, Strict

-pc{32|64|80(default)} Precisión interna de la unidad de punto flotante

(FPU).

-rcd y –fp-port Controlan la utilización de redondeos y

truncamientos.

Versión 1.0 41

Estrategias de compilación

Otras -openmp: API (Application Program Interface)

OpenMP para programar “paralelismo” de

memoria compartida.

Versión 1.0 42

Estrategias de compilación

Algunas prácticas que pueden permitir al optimizador realizar su tarea de una mejor forma:

Minimizar la utilización de variables globales.

Evitar el uso de controles de flujo complejos.

No usar la instrucción cast.

Evitar las referencias indirectas.

Versión 1.0 43

Estrategias de compilación

Algunas prácticas que pueden permitir al optimizador realizar su tarea de una mejor forma:

Fetch Scheduling – Software Pipelining

for (i=4; i < N; i += 4){dot0 += x0 * y0; x0 = x[0]; y0 = y[0];dot1 += x1 * y1; x1 = x[1]; y1 = y[1];dot2 += x2 * y2; x2 = x[2]; y2 = y[2];dot3 += y3 * y3; x3 = x[3]; y3 = y[3];

}

Versión 1.0 44

Estrategias de compilación

Loop unrolling

for (i=0; i < N; i++)dot += X[i] * Y[i];

for (i=0; i < N; i += 4) {dot += X[i] * Y[i];dot += X[i+1] * Y[i+1];dot += X[i+2] * Y[i+2];dot += X[i+3] * Y[i+3];

}

Versión 1.0 45

Estrategias de compilación

Scalar expansion

sum = 0.0;Do {sum += *X;sum += X[1];sum += X[2];sum += X[3];X += 4;

}while (X != stX);

sum1 = sum2 = 0.0; sum3 = sum = 0.0;do{

sum += *X;sum1 += X[1];sum2 += X[2];sum3 += X[3];X += 4;

}while (X != stX);sum += sum1 + sum2 + sum3;

Versión 1.0 46

Ordenes Evaluación de desempeño Máquina de Von Neumann (simplificada) Pipeline Computadores vectoriales Jerarquías de memorias Optimización al compilar Multiplicación de matrices

Versión 1.0 47

Sistema

Versión 1.0 48

Memoria La velocidad de acceso a memoria aumenta menos

que la velocidad de cómputo de la CPU !!!

Versión 1.0 49

Memoria Hay distintos tipos de memorias:

Diferentes costos, tamaño y velocidad

Cuanto más grande y más lejana al procesador:

más lenta

Por qué? – Física… c = 3.0x10^8 m/s, clock = 3GHz

c/clock = 10cm/ciclo

Otros: Propiedades como capacitancia

dependen de la longitud de los cables

Versión 1.0 50

Memoria Existe una jerarquía de memorias

Versión 1.0 51

Memoria

Registros

Cache (2 niveles)

RAM

Disco

Almacenamiento

remoto

Versión 1.0 52

Memoria

Versión 1.0 53

Memoria Principio de Localidad: Los programas

tienden a acceder a datos e instrucciones cercanas a las accedidas recientemente.

Localidad temporal Si un ítem es referenciado, tenderá a ser referenciado

nuevamente a la brevedad

Localidad espacial Si un ítem es referenciado, los items con direcciones

“cercanas” tenderán a ser referenciados a la brevedad

Versión 1.0 54

Caché Memoria pequeña y rápida, entre el

procesador y la memoria principal, diseñada para aprovechar el principio de localidad.

Versión 1.0 55

Caché – Cómo funciona? CPU requiere el contenido de una posición de

memoria:Se busca en el cache

Si está (caché hit), se lee del cache (rápido) Si no está (caché miss), se copia el bloque

requerido desde la memoria principal al cache

Luego se entrega desde el cache a la CPU El cache incluye “tags” (etiquetas) para

identificar que bloque de memoria principal está en cada línea

Versión 1.0 56

Caché – Por qué puede ocurrir un caché miss?

Compulsivo ( Obligatorio ) (arranque, primera referencia): primer acceso a un bloque Es un “hecho de la vida”: no se puede hacer nada para evitarlo Nota: Si se van a ejecutar “millones” de instrucciones, los Compulsory

Misses son insignificantes. Conflicto (colisión):

Múltiples zonas de memoria mapeadas a la misma ubicación del cache. Solución 1: incrementar tamaño del cache Solución 2: incrementar la asociatividad

Capacidad: El cache no puede contener todos los bloques accedidos por el

programa Solución: incrementar el tamaño del cache

Coherencia (Invalidez): otros procesos (ej. E/S) actualizan la memoria

Versión 1.0 57

Estrategias para aprovechar la caché:Mantener los datos más recientemente

accedidos “cercanos” al procesador

(Localidad Temporal)

Mover bloques de palabras contiguas al nivel

superior (Localidad Espacial)

Al trabajar con matrices es Importante la

localidad de espacial!!!

Caché

Versión 1.0 58

Organización de la memoria

Memoria Caché - Mejorar desempeño

Reducir el miss rate

Reducir la penalización por miss

Reducir el tiempo de hit en la caché

Versión 1.0 59

Organización de la memoria

Memoria virtualLa memoria física es limitada, se utiliza el

disco para tener un espacio de memoria mayor.

Page Fault – acceso a un dato (página) que

no está cargado en memoria física.

Versión 1.0 60

Memoria

Algunos aspectos a tener en cuenta al efectuar cálculos matriciales

Matrices completas vs dispersas

Lenguaje de programación en el que se está

trabajando En C se almacena por filas.

En Fortran se almacena por columnas.

Versión 1.0 61

Recorrida de matrices

for (int i= 0; i < N; i++) for (int j= 0; j < N; j++) a = a + A(i,j);

for (int j= 0; i < N; i++) for (int i= 0; j < N; j++) a = a + A(i,j);

Versión 1.0 62

Caso de estudio 1

Evaluar el problema anterior en Fortran o C (sin optimizador de código) para matrices de 512 y 1024

Versión 1.0 63

Caso de estudio 2

Multiplicación de matrices…..

Estrategia estándar

Strassen

Coppersmith y Winograd

Versión 1.0 64

Multiplicación de matrices

Estrategia estándar

.

For i = 1:nFor j = 1: n

For k = 1:n C(i,j) = C(i,j) + A(i,k)*B(k,j)

3 nOrden

Versión 1.0 65

Cómo podemos mejorar?

Strassen

Versión 1.0 66

Multiplicación de matrices

Cada paso recursivo:

7 multiplicaciones

18 adiciones ó restas

807,27log Orden 2 nn

Versión 1.0 67

Multiplicación de matrices

Coppersmith

y Winograd

Versión 1.0 68

Multiplicación de matrices

Cada paso recursivo:

7 “multiplicaciones”

14 adiciones ó restas

376,2Orden n

Versión 1.0 69

Caso de estudio

Mejoramos el Orden ….

Como podemos mejorar otras características del algoritmo estándar ?!Reordenar loopsTrabajando por bloques(Reducir caché misses!!!)

Recommended