1
¿Qué es paralelismo?
Dos o más procesos o hilos se ejecutan al mismo tiempo
Paralelismo para arquitecturas con varios núcleos
Múltiples procesos
Comunicación a través de IPCs (Inter-Process Communication)
Un solo proceso, múltiples hilos
Comunicación a través de memoria compartida
2
(Gp:)
n = número de procesadores
(Gp:) Tparalelo = {(1-P) + P/n} Tserial
(Gp:) Aceleración = Tserial / Tparalelo
Ley de Amdahl
Describe el límite máximo de aceleración con ejecución paralela
El código serial limita la aceleración
(Gp:) (1-P)
(Gp:) P
(Gp:) T
(Gp:) serial
(Gp:) (1-P)
(Gp:) P/2
(Gp:) 0.5 + 0.25
(Gp:) 1.0/0.75 = 1.33
n = 2
n = 8
(Gp:) P/8
(Gp:) .
(Gp:) 0.5 + 0.0
(Gp:) 1.0/0.5 = 2.0
3
Procesos e Hilos
Los sistemas operativos modernos cargan programas como procesos
Tiene recursos
Ejecución
Un proceso inicia ejecutando su punto de entrada como un hilo
Los hilos pueden crear otros hilos dentro del proceso
Cada hilo obtiene su propio stack
Todos los hilos dentro de un proceso comparten código y segmentos de datos
Procesos e Hilos
(Gp:) Code segment
(Gp:) Data segment
thread
main()
(Gp:) .
(Gp:) thread
(Gp:) thread
(Gp:) Stack
(Gp:) Stack
(Gp:) Stack
4
Hilos – Beneficios y riesgos
Beneficios
Mayor rendimiento y mejor utilización de recursos
Incluso en sistemas con un solo procesador – para esconder latencia e incrementar el tiempo de respuesta
Comunicación entre procesos a través de memoria compartida es más eficiente
Riesgos
Incrementa la complejidad de la aplicación
Difícil de depurar (condiciones de concurso, interbloqueos, etc.)
5
Preguntas comunes cuando se paralelizan aplicaciones
¿Dónde paralelizar?
¿Cuánto tiempo lleva paralelizar?
¿Cuánto esfuerzo para rediseñar se requiere?
¿Es útil paralelizar una región específica?
¿Qué tanto se espera acelerar?
¿El rendimiento va de acuerdo a mis expectativas?
¿Será escalable a más hilos/datos añadidos?
¿Qué modelo de paralelización utilizar?
6
Generación de Números Primos
bool TestForPrime(int val)
{ // let's start checking from 3
int limit, factor = 3;
limit = (long)(sqrtf((float)val)+0.5f);
while( (factor < = limit) && (val % factor) )
factor += 2;
return (factor > limit);
}
void FindPrimes(int start, int end)
{
int range = end – start + 1;
for( int i = start; i < = end; i += 2 )
{
if( TestForPrime(i) )
globalPrimes[gPrimesFound++] = i;
ShowProgress(i, range);
}
}
(Gp:) i
(Gp:) factor
61 3 5 7
63 3
65 3 5
67 3 5 7
69 3
71 3 5 7
73 3 5 7 9
75 3 5
77 3 5 7
79 3 5 7 9
7
Actividad 1
Ejecutar la versión serial de los números primos
Buscar el directorio PrimeSingle
Compilar con Intel® Parallel Composer en Visual Studio
Ejecutar algunas veces con rangos diferentes
8
Metodología de Desarrollo
Análisis
Buscar código donde se realiza cómputo intensivo
Diseño (Introducir Hilos)
Determinar como implementar una solución paralelizada
Depurar
Detectar cualquier problema como resultado de usar hilos
Afinar para mejorar el rendimiento
Lograr el mejor rendimiento en paralelo
9
Ciclo de Desarrollo
Análisis
Intel® Parallel Amplifier
Diseño (Introducir Hilos)
Intel® Performance libraries: IPP y MKL
OpenMP* (Intel® Parallel Composer)
Creción explícita de hilos (Win32*, Pthreads*)
Depuración
Intel® Parallel Inspector
Intel Debugger
Afinar para mejorar el rendimiento
Intel® Parallel Amplifier
10
Usaremos el proyecto PrimeSingle para el análisis
PrimeSingle < inicio> < fin>
Ejemplo: ./PrimeSingle 1 1000000
Análisis de Hotspot
Usa Parallel Amplifier para encontrar los hotspots en la aplicación
bool TestForPrime(int val)
{ // let's start checking from 3
int limit, factor = 3;
limit = (long)(sqrtf((float)val)+0.5f);
while( (factor < = limit) && (val % factor))
factor ++;
return (factor > limit);
}
void FindPrimes(int start, int end)
{
// start is always odd
int range = end – start + 1;
for( int i = start; i < = end; i+= 2 ){
if( TestForPrime(i) )
globalPrimes[gPrimesFound++] = i;
ShowProgress(i, range);
}
}
Identifica las regiones que consumen tiempo
11
Análisis – Call Stack
Inspeccionar el código desde el nodo (TestForPrime)
Buscar un loop para paralelizar
Si no se encuentra ninguno, avanza en el call stack hasta encontrar un ciclo adecuado o llamada a función para paralelizar
Este es el nivel en el árbol de llamadas donde necesitamos paralelizar
Usado para encontrar el nível apropiado en el árbol de llamadas para paralelizar
12
Actividad 2
Ejecuta el código con el rango de '1 5000000' para obtener la medición base
Tomar nota para referencias futuras
Hacer el análisis de Hotspots en el código serial
¿Qué función se lleva la mayor parte del tiempo?
Página siguiente |