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 |