Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Miguel Vargas-Flix
miguelvargas@cimat.mx
http://www.cimat.mx/~miguelvargas
CIMAT, September 2, 2015
1/34
1e10
1970
http://www.cimat.mx/~miguelvargas
2e10
1975
1985
1990
1995
4e10
3e10
2000
5e10
Intel Core 2
(49G ips)
6e10
PlayStation 3 Cell
(10G ips)
Motorola 68040
(44M ips)
Intel 80x486
(54M ips)
Motorola 68060
(88M ips)
Intel Pentium Pro
(541M ips)
0e0
Intel 80x386
(11M ips)
1980
Intel 80x286
(4M ips)
Motorola 68000
(1M ips)
Intel 8080
(500K ips)
Intel 4004
(92K ips)
Intel Core i7
(76G ips)
8e10
2005
AMD Phenom II X4
(43G ips)
7e10
2010
multi-core
processors
2/34
Tenemos que cambiar nuestros algoritmos para que corran lo ms eficientemente posible en los
procesadores multi-core.
instruction
instruction
instruction
Serial
algorithm
instruction
instruction
Parallel
algorithm
instruction
instruction
instruction
instruction
instruction
instruction
reduction
instruction
instruction
instruction
reduction
instruction
reduction
instruction
instruction
instruction
reduction
3/34
x2+y2
x3+y3
x4+y4
x5+y5
x6+y6
x7+y7
x8+y8
...
xn+yn
w1
w2
w3
w4
w5
w6
w7
w8
...
wn
En este caso las sumas pueden realizarse simultneamente, asignando una a cada procesador.
Lo que hay que resaltar es que no hay dependencia entre los diferentes pares de datos, tenemos
entonces el paralelismo ms eficiente.
http://www.cimat.mx/~miguelvargas
4/34
a= x i y i
i=1
donde a es un escalar.
Una primera aproximacin sera verlo como una secuencia de sumas de productos que requieren
irse acumulando.
x1 y1 + x2 y2 + x3 y3 + x4 y4 + x5 y5 + x6 y6 + x7 y7 +
...
+ xn yn
Time
http://www.cimat.mx/~miguelvargas
5/34
x1 y1
x2 y2
x3 y3
x4 y4
x5 y5
x6 y6
x7 y7
x8 y8
+
...
...
xn-1 yn-1
xn y n
+
+
+
a
En este caso se tiene una paralelizacin eficiente de la multiplicacin de las entradas de los
vectores, despus se va reduciendo la eficiencia al dividir las operaciones de suma en pares.
Muchos algoritmos seriales requieren, para ser paralelizados, de re-ordenar las operaciones con
una estrategia de divide y vencers, como en el caso del producto punto.
http://www.cimat.mx/~miguelvargas
6/34
Usualmente se tendrn memos procesadores que el tamao del vector, por lo que se asignan varias
operaciones de un grupo a cada procesador, las cuales se ejecutarn en serie, lo que limita la
eficiencia del paralelismo.
x1 y1
x5 y5
x2 y2
x6 y6
x3 y3
x7 y7
xn-1 yn-1
x4 y4
+
x8 y8
...
xn yn
+
+
a
http://www.cimat.mx/~miguelvargas
7/34
El esquema OpenMP
Sirve para paralelizar programas en C, C++ o Fortran en computadoras multi-core.
Busca que escribir cdigo en paralelo sea sencillo.
Es un esquema de paralelizacin con memoria compartida (todos los cores accesan a la misma
memoria).
Su funcionamiento interno es con threads, en el caso de sistemas POSIX se utiliza la librera de
POSIX-Threads (libpthread).
Una descripcin ms a detalle de OpenMP 2.5 la pueden encontrar en [Chap08].
http://www.cimat.mx/~miguelvargas
8/34
http://www.cimat.mx/~miguelvargas
9/34
1 thread
3 threads
start
instruction
instruction
instruction
instruction
instruction
instruction
1 thread
3 threads
1 thread
http://www.cimat.mx/~miguelvargas
reduction
instruction
instruction
instruction
reduction
10/34
En las computadoras multi-core logra la mejor eficiencia cuando cada core ejecuta slo un thread.
Parallel
section
Serial
section
Core 0
Core 1
Inactive
core
Core 2
Core 3
Active
core
Core n
Thread
creation
Synchronization
Waiting
core
Time
11/34
La paralelizacin sera...
http://www.cimat.mx/~miguelvargas
12/34
Un #pragma es una directiva para el compilador, significa que tiene que insertar cdigo especial
que haga algo que no est definido en el estandar de C o C++.
En este caso el #pragma internamente inserta cdigo oculto de OpenMP para paralelizar el for.
http://www.cimat.mx/~miguelvargas
13/34
En Visual C++ hay una opcin en las preferencias del proyecto para activar OpenMP
http://www.cimat.mx/~miguelvargas
14/34
15/34
Por ejemplo, supongamos ahora que size=100 y que los bloques siguen siendo de tamao 10.
La distribucin de ndices podra ser algo como:
void Suma(double* a, double* b, double* c, int size)
{
#pragma omp parallel for
for (int i = 0; i < 10; ++i)
for (int i = 10; i < 20; ++i)
{
{
c[i] = a[i] + b[i];
c[i] = a[i] + b[i];
}
}
for (int i = 40; i < 50; ++i)
for (int i = 30; i < 40; ++i)
{
{
c[i] = a[i] + b[i];
c[i] = a[i] + b[i];
}
}
for (int i = 80; i < 90; ++i)
for (int i = 70; i < 80; ++i)
{
{
c[i] = a[i] + b[i];
c[i] = a[i] + b[i];
}
}
for (int i = 90; i < 100; ++i)
{
c[i] = a[i] + b[i];
}
}
A los bloques se les llama chunk, y su tamao puede ser controlado por el programador.
http://www.cimat.mx/~miguelvargas
16/34
http://www.cimat.mx/~miguelvargas
17/34
http://www.cimat.mx/~miguelvargas
18/34
19/34
Si una computadora tiene un procesador con 4 cores, podemos decidir no utilizarlos todos.
Cmo se define el nmero de cores/threads a utilizar?
Por default el nmero de threads es igual al nmero de cores en la computadora.
Se puede establecer por medio de variables de ambiente.
Se puede definir en el cdigo en run-time.
En Windows:
set OMP_NUM_THREADS=3
test.exe
http://www.cimat.mx/~miguelvargas
20/34
http://www.cimat.mx/~miguelvargas
21/34
De esta forma se puede tener un control ms fino del nmero de threads para cada paralelizacin.
http://www.cimat.mx/~miguelvargas
22/34
Reducciones
El ejemplo que mostraremos es la paralelizacin del producto punto:
double ProductoPunto(double* a, double* b, int size)
{
double c = 0;
for (int i = 0; i < size; ++i)
c += a[i]*b[i];
return c;
}
Qu pasa si hacemos...?
double ProductoPunto(double* a, double* b, int size)
{
double c = 0;
#pragma omp parallel for
for (int i = 0; i < size; ++i)
c += a[i]*b[i];
return c;
}
http://www.cimat.mx/~miguelvargas
23/34
La forma en que OpenMP permite hacer operaciones de este tipo es por medio de la clusula
reduction.
Lo que hace reduction es crear tantas copias de c como threads existan e irlas acumulando por
separado, al terminar se suman stas y se tendr un solo resultado.
http://www.cimat.mx/~miguelvargas
24/34
Valor de
inicializacin
0
1
0
~0
0
0
1
0
25/34
Multiplicacin matriz-vector
Ahora veamos la multiplicacin matriz-vector.
void Mult(double* A, double* x, double* y, int rows, int cols)
{
#pragma omp parallel for
for (int i = 0; i < rows; ++i)
{
double sum = 0;
for (int k = 0; k < cols; ++k)
{
sum += A[i*cols + k]*x[k];
}
y[i] = sum;
}
}
Hay que notar que las operaciones no se interfieren, dado que cada iteracin slo escribe en el
elemento y[i].
http://www.cimat.mx/~miguelvargas
26/34
Speed-up
La aceleracin (speed-up) de un programa en paralelo,
t1
S= .
tn
12
Speed-up
Ideal Speed-up
10
Speed-up
0
0
10
12
14
16
Threads
http://www.cimat.mx/~miguelvargas
27/34
Time [m]
15
10
0
1
10
11
12
13
14
15
16
Threads
Sea t 1 el tiempo real que tard el resolverse un problema con un thread, n el nmero de
procesadores utilizado, el tiempo ideal de ejecucin lo podemos definir como
t1
i n= .
n
http://www.cimat.mx/~miguelvargas
28/34
i
t
E= n = 1 .
t n nt n
1.0
0.9
0.8
0.7
Efficiency
0.6
0.5
0.4
0.3
0.2
0.1
0.0
1
10
11
12
13
14
15
16
Threads
http://www.cimat.mx/~miguelvargas
29/34
Teorema de Gergorin
nn
Sea A
http://www.cimat.mx/~miguelvargas
30/34
10 1 0
1
A= 0.2 8 0.2 0.2 ,
1
1
2
1
1 1 1 11
se obtienen cuatro discos D ( 10, 2 ), D ( 8, 0.6 ), D ( 2, 3 ), D (11,3 ).
i
10
D (8, 0.6 )
x
-10
D (11, 3 )
-5
D ( 2, 3 )
10
D (10, 2 )
-5
31/34
El nmero de condicin de una matriz A no singular, para una norma est dado por
( A )=AA1.
Para la norma 2,
max ( A )
( A )=AA =
,
min ( A )
1
http://www.cimat.mx/~miguelvargas
32/34
Preguntas?
miguelvargas@cimat.mx
http://www.cimat.mx/~miguelvargas
33/34
Referencias
[Chap08] B. Chapman, G. Jost, R. van der Pas. Using OpenMP: Portable Shared Memory Parallel
Programming. The MIT Press, 2008.
[Varg04] R. S. Varga. Gergorin and His Circles. Springer. 2004.
http://www.cimat.mx/~miguelvargas
34/34