Cómputo en paralelo con OpenMP 1 - CIMATpersonal.cimat.mx:8181/~miguelvargas/Course...

34
Cómputo en paralelo con OpenMP 1 Miguel Vargas-Félix [email protected] http://www.cimat.mx/~miguelvargas CIMAT, September 2, 2015 1/34

Transcript of Cómputo en paralelo con OpenMP 1 - CIMATpersonal.cimat.mx:8181/~miguelvargas/Course...

Page 1: Cómputo en paralelo con OpenMP 1 - CIMATpersonal.cimat.mx:8181/~miguelvargas/Course notes...vectores, después se va reduciendo la eficiencia al dividir las operaciones de suma en

Cómputo en paralelo con OpenMP 1

Miguel Vargas-Félix

[email protected]://www.cimat.mx/~miguelvargas

CIMAT, September 2, 2015 1/34

Page 2: Cómputo en paralelo con OpenMP 1 - CIMATpersonal.cimat.mx:8181/~miguelvargas/Course notes...vectores, después se va reduciendo la eficiencia al dividir las operaciones de suma en

Velocidad de los procesadores de escritorio

Recientemente, la velocidad de procesamiento a crecido debido al uso de procesadores multi-core.

1970 1975 1980 1985 1990 1995 2000 2005 20100e0

1e10

2e10

3e10

4e10

5e10

6e10

7e10

8e10

Inte

l 400

4(9

2K ip

s)

Inte

l 808

0(5

00K

ips)

Mot

orol

a 68

000

(1M

ips)

Inte

l 80x

286

(4M

ips)

Inte

l 80x

386

(11M

ips)

Mot

orol

a 68

040

(44M

ips)

Inte

l 80x

486

(54M

ips)

Mot

orol

a 68

060

(88M

ips)

Inte

l Pen

tium

Pro

(541

M ip

s)

Inte

l Pen

tium

III

(1.4

G ip

s)

AM

D A

thlo

n X

P (

5.9G

ips)

Inte

l Pen

tium

IV (

9.7G

ips)

Pla

ySta

tion

3 C

ell

(10G

ips)

Inte

l Cor

e 2

(49G

ips)

Inte

l Cor

e i7

(76G

ips)

AM

D P

heno

m II

X4

(43G

ips)

Num

ber

of in

stru

ctio

ns p

er s

econ

d

multi-coreprocessors

http://www.cimat.mx/~miguelvargas 2/34

Page 3: Cómputo en paralelo con OpenMP 1 - CIMATpersonal.cimat.mx:8181/~miguelvargas/Course notes...vectores, después se va reduciendo la eficiencia al dividir las operaciones de suma en

Tenemos que cambiar nuestros algoritmos para que corran lo más eficientemente posible en losprocesadores multi-core.

Serialalgorithm

instruction

instruction

instruction

instruction

instruction

instruction

reduction

instruction

instruction

instruction

reduction

Parallelalgorithm

instruction instruction instruction

instruction instruction instruction

reduction

instructioninstruction instruction

reduction

La meta es reducir tiempo necesario para realizar una secuencia de instrucciones.

La buena noticia es:Hacer programas en paralelo con OpenMP es muy sencillo.

La mala noticia es:Hacer programas en paralelo eficientes requiere un esfuerzo extra.

http://www.cimat.mx/~miguelvargas 3/34

Page 4: Cómputo en paralelo con OpenMP 1 - CIMATpersonal.cimat.mx:8181/~miguelvargas/Course notes...vectores, después se va reduciendo la eficiencia al dividir las operaciones de suma en

Operaciones matemáticas en paralelo

Fácilmente paralelizablesEsto significa que pueden separarse en varias sub-operaciones que puede realizarse de formaindependiente.

Por ejemplo, la suma de dos vectores w=x+y, con w ,x , y∈ℝn,

wi=xi+ yi.

Y supongamos que tenemos n procesadores.

x1+y

1x

2+y

2x

3+y

3x

4+y

4x

5+y

5x

6+y

6x

7+y

7x

8+y

8 ... xn+y

n

w1

w2

w3

w4

w5

w6

w7

w8

wn...

En este caso las sumas pueden realizarse simultáneamente, asignando una a cada procesador.

Lo que hay que resaltar es que no hay dependencia entre los diferentes pares de datos, tenemosentonces el paralelismo más eficiente.

http://www.cimat.mx/~miguelvargas 4/34

Page 5: Cómputo en paralelo con OpenMP 1 - CIMATpersonal.cimat.mx:8181/~miguelvargas/Course notes...vectores, después se va reduciendo la eficiencia al dividir las operaciones de suma en

No tan fáciles de paralelizarPor ejemplo el producto punto, a=⟨x ,y ⟩, con x , y∈ℝn,

a=∑i=1

n

xi yi

donde a es un escalar.

Una primera aproximación sería verlo como una secuencia de sumas de productos que requierenirse acumulando.

x1 y

1x

2 y

2x

3 y

3x

4 y

4x

5 y

5x

6 y

6x

7 y

7x

n y

n...+ + + + + + + + a

Time

Al verlo así no es una operación paralelizable.

http://www.cimat.mx/~miguelvargas 5/34

Page 6: Cómputo en paralelo con OpenMP 1 - CIMATpersonal.cimat.mx:8181/~miguelvargas/Course notes...vectores, después se va reduciendo la eficiencia al dividir las operaciones de suma en

Sin embargo, podemos reorganizar el proceso como se muestra en la figura:

x1 y

1x

2 y

2x

3 y

3x

4 y

4x

5 y

5x

6 y

6x

7 y

7x

8 y

8x

n y

n...

+

+

a

+ + +

+ +

xn-1

yn-1

+

+...

En este caso se tiene una paralelización eficiente de la multiplicación de las entradas de losvectores, después 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 conuna estrategia de divide y vencerás, como en el caso del producto punto.

http://www.cimat.mx/~miguelvargas 6/34

Page 7: Cómputo en paralelo con OpenMP 1 - CIMATpersonal.cimat.mx:8181/~miguelvargas/Course notes...vectores, después se va reduciendo la eficiencia al dividir las operaciones de suma en

Usualmente se tendrán memos procesadores que el tamaño del vector, por lo que se asignan variasoperaciones de un grupo a cada procesador, las cuales se ejecutarán en serie, lo que limita laeficiencia del paralelismo.

x1 y

1

x2 y

2

x3 y

3

x4 y

4

x5 y

5

x6 y

6

x7 y

7

x8 y

8x

n y

n...

+

a

xn-1

yn-1

+ +

http://www.cimat.mx/~miguelvargas 7/34

Page 8: Cómputo en paralelo con OpenMP 1 - CIMATpersonal.cimat.mx:8181/~miguelvargas/Course notes...vectores, después se va reduciendo la eficiencia al dividir las operaciones de suma en

El esquema OpenMP

● Sirve para paralelizar programas en C, C++ o Fortran en computadoras multi-core.

● Busca que escribir código en paralelo sea sencillo.

● Es un esquema de paralelización con memoria compartida (todos los cores accesan a la mismamemoria).

● Su funcionamiento interno es con threads, en el caso de sistemas POSIX se utiliza la librería dePOSIX-Threads (libpthread).

Una descripción más a detalle de OpenMP 2.5 la pueden encontrar en [Chap08].

http://www.cimat.mx/~miguelvargas 8/34

Page 9: Cómputo en paralelo con OpenMP 1 - CIMATpersonal.cimat.mx:8181/~miguelvargas/Course notes...vectores, después se va reduciendo la eficiencia al dividir las operaciones de suma en

Compiladores que soportan OpenMPAlgunos de los compiladores que tienen soporte para OpenMP son:

● GNU Compiler Collection GCC (versión ≥ 4.3.2).

● The LLVM Compiler Infrastructure (versión ≥ 3.7.0)

● Intel C++ and Fortran Compilers (version ≥ 10.1) 1

● Microsoft Visual Studio Professional (version ≥ 2008) 2

● Microsoft Visual Studio Express (version ≥ 2012) 3

● Microsoft Visual Studio Community (2015) 4

La lista completa se puede consultar en http://openmp.org/wp/openmp-compilers

1 Versión gratuita para Linux para estudiantes.http://software.intel.com/en-us/non-commercial-software-development

2 Descargable de forma gratuita para estudiantes de instituciones de educación superior en Microsoft DreamSpark.http://www.dreamspark.com

3 Gratis para todo tipo de desarrollo.http://www.microsoft.com/visualstudio/eng/products/visual-studio-express-products

4 Completamente gratis para empresas pequeñas y desarrollo open source.https://www.visualstudio.com/en-us/products/visual-studio-community-vs.aspx

http://www.cimat.mx/~miguelvargas 9/34

Page 10: Cómputo en paralelo con OpenMP 1 - CIMATpersonal.cimat.mx:8181/~miguelvargas/Course notes...vectores, después se va reduciendo la eficiencia al dividir las operaciones de suma en

Programación con multi-hilos (multi-threads)

A la ejecución secuencial de una conjunto de instrucciones se le conoce como un hilo deprocesamiento o thread.

instruction instruction instruction

instruction instruction instruction

start

instructioninstruction instruction

reduction

reduction

3 threads

1 thread

1 thread

3 threads

1 thread

http://www.cimat.mx/~miguelvargas 10/34

Page 11: Cómputo en paralelo con OpenMP 1 - CIMATpersonal.cimat.mx:8181/~miguelvargas/Course notes...vectores, después se va reduciendo la eficiencia al dividir las operaciones de suma en

En las computadoras multi-core logra la mejor eficiencia cuando cada core ejecuta sólo un thread.

Core n

Core 0

Core 1

Core 2

Core 3Activecore

Inactivecore

Serialsection

Parallelsection

SynchronizationThreadcreation

Waitingcore

Time

Cuando se paraleliza no todos los threads terminan al mismo tiempo.

Dentro de un programa, cada thread posee sus propios registros de control y su propio stack dedatos, mientas que comparte el uso de las regiones de memoria heap y data con los demás threadsdel programa.

http://www.cimat.mx/~miguelvargas 11/34

Page 12: Cómputo en paralelo con OpenMP 1 - CIMATpersonal.cimat.mx:8181/~miguelvargas/Course notes...vectores, después se va reduciendo la eficiencia al dividir las operaciones de suma en

Paralelización con OpenMP

Suma de vectoresComencemos con la paralelización de la suma de dos vectores:

void Suma(double* a, double* b, double* c, int size){

for (int i = 0; i < size; ++i){

c[i] = a[i] + b[i];}

}

La paralelización sería...

http://www.cimat.mx/~miguelvargas 12/34

Page 13: Cómputo en paralelo con OpenMP 1 - CIMATpersonal.cimat.mx:8181/~miguelvargas/Course notes...vectores, después se va reduciendo la eficiencia al dividir las operaciones de suma en

... la paralelización sería:

void Suma(double* a, double* b, double* c, int size){

#pragma omp parallel forfor (int i = 0; i < size; ++i){

c[i] = a[i] + b[i];}

}

Un #pragma es una directiva para el compilador, significa que tiene que insertar código especialque haga algo que no está definido en el estandar de C o C++.

En este caso el #pragma internamente inserta código oculto de OpenMP para paralelizar el for.

http://www.cimat.mx/~miguelvargas 13/34

Page 14: Cómputo en paralelo con OpenMP 1 - CIMATpersonal.cimat.mx:8181/~miguelvargas/Course notes...vectores, después se va reduciendo la eficiencia al dividir las operaciones de suma en

Compilación de un código con OpenMPNo es suficiente con agregar el #pragma, hace falta decirle al compilador que agregue el soportepara OpenMP.

Para compilar con GCC es necesario agregar:

g++ -o programa -fopenmp suma.cpp

En Visual C++ hay una opción en las preferencias del proyecto para activar OpenMP

http://www.cimat.mx/~miguelvargas 14/34

Page 15: Cómputo en paralelo con OpenMP 1 - CIMATpersonal.cimat.mx:8181/~miguelvargas/Course notes...vectores, después se va reduciendo la eficiencia al dividir las operaciones de suma en

Paralelización del forLa forma en que OpenMP paraleliza un for es formando bloques de índices (el tamaño de losbloques es controlable).

Supongamos que tenemos una computadora con 3 cores.

Para la suma de vectores size=30 y que los bloques son de tamaño 10.

void Suma(double* a, double* b, double* c, int size){

#pragma omp parallel forfor (int i = 0; i < 10; ++i) for (int i = 10; i < 20; ++i) for (int i = 20; i < 30; ++i){ { {

c[i] = a[i] + b[i]; c[i] = a[i] + b[i]; c[i] = a[i] + b[i];} } }

}

OpenMP asigna un bloque de índices a cada core.

▪ Al core 0 le toca procesar el for con los índices 0-9

▪ Al core 1 le toca procesar el for con los índices 10-19

▪ Al core 2 le toca procesar el for con los índices 20-29

http://www.cimat.mx/~miguelvargas 15/34

Page 16: Cómputo en paralelo con OpenMP 1 - CIMATpersonal.cimat.mx:8181/~miguelvargas/Course notes...vectores, después se va reduciendo la eficiencia al dividir las operaciones de suma en

Por ejemplo, supongamos ahora que size=100 y que los bloques siguen siendo de tamaño 10.

La distribución de índices podría ser algo como:

void Suma(double* a, double* b, double* c, int size){

#pragma omp parallel forfor (int i = 0; i < 10; ++i) for (int i = 10; i < 20; ++i) for (int i = 20; i < 30; ++i){ { {

c[i] = a[i] + b[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) for (int i = 50; i < 60; ++i){ { {

c[i] = a[i] + b[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) for (int i = 60; i < 70; ++i){ { {

c[i] = a[i] + b[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 tamaño puede ser controlado por el programador.

http://www.cimat.mx/~miguelvargas 16/34

Page 17: Cómputo en paralelo con OpenMP 1 - CIMATpersonal.cimat.mx:8181/~miguelvargas/Course notes...vectores, después se va reduciendo la eficiencia al dividir las operaciones de suma en

La distribución de los índices es controlada por OpenMP.

Nosotros simplemente tenemos que escribir

void Suma(double* a, double* b, double* c, int size){

#pragma omp parallel forfor (int i = 0; i < size; ++i){

c[i] = a[i] + b[i];}

}

y dejamos que OpenMP haga el resto.

Si el compilador no tiene soporte para OpenMP, entonces el #pragma es ignorado y tendremos laversión serial del programa.

Si la computadora no es multi-core, entonces también se ejecutará el código en serie.

Este esquema permite primero probar nuestro código en serie y luego ejecutarlo en paralelo.

http://www.cimat.mx/~miguelvargas 17/34

Page 18: Cómputo en paralelo con OpenMP 1 - CIMATpersonal.cimat.mx:8181/~miguelvargas/Course notes...vectores, después se va reduciendo la eficiencia al dividir las operaciones de suma en

Paralelizar bloques de código

Además de paralelizar ciclos, es posible paralelizar bloques

#pragma omp parallel{

// ... codigo a ejecutar en paralelo...int thread = omp_get_thread_num();

}

omp_get_thread_num regresa el número de thread actual.

http://www.cimat.mx/~miguelvargas 18/34

Page 19: Cómputo en paralelo con OpenMP 1 - CIMATpersonal.cimat.mx:8181/~miguelvargas/Course notes...vectores, después se va reduciendo la eficiencia al dividir las operaciones de suma en

Controlar el número de threads

#include <stdio.h>#include <omp.h>

int main(){

int max = omp_get_max_threads();printf("omp_get_max_threads = %i\n", max);

#pragma omp parallel{

int t = omp_get_thread_num();printf(" omp_get_thread_num = %i\n", t);

}

return 0;}g++ -o test -fopenmp test.cpp./test

La función omp_get_max_threads regresa la cantidad máxima de threads establecida.

omp_get_thread_num regresa el ID del thread, los threads se identifican enumeran iniciando en 0.

http://www.cimat.mx/~miguelvargas 19/34

Page 20: Cómputo en paralelo con OpenMP 1 - CIMATpersonal.cimat.mx:8181/~miguelvargas/Course notes...vectores, después se va reduciendo la eficiencia al dividir las operaciones de suma en

Si una computadora tiene un procesador con 4 cores, podemos decidir no utilizarlos todos.

¿Cómo se define el número de cores/threads a utilizar?

● Por default el número de threads es igual al número de cores en la computadora.

● Se puede establecer por medio de variables de ambiente.

● Se puede definir en el código en run-time.

Establecer número de threads con variables de ambienteSe hace a través de la variable de ambiente OMP_NUM_THREADS. La variable se tiene queinicializar antes de ejecutar el programa.

En Linux/Unix (Bash):

export OMP_NUM_THREADS=3./test

En Windows:

set OMP_NUM_THREADS=3test.exe

http://www.cimat.mx/~miguelvargas 20/34

Page 21: Cómputo en paralelo con OpenMP 1 - CIMATpersonal.cimat.mx:8181/~miguelvargas/Course notes...vectores, después se va reduciendo la eficiencia al dividir las operaciones de suma en

Establecer número de threads con códigoUna forma es utilizando una función de OpenMP, para esto es necesario incluir el header “omp.h”,el cual incluye varias funciones para el control de threads.

#include <omp.h>

void Suma(double* a, double* b, double* c, int size){

#pragma omp parallel forfor (int i = 0; i < size; ++i) {

c[i] = a[i] + b[i];}

}

int main(){

omp_set_num_threads(3);...Suma(a, b, c, 100);

}

omp_set_num_threads permite establecer el número de threads a utilizar en todas las siguientesparalelizaciones.

http://www.cimat.mx/~miguelvargas 21/34

Page 22: Cómputo en paralelo con OpenMP 1 - CIMATpersonal.cimat.mx:8181/~miguelvargas/Course notes...vectores, después se va reduciendo la eficiencia al dividir las operaciones de suma en

Otra forma sería utilizando la clausula num_threads.

void Suma(double* a, double* b, double* c, int size, int threads){

#pragma omp parallel for num_threads(threads)for (int i = 0; i < size; ++i) {

c[i] = a[i] + b[i];}

}

int main(){

int threads = 3;...Suma(a, b, c, 100, threads);

}

De esta forma se puede tener un control más fino del número de threads para cada paralelización.

http://www.cimat.mx/~miguelvargas 22/34

Page 23: Cómputo en paralelo con OpenMP 1 - CIMATpersonal.cimat.mx:8181/~miguelvargas/Course notes...vectores, después se va reduciendo la eficiencia al dividir las operaciones de suma en

Reducciones

El ejemplo que mostraremos es la paralelización 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 forfor (int i = 0; i < size; ++i)

c += a[i]*b[i];return c;

}

http://www.cimat.mx/~miguelvargas 23/34

Page 24: Cómputo en paralelo con OpenMP 1 - CIMATpersonal.cimat.mx:8181/~miguelvargas/Course notes...vectores, después se va reduciendo la eficiencia al dividir las operaciones de suma en

La forma en que OpenMP permite hacer operaciones de este tipo es por medio de la cláusulareduction.

double ProductoPunto(double* a, double* b, int size){

double c = 0;#pragma omp parallel for reduction(+:c)for (int i = 0; i < size; ++i)

c += a[i]*b[i];return c;

}

Lo que hace reduction es crear tantas copias de c como threads existan e irlas acumulando porseparado, al terminar se suman éstas y se tendrá un solo resultado.

http://www.cimat.mx/~miguelvargas 24/34

Page 25: Cómputo en paralelo con OpenMP 1 - CIMATpersonal.cimat.mx:8181/~miguelvargas/Course notes...vectores, después se va reduciendo la eficiencia al dividir las operaciones de suma en

Las operaciones soportadas en las reduciones son:

Operador dereducción

Valor deinicialización

+ 0* 1- 0& ~0| 0^ 0

&& 1|| 0

maxmin

Para poner múltiples reduciones, puede ser como:

double minimum = a[0];double maximum = a[0];

#pragma omp parallel for reduction(min:minimum) reduction(max:maximum)for (int i = 1; i < size; ++i){

if (minimum > a[i])minimum = a[i];

else if (maximum < a[i])maximum = a[i];

}

http://www.cimat.mx/~miguelvargas 25/34

Page 26: Cómputo en paralelo con OpenMP 1 - CIMATpersonal.cimat.mx:8181/~miguelvargas/Course notes...vectores, después se va reduciendo la eficiencia al dividir las operaciones de suma en

Multiplicación matriz-vector

Ahora veamos la multiplicación matriz-vector.

void Mult(double* A, double* x, double* y, int rows, int cols){

#pragma omp parallel forfor (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 iteración sólo escribe en elelemento y[i].

http://www.cimat.mx/~miguelvargas 26/34

Page 27: Cómputo en paralelo con OpenMP 1 - CIMATpersonal.cimat.mx:8181/~miguelvargas/Course notes...vectores, después se va reduciendo la eficiencia al dividir las operaciones de suma en

Speed-up

La aceleración (speed-up) de un programa en paralelo,

S=t1

t n

.

0 2 4 6 8 10 12 14 160

2

4

6

8

10

12

Speed-up

Ideal Speed-up

Threads

Sp

ee

d-u

p

http://www.cimat.mx/~miguelvargas 27/34

Page 28: Cómputo en paralelo con OpenMP 1 - CIMATpersonal.cimat.mx:8181/~miguelvargas/Course notes...vectores, después se va reduciendo la eficiencia al dividir las operaciones de suma en

Pérdida de eficiencia con el aumento de threads

Ejemplo de un programa trabajando en una computadora con 16 cores/threads

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

0

5

10

15

20

25

Real time [m]

Ideal time [m]

Threads

Tim

e [m

]

Sea t 1 el tiempo real que tardó el resolverse un problema con un thread, n el número deprocesadores utilizado, el tiempo ideal de ejecución lo podemos definir como

in=t1

n.

http://www.cimat.mx/~miguelvargas 28/34

Page 29: Cómputo en paralelo con OpenMP 1 - CIMATpersonal.cimat.mx:8181/~miguelvargas/Course notes...vectores, después se va reduciendo la eficiencia al dividir las operaciones de suma en

Podemos dar una medida de eficiencia E de un algoritmo

E=in

t n

=t1

nt n

.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 160.0

0.1

0.2

0.3

0.4

0.5

0.6

0.7

0.8

0.9

1.0

Threads

Effi

cie

ncy

http://www.cimat.mx/~miguelvargas 29/34

Page 30: Cómputo en paralelo con OpenMP 1 - CIMATpersonal.cimat.mx:8181/~miguelvargas/Course notes...vectores, después se va reduciendo la eficiencia al dividir las operaciones de suma en

Teorema de Geršgorin

Sea A∈ℂn×n, con entradas ai j. Definamos los radios

r i=∑j≠i

|ai j|, i=1, 2,… , n,

como la suma de las entradas fuera de la diagonal del renglón i.

Sea D (ai i , r i ) un disco cerrado en el plano complejo, con centro en ai i y radio r i. Estos discos sonllamados discos de Geršgorin [Varg04].

Teorema: Cada eigenvalor de A está dentro de alguno de los discos de Geršgorin D (ai i , r i ).

http://www.cimat.mx/~miguelvargas 30/34

Page 31: Cómputo en paralelo con OpenMP 1 - CIMATpersonal.cimat.mx:8181/~miguelvargas/Course notes...vectores, después se va reduciendo la eficiencia al dividir las operaciones de suma en

Ejemplo, podemos estimar los eigenvalores de

A=(10 −1 0 10.2 8 0.2 0.21 1 2 1

−1 −1 −1 −11),

se obtienen cuatro discos D (10,2), D (8,0.6), D (2,3), D (−11,3).

x

i10

5

-5

5 10-5-10

D (10, 2)D (−11, 3)

D (8,0.6)

D (2, 3)

Los eigenvalores de A son: 9.8218, 8.1478, 1.8995, -10.86.

http://www.cimat.mx/~miguelvargas 31/34

Page 32: Cómputo en paralelo con OpenMP 1 - CIMATpersonal.cimat.mx:8181/~miguelvargas/Course notes...vectores, después se va reduciendo la eficiencia al dividir las operaciones de suma en

El número de condición κ de una matriz A no singular, para una norma ‖⋅‖ está dado por

κ (A )=∥A∥⋅∥A−1∥.

Para la norma ∥⋅∥2,

κ (A )=∥A∥⋅∥A−1∥=σmax (A )

σmin (A ),

donde σ son los valores singulares de la matriz.

Para una matriz A simétrica positiva definida,

κ (A )=λmax (A )

λmin (A),

donde λ son los eigenvalores de A. Así, matrices con un número de condición cercano a 1 se dicenque están bien condicionadas.

Podemos utilizar el teorema de Geršgorin para encontar un aproximado del número de condiciónpara de matrices dispersas (simétricas positivas definidas).

http://www.cimat.mx/~miguelvargas 32/34

Page 33: Cómputo en paralelo con OpenMP 1 - CIMATpersonal.cimat.mx:8181/~miguelvargas/Course notes...vectores, después se va reduciendo la eficiencia al dividir las operaciones de suma en

¿Preguntas?

[email protected]

http://www.cimat.mx/~miguelvargas 33/34

Page 34: Cómputo en paralelo con OpenMP 1 - CIMATpersonal.cimat.mx:8181/~miguelvargas/Course notes...vectores, después se va reduciendo la eficiencia al dividir las operaciones de suma en

Referencias

[Chap08] B. Chapman, G. Jost, R. van der Pas. Using OpenMP: Portable Shared Memory ParallelProgramming. The MIT Press, 2008.

[Varg04] R. S. Varga. Geršgorin and His Circles. Springer. 2004.

http://www.cimat.mx/~miguelvargas 34/34