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!!!)
Top Related