SlideShare una empresa de Scribd logo
1 de 133
Descargar para leer sin conexión
CENTRO UNIVERSITARIO DE LA COSTA SUR
UNIVERSIDAD DE GUADALAJARA
DIVISI´ON DE DESARROLLO REGIONAL
DEPARTAMENTO DE INGENIER´IAS
INGENIER´IA EN TELEINFORM´ATICA
PARA OBTENER EL T´ITULO DE INGENIERO EN TELEINFORM´ATICA
BAJO LA MODALIDAD DE TITULACI´ON
TESIS
CON EL T´ITULO
“Esquemas Iterativos en Paralelo con OpenMP”
PRESENTA
Sotero Ordo˜nes Nogales
DIRECTOR
Dr. Jos´e Antonio Mu˜noz G´omez
ASESORES
Dr. Luis Isidro Aguirre Salas Dr. Omar Aguilar Loreto
Autl´an de la Grana, Jalisco. Enero 2013
UNIVERSIDAD DE GUADALAJARA
CENTRO UNIVERSITARIO DE LA COSTA SUR
SECRETARÍA ACADÉMICA – COORDINACIÓN DE INGENIERÍA EN TELEINFORMÁTICA
Avenida Independencia Nacional # 151, Autlán de Navarro, Jalisco; C.P. 48900, Tels. (317) 382-50-10 Y 382-32- 00
http://www.cucsur.udg.mx
C. SOTERO ORDOÑES NOGALES
Egresado de la Carrera de Ingeniería en Teleinformática
P R E S E N T E
A través de la presente, se le informa que fue APROBADA su modalidad de
titulación de TESIS, para titularse de la carrera de Ingeniero en Teleinformática.
Así mismo, se le informa que estará asignado como Director al DR. JOSE
ANTONIO MUÑOZ GÓMEZ y DR. OMAR AGUILAR LORETO y DR. LUIS ISIDRO AGUIRRE
SALAS, como asesores.
Se anexa una guía con los temas que debe considerar para realizar dicho
documento y se le informa a su vez que tiene 8 meses a partir de la fecha del presente
para entrega del trabajo recepcional con el visto bueno del Director. Debe presentar
siete ejemplares impresos con una copia de este oficio en primer término. Además,
debe agregar portada y un formato específicos, solicitarlos antes de su entrega.
ATENTAMENTE
“PIENSA Y TRABAJA”
AUTLÁN DE NAVARRO, JAL. 04 DE DICIEMBRE DE 2012.
___________________________________________
M.T.A. CLAUDIA DIANE VACA GAVIÑO
COORDINADOR DE LA CARRERA DE INGENIERÍA Y DE TSU EN TELEINFORMÁTICA
C.C.P ARCHIVO
Dedicatorias y Agradecimientos
He llegado al final de una peque˜na traves´ıa en el viaje de la vida; durante ´este trayecto he
adquirido experiencias que han dejado estelas imborrables. Me permito mencionar a las dos personas
que se convirtieron en la estrella polar de este pobre marinero:
A Nora Marisol Ch´avez Guerrero,
...mi inspiraci´on y motivaci´on.
A mi padre, Luis Ord´o˜nez D´ıaz
que siempre estar´a en mi recuerdo.
Hay personas que nos hablan y ni las escuchamos...
hay personas que nos hieren y no dejan ni cicatriz...
pero hay personas que simplemente aparecen en nues-
tra vida y nos marcan para siempre.
Cec´ılia Meireles
Un marinero no es nadie sin la ayuda de aquellos que lo han acompa˜nado en el barco. Quiero
agradecer a esas personas con las que no s´olo compart´ı este viaje, sino colaboraron en la toma del
rumbo, me refiero a la tripulaci´on:
Mi familia y Dios
Por estar all´ı siempre apoyandome, toda la paciencia y esfuerzo que han realizado para ver cumplido
este sue˜no. Especialmente a mi se˜nora madre a quien no me alcanzar´a toda una vida, ni cada una
de las palabras del mundo para agradecerte por todo lo que ha hecho por m´ı. A mis hermanos Juan,
Isabel, Angelina y Julio que sin la ayuda ´esto no ser´ıa posible.
Dr Antonio
Gracias por ese apoyo incondicional no s´olo durante la realizaci´on del presente documento; sino
tambi´en en el transcurso de mi formaci´on profesional y personal dentro de ´esta instituci´on. Por la
paciencia y dedicaci´on para aclarar los temas oscuros. Por permitirme utilizar las computadoras
para la evaluaci´on de los resultados y la elaboraci´on de la presente tesis.
Los doctores Luis Isidro y Omar
Gracias m´as que ser mis maestros ser mis amigos. Sus valiosas aportaciones y observaciones a la
presente tesis. Agradezco todas sus ense˜nazas que no s´olo se limitaron a lecciones acad´emicas sino
tambi´en de vida. Me es imposible citar textualmente las frases que me dijeron; pero la esencia la
conservo.
Para llevar a puerto ´esta peque˜na embarcaci´on colaboraron muchas personas que por ahora me
es imposible nombrar a cada una de ellas; todos esos momentos que hicieron divertida la traves´ıa.
Como olvidar ´esta tan acertada frase de uno de ellos:
...la universidad es como una espada, cuanto m´as la afilemos y practique-
mos...estaremos mejor preparados para enfrentar, al coyote que est´a al
asecho en el camino de la vida...
Luis Isidro Aguirre Salas
´Indice general
´Indice de figuras XI
´Indice de tablas XIII
Resumen XV
1. Introducci´on 1
2. Marco Te´orico 7
2.1. M´etodos num´ericos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.2. Modelaci´on matem´atica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.3. Los n´umeros en la computadora . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.4. Tipos de error en m´etodos num´ericos . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.5. El lenguaje de programaci´on C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.6. Programaci´on en paralelo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.7. OpenMP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
2.8. Escalabilidad paralela . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
2.8.1. Ley de Amdahl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
2.8.2. Incremento de velocidad (speed-up) . . . . . . . . . . . . . . . . . . . . . . . 27
2.8.3. Desempe˜no computacional . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
3. Producto matriz-vector Ax 31
3.1. Concepto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
3.2. Loop unrolling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
3.3. C´alculo del residual . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
3.4. Codificaci´on . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
3.5. Incremento del desempe˜no . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
3.6. Procesamiento vectorial (SIMD) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
3.7. Codificaci´on en paralelo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
3.8. Evaluaci´on de algoritmos en paralelo . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
ix
x ´Indice general
4. M´etodo Iterativo de Jacobi 69
4.1. Concepto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
4.2. Codificaci´on del m´etodo de Jacobi en C . . . . . . . . . . . . . . . . . . . . . . . . . 81
4.2.1. Simplificando c´odigo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
4.2.2. Optimizaci´on de c´odigo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
4.3. M´etodo de Jacobi en paralelo con OpenMP . . . . . . . . . . . . . . . . . . . . . . . 87
4.4. Evaluaci´on de algoritmo en paralelo . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
5. M´etodo de Gauss-Seidel 93
5.1. Concepto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
5.2. Programaci´on en lenguaje C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
5.3. Codificaci´on en paralelo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
5.4. Gauss-Seidel versus Jacobi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
6. Conclusiones y trabajo a futuro 109
Bibliograf´ıa 113
´Indice de figuras
2.1. Distribuci´on de n´umeros enteros con formato predefinido. . . . . . . . . . . . . . . . 10
2.2. Distribuci´on de n´umeros reales con formato predefinido. . . . . . . . . . . . . . . . . 12
2.3. Modelo para representaci´on de n´umeros en punto flotante IEEE 754. . . . . . . . . . 13
2.4. C´alculo de epsil´on de la computadora. . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.5. Rango de n´umero IEEE-754 precisi´on simple. . . . . . . . . . . . . . . . . . . . . . . 15
2.6. Arquitectura de hardware CPU versus GPU. . . . . . . . . . . . . . . . . . . . . . . 21
2.7. Tipos de memoria en sistemas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
2.8. Modelo de OpenMP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
2.9. Modelo de ejecuci´on de programas paralelos. . . . . . . . . . . . . . . . . . . . . . . 26
2.10. Speed-up con Ley de Amdahl. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
3.1. C´alculo del residual en C. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
3.2. Implementaci´on can´onica de Ax. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
3.3. T´ecnica Loop Unrroll con factor 2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
3.4. T´ecnica Loop Unroll con factor 4. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
3.5. T´ecnica Loop Unroll con factor 2, dos ciclos for. . . . . . . . . . . . . . . . . . . . . 42
3.6. T´ecnica Loop Unroll con factor 2, dos variables. . . . . . . . . . . . . . . . . . . . . . 42
3.7. T´ecnica Loop Unroll con factor 2, dos ciclos for y dos variables. . . . . . . . . . . . . 43
3.8. T´ecnica Loop Unroll con factor 2, cuatros ciclos for cuatro variables. . . . . . . . . . 43
3.9. T´ecnica Loop Unroll con factor 5. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
3.10. T´ecnica Loop Unroll con factor 6. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
3.11. T´ecnica Loop Unroll con factor 8. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
3.12. T´ecnica Loop Unroll con factor 10. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
3.13. T´ecnica Loop Unroll con factor 12. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
3.14. Speed-up para la multiplicaci´on de dos vectores. . . . . . . . . . . . . . . . . . . . . 48
3.15. Funci´on general de la multiplicaci´on Ax con Unroll. . . . . . . . . . . . . . . . . . . 50
3.16. Speed-up de Ax utilizando la t´ecnica de Unroll. . . . . . . . . . . . . . . . . . . . . . 51
3.17. Rendimiento computacional de Ax al utilizar la t´ecnica de Unroll. . . . . . . . . . . 52
3.18. Modelo SIMD. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
3.19. Funci´on en MMX que multiplica dos vectores x y y. . . . . . . . . . . . . . . . . . . 55
3.20. Desempe˜no de Ax al utilizar MMX con bandera de compilaci´on -O2. . . . . . . . . . 59
3.21. Implementaci´on can´onica en paralelo de Ax. . . . . . . . . . . . . . . . . . . . . . . . 60
xi
xii ´Indice de figuras
3.22. Rendimiento de la versi´on can´onica de Ax en paralelo con bandera de compilaci´on -O2. 62
3.23. Implementaci´on general de Ax en paralelo. . . . . . . . . . . . . . . . . . . . . . . . 62
3.24. Desempe˜no de la versi´on can´onica de Ax con banderas de compilaci´on. . . . . . . . . 63
3.25. Escalabilidad paralela de Ax en su la versi´on Unroll-10 con bandera -O2. . . . . . . 64
3.26. Escalabilidad paralela de Ax en su la versi´on MMX con bandera -O2. . . . . . . . . 65
3.27. Comparativa del rendimiento computacional de las versiones can´onica, Unroll-10 y
MMX con bandera de compilaci´on -O2. . . . . . . . . . . . . . . . . . . . . . . . . . 66
4.1. Primera implementaci´on del m´etodo de Jacobi en lenguaje C. . . . . . . . . . . . . . 82
4.2. C´odigo en lenguaje C del esquema de Jacobi. . . . . . . . . . . . . . . . . . . . . . . 83
4.3. Porcentaje del tiempo de ejecuci´on del m´etodo de Jacobi con y sin sentencia if. . . . 84
4.4. C´odigo general de Jacobi optimizado. . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
4.5. Tiempos de ejecuci´on de Jacobi en serie, versiones [Can´onica, Unroll4, MMX] para
n = 5000. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
4.6. C´odigo de versi´on can´onica en paralelo de Jacobi. . . . . . . . . . . . . . . . . . . . . 88
4.7. Speed-up del m´etodo de Jacobi en paralelo en su versi´on can´onica. . . . . . . . . . . 89
4.8. Speed-up del m´etodo de Jacobi en paralelo en su versi´on MMX. . . . . . . . . . . . . 90
5.1. M´etodo de Gauss-Seidel en lenguaje C, versi´on can´onica. . . . . . . . . . . . . . . . . 97
5.2. M´etodo de Gauss-Seidel con OpenMP. . . . . . . . . . . . . . . . . . . . . . . . . . . 98
5.3. Descomposici´on del vector soluci´on x para dos procesadores. . . . . . . . . . . . . . . 99
5.4. Escalabilidad paralela del m´etodo Gauss-Seidel versi´on can´onica. . . . . . . . . . . . 101
5.5. M´etodo de Jacobi con diferencias finitas. . . . . . . . . . . . . . . . . . . . . . . . . . 104
5.6. M´etodo de Gauss-Seidel con diferencias finitas. . . . . . . . . . . . . . . . . . . . . . 104
5.7. Aproximaci´on num´erica a u(x, y) = sen x cos y con Gauss-Seidel. . . . . . . . . . . . . 106
´Indice de tablas
2.1. Unidades de medida de FLOPS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
3.1. Producto de dos vectores: resultados de prueba de exactitud, observamos las veces
que es m´as exacta, mostrada en porcentaje ( %), cada funci´on durante las iteraciones
para cada valor de n. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
3.2. Producto de dos vectores: resultados de prueba de velocidad, observamos la tasa de
exactitud de cada funci´on con respecto al n´umero de iteraciones (10,000). . . . . . . 45
3.3. Producto de dos vectores: comparaci´on de rendimiento de las funciones can´onica,
MMX y Unroll-4; observamos el rendimiento que nos brinda la funci´on en MMX
respecto a la forma tradicional y en comparaci´on con la funci´on con Unroll de 4. . . 58
4.1. M´etodo iterativo de Jacobi: primera evaluaci´on de rendimiento, observamos el por-
centaje de la reducci´on del tiempo en ejecuci´on cuando se remueve la condici´on (if). 85
5.1. M´etodo de Gauss-Seidel en paralelo; iteraciones para converger. . . . . . . . . . . . . 100
5.2. Convergencia de Gauss-Seidel vs Jacobi. . . . . . . . . . . . . . . . . . . . . . . . . . 105
xiii
Resumen
El presente trabajo de tesis aborda la creaci´on de algoritmos paralelos para la soluci´on num´eri-
ca de sistemas de ecuaciones lineales mediante esquemas iterativos de tipo Jacobi y Gauss-Seidel;
con especial ´enfasis en el rendimiento y la escalabilidad. Este documento se centra en dos aspec-
tos principales. En un primer momento, estudiamos la implementaci´on de t´ecnicas avanzadas de
programaci´on para maximizar el rendimiento en ejecuciones seriadas. Una de las t´ecnicas permite
utilizar m´odulos de procesamiento vectorial del procesador con la finalidad de realizar varias ope-
raciones a la vez; es decir, conseguir paralelismo a nivel de datos (conocido como SIMD). Tambi´en
se utilizan caracter´ısticas del compilador GCC para optimizar el c´odigo y catapultar el rendimiento
serial de estas primeras funciones. En un segundo momento, se realiza un estudio exhaustivo de
cada uno de los m´etodos que permitan escribir funciones que realmente puedan ser ejecutadas en
m´as de un n´ucleo utilizando el API llamada OpenMP apoyado con los resultados de las t´ecnicas
utilizadas (Bandera de compilaci´on, Loop unrolling, SIMD). En general con el estudio realizado
observamos una escalabilidad lineal de dos a cuatro procesadores. Por otro lado cuando empleamos
ocho procesadores se observa un aumento de 5.4x.
xv
Cap´ıtulo 1
Introducci´on
Una de las herramientas m´as valiosas para la resoluci´on de problemas pr´acticos de Ingenier´ıa son
las computadoras digitales mediante la utilizaci´on de m´etodos num´ericos. En un n´umero significativo
de esos problemas s´olo se puede obtener una soluci´on aproximada, a esto se debe la importancia del
estudio de la rama de las matem´aticas llamada an´alisis num´erico. Esta rama involucra el estudio
de m´etodos num´ericos. El desarrollo de ´estos esquemas es notablemente influenciado y determinado
por las computadoras, las cuales permiten realizar los c´alculos de manera veloz, confiable y sobre
todo flexible.
En la actualidad la computadora es una herramienta indispensable para las actividades coti-
dianas, escolares, de oficina y cient´ıficas. Con necesidades cada vez m´as complejas, es por ello que
se busca que las aplicaciones puedan realizar los c´alculos lo m´as r´apido posible aprovechando los
recursos del equipo con la mayor eficiencia posible.
En el pasado para cubrir con las necesidades del mercado se incrementaba la velocidad del
procesador, aumentando el n´umero de transistores al circuito integrado. Como lo previ´o Gordon
Moore, en la actualidad, ya no es posible disminuir el tama˜no de los transistores. Para compensarlo
se han construido procesadores que tienen m´as de un n´ucleo de procesamiento (2, 4, 8, 12). Las
computadoras de uso general que est´an en el mercado al momento de la realizaci´on del presente
trabajo cuentan con procesadores paralelos, es decir tienen m´as de un n´ucleo de procesamiento.
Esta cualidad indica que el c´omputo en paralelo est´a a disposici´on de todos.
Cuando la arquitectura del hardware de las computadoras pas´o a ser paralelo se cre´o la necesidad
de desarrollar aplicaciones que aprovechen ´estas caracter´ısticas. La incorporaci´on de n´ucleos de
1
2 Cap´ıtulo 1. Introducci´on
procesamiento tienen el fin de que las aplicaciones se ejecuten m´as r´apido. Para ejemplificar el
problema sup´ongase lo siguiente: se quiere extraer el agua de un tanque que tiene 1, 000 m3 para
ello se utiliza una bomba que extrae 250 m3 del l´ıquido por cada hora de trabajo. Esta m´aquina
terminar´a su tarea en 4 horas. Si en un momento se aumenta 7 bombas m´as para hacer un total
de 8, la tarea ser´a concluida en apenas 30 minutos, con ello se redujo el tiempo del proceso. Esto
refleja la importancia del c´omputo en paralelo. Con lo ya mencionado el c´omputo en paralelo es la
soluci´on a problemas contempor´aneos.
Cabe mencionar que en la actualidad la mayor´ıa de las aplicaciones son seriales, es decir se
ejecutan solo en uno de los n´ucleos; entonces estos programas no est´an aprovechando al m´aximo los
recursos con los que cuenta el equipo. Para contrarrestarlo se fomenta el deseo de escribir c´odigos
que puedan ejecutarse en paralelo.
Una pregunta que surge con lo mencionado; ¿En qu´e nos beneficia la programaci´on en paralelo?
La respuesta es por dem´as sencilla. En el mundo de la industria manufacturera se realizan procesos
de control de calidad, en los cuales se recurre a la simulaci´on de eventos mediante computadoras.
Estas medidas son cada d´ıa m´as frecuentes. Un ejemplo m´as que evidente ocurren en la industria
automotriz en la simulaci´on de sus prototipos frente a las colisiones. Hacer estas pruebas en f´ısico
representa un costo econ´omico muy representativo; es por ello que se recurre a la simulaci´on del
evento con resultados fidedignos. Para obtener estos resultados tan realistas se deben tomar en
cuenta muchas variantes que influyen en los resultados del proceso, todo esto aumenta la complejidad
de operaciones en modelo del suceso. El costo computacional de un modelo depende del grado
de complejidad operacional. Con ello es concluyente que estas simulaciones deben ser resueltas
con programaci´on en paralelo, para reducir los tiempos de simulaciones y as´ı reducir el ciclo de
lanzamiento de los nuevos modelos; lo cual es primordial para la generaci´on de utilidades de la
industria automotriz.
Motivaci´on
La principal motivaci´on del presente proyecto consiste en explotar al m´aximo lo recursos que
ofrecen las computadoras; mediante tecnolog´ıas para la programaci´on en paralelo.
En los labores de la ingenier´ıa y en la ciencia en general se formulan problemas mediante modelos
matem´aticos y son tratados num´ericamente, ello conduce frecuente a resolverlos por sistemas de
Cap´ıtulo 1. Introducci´on 3
ecuaciones lineales. Como es bien sabido esta tarea es muy demandante en tiempo de c´alculo. En
virtud de ello y con base a la tendencia del an´alisis num´erico es inherente que sean resueltos con
aplicaciones computacionales paralelas.
Para la resoluci´on de sistemas de ecuaciones lineales existen dos tipos de m´etodos; directos e
iterativos. Los m´etodos directos son utilizados para sistemas hasta de pocos miles de nodos debido
a su orden de complejidad; ocasionando que sea imposible el resolverlo por cuestiones de tiempo.
Por otra parte los m´etodos iterativos se utilizan para sistemas con una mayor cantidad de nodos en
virtud de su orden de complejidad que es menor a la de los directos. Dentro de los m´etodos iterativos
se encuentran el de Jacobi y Gauss-Seidel que son los dos pilares fundamentales. En la presente tesis
se estudia el dise˜no de dos algoritmos paralelos que implementen los esquemas de Jacobi y Gauss-
Seidel. En la literatura existen algoritmos iterativos paralelos reportados, sin embargo no existe
c´odigo fuente por ello en el presente documento se d´a ´enfasis al desarrollo de ´estos algoritmos desde
un punto de vista pr´actico con la finalidad de proporcionar ese c´odigo fuente.
En la literatura hemos encontrado distintos modelos matem´aticos y esquemas en paralelo con
OpenMP para la resoluci´on de sistemas lineales de ecuaciones [21, 26, 35, 36]. Sin embargo, se
enfocan principalmente a sistemas ralos o esparcidos y tipo QR o de Cholesky. Esto se debe princi-
palmente a que las discretizaci´on de ecuaciones diferenciales parciales (EDP) esta basada principal-
mente en los m´etodos de elemento finito, volumen finito y diferencia finita los cuales generan este
tipo de matrices.
En el desarrollo profesional de m´etodos num´ericos se busca la innovaci´on para poner a disposici´on
el nuevo software. Existen una gran variedad de librer´ıas p´ublicas para la optimizaci´on de c´odigo,
ejemplos son BLAS (Basic Linear Algebra Subprograms) y LAPACK (Linear Algebra Package)
que permiten la optimizaci´on para programas secuenciales. Dentro de las arquitectura multicore
encontramos en el top las librer´ıas espec´ıficas Intel R Math Kernel Library, CUBLAS y CULA de
CUDA R ; est´an altamente optimizadas para sus respectivas arquitecturas de hardware. En general,
el uso de estos paquetes de optimizaci´on no son utilizadas en el desarrollo del software comercial,
excepto para la construcci´on de programas muy especializados o en proyectos que se encargan de
aglomerar todas estas optimizaciones como por ejemplo PLASMA (Parallel Linear Algebra Software
for Multiprocessor Architectures).
Proyectos como FLAME (Formal Linear Algebra Methods Environment) y PLASMA reflejan
4 Cap´ıtulo 1. Introducci´on
una fuerte tendencia de encapsular y abstraer el c´odigo lo que facilita el trabajo del programador. En
el caso de FLAME se abstrae el hardware dando mayor portabilidad a estas aplicaciones; haciendo
transparente el hardware, lo que permite ejecutar una implementaci´on en cualquier arquitectura.
Adem´as permite utilizar todos los recursos disponibles CPU y GPU.
Al abstraer el c´odigo se aumenta la dificultad para la optimizaci´on m´as espec´ıfica de las apli-
caciones. Adem´as la falta de c´odigo fuente que pueda ser analizado y/o modificado; limita la parte
acad´emica. Estas librer´ıas se asemejan a las “cajas negras” porque no sabemos que hay dentro y
por tanto no aprendemos de ellas.
Lo anterior dicho, motiva que el presente trabajo se dirija al estudio e implementaci´on de los
dos pilares de los m´etodos iterativos, con herramientas p´ublicas; con fines acad´emicos. Esto se debe
a que el estudio de los m´etodos iterativos de Jacobi y Gauss-Seidel tiene fines did´acticos y conforma
la base de estudio para las t´ecnicas modernas de m´etodos num´ericos. En la actualidad el software
especializado y la investigaci´on de frontera emplean m´etodos proyectados sobre subespacios de tipo
Krylov[1, 2, 16, 22, 38], ejemplos de software especializado son las librer´ıas de Portable Extensible
Toolkit for Scientific computation (PETSc) con implementaciones paralelas [4, 34, 42]. El estudio
de ello est´a fuera del alcance de la presente memoria.
Objetivo general
La presente tesis tiene como objetivo el desarrollo de esquemas iterativos en paralelo con
OpenMP para la soluci´on num´erica de sistemas de ecuaciones lineales. Para ello emplearemos una
computadora con arquitectura de tipo multi-n´ucleo con memoria compartida y utilizamos el lenguaje
de programaci´on C.
Objetivos particulares
A continuaci´on se listan los objetivos espec´ıficos que ser´an tratados durante la realizaci´on del
presente documento:
1. Dise˜nar e implementar el m´etodo de Jacobi y Gauss-Seidel en paralelo para resolver sistemas
de ecuaciones lineales.
2. Incrementar el rendimiento computacional mediante t´ecnicas avanzadas de programaci´on.
Cap´ıtulo 1. Introducci´on 5
3. Medir el desempe˜no de los algoritmos dise˜nados para cuantificar los beneficios del paradigma
de programaci´on.
4. Medir la escalabilidad de los algoritmos dise˜nados en computadoras multi-n´ucleo.
5. Crear un biblioteca de funciones que permitan resolver num´ericamente sistemas de ecuaciones
lineales en paralelo para computadoras SMP.
Al t´ermino de la presente tesis se habr´an cumplido con los objetivos planteados; los cuales
pondr´an en evidencia los beneficios mediante el incremento del rendimiento por paralelizar m´etodos
num´ericos. Con los resultados obtenidos se busca motivar la incipiente tendencia de generalizar la
programaci´on en paralelo.
La estructura del presente trabajo de tesis est´a organizada en seis cap´ıtulos que se describen a
continuaci´on.
En el primer cap´ıtulo, el presente, se describen los objetivos que permitir´an llevar a buen t´ermino
el proceso de elaboraci´on de la presente memoria. Tambi´en se mencionan las razones que dan
importancia a este estudio.
Enseguida, en el tema 2 se plantea un marco te´orico que le permita al lector familiarizarse
desde un punto de vista general, con los conceptos que se tratan durante el restos de los cap´ıtulos.
Aunado a ello se realiza una breve descripci´on de las t´ecnicas y herramientas tecnol´ogicas que ser´an
utilizadas. Se indican temas de vital importancia para la evaluaci´on de algoritmos en paralelo como
lo son Speed-up, Ley de Amdahl y Escalabilidad paralela, as´ı como la representaci´on de los n´umeros
reales en la computadora. Tambi´en se da un breve introducci´on que intuye a la comprensi´on del
error en los m´etodos num´ericos.
En el cap´ıtulo 3 tratamos uno de los problemas m´as b´asico pero de importancia muy relevante,
el Producto matriz-vector. Se pone un especial cuidado en el estudio de ´este tema por representar
un proceso muy demandante de tiempo de c´alculo. Se emplean modernas t´ecnicas de programaci´on
como Loop unrolling y procesamiento vectorial con Intel MMX R para explotar nuevas caracter´ısti-
cas de los microprocesadores; para determinar cual representa la mejor opci´on en paralelo. Cabe
se˜nalar que en este bloque se estudia el C´alculo del residual una t´ecnica utilizada como condici´on
de paro en los esquemas iterativos.
Posteriormente en el cap´ıtulo 4 se estudia el M´etodo iterativo de Jacobi, en primer lugar se tratan
algunos de los m´etodos directos para la solucion de sistemas lineales de ecuaciones m´as conocidos,
6 Cap´ıtulo 1. Introducci´on
Regla de Krammer, Eliminaci´on de Gauss-Jordan y la Factorizaci´on LU para determinar los pros
y contras de ambas categor´ıas (m´etodos directos e iterativos). Despu´es se realiza una descripci´on
del esquema y consecuentemente la programaci´on. Con el ´unico fin de aumentar el rendimiento se
realiza una serie de optimizaciones basadas en los resultados del tema anterior. Al final de este
cap´ıtulo se realiza una evaluaci´on exhaustiva que arroja resultados muy concretos con respecto a
las modificaciones realizadas en cada uno de los subtemas.
En el cap´ıtulo 5 tratamos el M´etodo Iterativo de Gauss-Seidel (G-S), en primer lugar se da una
descripci´on del m´etodo con vistas hacia la programaci´on del mismo. En segundo lugar se implementa
OpenMP prestando especial antenci´on en la dependencia de operaciones a las que esta sujeto G-S.
En un tercer momento se realiza una comparaci´on con diferencias finitas para medir convergencia
de Jacobi y G-S, lo cual permita enmarcar las diferencias te´oricas de ambos.
Finalmente en el cap´ıtulo 6 mostramos las conclusiones generales y el trabajo a futuro.
Cap´ıtulo 2
Marco Te´orico
2.1. M´etodos num´ericos
En palabras de Chaillou [9] son las t´ecnicas mediante las cuales es posible formular problemas
de manera que puedan resolverse utilizando operaciones aritm´eticas.
Es importante el estudio de los m´etodos o esquemas num´ericos porque representan una herra-
mienta importante para el an´alisis y dise˜no de algoritmos que permiten la resoluci´on de problemas
de la ciencia. Existe una extensa gama de esquemas num´ericos para la resoluci´on de gran parte de
los problemas. Sin embargo, con el mismo m´etodo no se puede resolver todos problemas; por ello es
indispensable el an´alisis de un grupo de candidatos con el fin de determinar cual de ellos es el m´as
indicado para el problema que se est´e estudiando.
Como menciona Penad´es [33] con la aparici´on de los multiprocesadores se presenta un nuevo reto,
adecuar los antiguos algoritmos para las nuevas tecnolog´ıas; entre las que destaca la computaci´on
matricial. Pero esta nueva tendencia tambi´en sugiere y motiva la b´usqueda de m´etodos nuevos que
se adecuen mejor a la vanguardia tecnol´ogica con el fin de aumentar el rendimiento computacional
para la resoluci´on de ciertos problemas.
2.2. Modelaci´on matem´atica
Una definici´on muy simple es la proporcionada por Chaillou en [9] la cual dice: un modelo
matem´atico es una formulaci´on o ecuaci´on que expresa las caracter´ısticas fundamentales de un
7
8 Cap´ıtulo 2. Marco Te´orico
sistema o proceso f´ısico en t´erminos mat´ematicos. Esto nos indica que un modelo corresponde a
una explicaci´on de un proceso de un forma simple, lo cual conduce a resultados predecibles.
Los modelos matem´aticos sirven para obtener cierta informaci´on de un problema que se est´e estu-
diando; si bien en cierto que frecuentemente contienen errores que ponen en evidencia componentes
esenciales de una realidad compleja [9]. Existe un clasificaci´on de tipos de modelos matem´aticos en
funci´on a su ´area de estudio; estos temas no son tratados con la profundidad necesaria debido que
no es la finalidad del presente trabajo.
2.3. Los n´umeros en la computadora
En el mundo real existen varios sistemas num´ericos entre los que destacan los sistemas ar´abico,
binario, octal, hexadecimal. El m´as utilizado por todo ser humano es el ar´abico o mejor conocido
como decimal. Por otro lado el sistema num´erico de las computadoras es el binario para describir los
estados encendido (1) apagado (0); as´ı un d´ıgito binario o bit es la unidad de informaci´on m´as b´asica
en la computadora. Debido a que los humanos utilizamos el sistema decimal y las computadoras
el binario se hizo necesario realizar conversiones de n´umeros entre ellos. Fue Gottfried Leibniz
(1646–1716) quien desde siglos pasados lo hab´ıa resuelto. Leibniz argument´o que cualquier n´umero
entero puede ser representado por una serie de unos y ceros.
En documentos como [29, 37] se emplea el formato mantisa/exponente para representar n´umeros
binarios tomando la idea de la notaci´on cient´ıfica. Como se muestra en (2.1)
1010 = 10.010 × 100 = 1.010 × 101 = 0.110 × 102
10102 = 1010.02 × 20 = 101.02 × 21 = 10.102 × 22
(2.1)
El manejo de los n´umeros en la computadora es mediante la notaci´on cient´ıfica del sistema
binario.1 Sin embargo, los formatos que se utilizan permiten representar los n´umeros como en (2.1)
sin escribir de forma expl´ıcita el punto decimal. El formato signo/mantisa/exponente se expresa
1
El sistema num´erico de la computadora se debe a la arquitectura de la misma. Recordando que existen compu-
tadoras binarias, octales y hexadecimales. Las computadoras comerciales son binarias.
2.3. Los n´umeros en la computadora 9
como una palabra con las siguientes caracter´ısticas para un valor x
x =
signo
s e1e2e3 . . . ek
exponente
mantisa
m1m2m3m4 . . . mn (2.2)
Sabiendo que cuando el bit de s est´e encendido se trata de un n´umero negativo. Tomando como
referencia (2.2) la longitud de la palabra que equivale a (1 + k + n) donde los valores de k y n
son definidos por el dise˜nador y 1 representa el bit s del signo; para definir los valores de k y n
es imprescindible pensar en la exactitud con lo que se representar´an los n´umero reales, as´ı como
analizar el costo computacional que representa. Para ejemplificar tomaremos un formato de 8 bits
como sigue
x =
signo
b1 b2 b3 b4
exponente
mantisa
b5 b6 b7 b8 (2.3)
Partiendo de (2.3) representemos 1010 = 10102 con cuatro bits. Con el formato en cuesti´on
puede ser representado como sigue
x =
sig
0 0 0 1
exp
man
1 0 1 0 = 10102 × 21
= 1010
Ahora tomando un valor mayor por ejemplo 6410 = 10000002, lo cual en notaci´on cient´ıfica se
expresa como 1000 × 23 y se representa como sigue
x =
sig
0 0 1 1
exp
man
1 0 0 0 = 10002 × 23
= 6410
Para representar un n´umero negativo por ejemplo −1810 se realiza lo siguiente
x =
sig
1 0 1 0
exp
man
1 0 0 1 = −1 × 10012 × 22
= −1810
Como se puede observar el valor m´as grande y el menor que se pueden representar son
xmax = 0 111 1111 = 1 × 11112 × 27 = 192010
xmin = 1 111 1111 = −1 × 11112 × 27 = −192010
10 Cap´ıtulo 2. Marco Te´orico
Para exponer el formato de (2.3) ante una situaci´on cotidiana en el c´alculo intensivo tomemos
el n´umero 2710 = 110112 como sabemos tenemos s´olo cuatro bits de mantisa y este nuevo n´umero
tiene 5 bits, lo cual tomamos los 4 bits m´as significativos y tenemos lo siguiente
x =
1
0 0 1 0
2
13
1 1 0 1 = 1 × 11012 × 22
= 2610
Ello no es equivalente con el n´umero que se trata de representar y el siguiente ser´ıa
x =
1
0 0 1 0
2
14
1 1 1 0 = 1 × 11102 × 22
= 2810
Con ello es m´as que evidente que no se puede representar el n´umero 27 utilizando el formato de
(2.3). Pero ´esto no significa que sea el ´unico. En la figura 2.1 se ilustra los n´umeros que se pueden
representar con ´este formato. Las l´ıneas verticales (|) indican la posici´on en la linea recta de cada
uno de los n´umeros, por lo que no existen n´umeros en los espacios entre las l´ıneas. Como se puede
observan la mayor densidad de n´umeros est´a en los aleda˜nos de cero y conforme nos alejamos la
densidad disminuye.
−2000 −1500 −1000 −500 0 500 1000 1500 2000
Figura 2.1: Distribuci´on de n´umeros enteros con formato predefinido.
Bien, con el formato de (2.3) se han representado n´umeros enteros pero con un aspecto impor-
tante, existen n´umeros que pueden ser representados de m´as de una forma lo cual no es bueno.2
Con lo anterior se han representado n´umeros enteros de una forma no ortodoxa pero nos brinda
un primer acercamiento para representar n´umeros reales. Tomando la idea del formato (2.3) y con
base a Hidalgo [19, Ap´endice E] se realiza una modificaci´on simple que se expresa en (2.4)
x =
signo
b1 b2 b3 b4
exponente
bimp b5 b6 b7 b8
mantisa
(2.4)
donde la mantisa trata la parte fraccionaria del n´umero [ver (2.1)] y bimp es un bit impl´ıcito que
2
Nota: con este formato se han representado n´umeros enteros ´unica y exclusivamente para exponer el formato
mantiza/exponente y no representa el verdadero formato para la representaci´on de enteros en la computadora.
2.3. Los n´umeros en la computadora 11
act´ua as´ı
si 0 < exp < 7, entonces bimp = 1.
si exp = 0 y mantisa = 0, entonces bimp = 0.
Tambi´en se establece la necesidad de representar los exponentes con signo por ello se indica lo
siguiente
si 0 < exp < 7, entonces exp = exp - 3.
si exp = 0 y mantisa = 0, entonces exp = -2.
Con base a ello se establece que para un valor x se obtiene como sigue
x = (−1)s · 2exp−3 · 1.mantisa para 0 < exp < 7 y
x = (−1)s · 2−2 · 0.mantisa para exp = 0
donde exp es el valor del exponente, s el signo y [(0 : 1).mantisa] es el bit impl´ıcito (bimp) y el valor
de las mantisa (b5b6b7b8).
La idea anterior hace que el n´umero 010110012 con el formato (2.4) se convierte en decimal de
la siguiente forma
x =
s=0
0
signo
exp=5
1 0 1
exponente
bimp.mantisa=1.5625
bimp 1 0 0 1
mantisa
= (−1)0
· 25−3
· 1.5625 = 6.2510
Ahora se convierten x1 = 111010102 y x2 = 000001102 a decimal como sigue
x1 = 11101010 = (−1)1 · 26−3 · 1.625 = −1310
x2 = 00000110 = (−1)0 · 2−2 · 0.375 = 0.0937510
Como se puede observar el cambiar el formato de representaci´on de los n´umeros hace que los
valores al convertirlos a decimal sea distinto. En la figura 2.2 se ilustra la distribuci´on de los n´umeros
representables con ´este formato, donde se puede observar que la densidad de la ret´ıcula cercas del
cero es muy alta. Conforme nos alejamos de cero la cantidad de n´umeros representables disminuye.
12 Cap´ıtulo 2. Marco Te´orico
−16−15.0 −10 −5 0 5 10 15 16
Figura 2.2: Distribuci´on de n´umeros reales con formato predefinido.
Con los dos ejemplos planteados se tiene una idea m´as concreta de la representaci´on de los
n´umeros mediante una serie de bits. En ambos casos se utiliz´o 8 bits como longitud de palabra. Sin
embargo el resultado es distinto pero con similitudes. La mayor densidad de n´umeros representables
est´an cercas del cero y en los extremos existe una menor densidad. En el primer ejemplo se repre-
sentaron n´umeros enteros con un rango (-1920,1920) mientras que en el segundo se representaron
n´umeros reales en un rango de (-15.5,15.5). Es evidente la imposibilidad de representar la totalidad
de los n´umeros con una longitud de palabra finita.
La representaci´on de los num´eros reales (n´umeros con fracci´on de entero) en la computadora
fue en su momento un tema herm´etico en cada una de las empresas manufactureras de las mismas.
El hermetismo era a tal grado que las empresas ten´ıan su propio protocolo, lo que limitaba la por-
tabilidad. Como menciona Severance et al.[37] esos formatos para representar n´umeros en punto
flotante se enfocaron primordialmente en la exactitud y no tanto en un balance entre exactitud y
velocidad. Con base a Null et al.[29] la soluci´on para ello lleg´o en 1985 por parte del Instituto de
Ingenieros El´ectricos y Electr´onicos (IEEE por sus singl´as en ingl´es) que produjeron un est´andar
para representar n´umero en punto flotante para simple y doble precisi´on, el est´andar se titul´o “IEEE
754-1985 Standard for Binary Floating-Point Arithmetic”. El nuevo est´andar tuvo sus inicios du-
rante el dise˜no del coprocesador para punto flotante Intel i8087 [37]. Pasaron m´as de 10 a˜nos para
que los grandes fabricantes adoptaran el IEEE 754 de forma generalizada en la contrucci´on de
computadoras.
En la figura 2.3 se ilustra como se representan dos tipos de n´umeros definidos en el est´andar de
IEEE. Como se puede observa el formato es signo/exponente/mantisa al igual que en el segundo
ejemplo. (A) es un formato que en el lenguaje de programaci´on C se le conoce como float donde
se tienen 23 bits de mantisa y 8 de exponente. (B) corresponde la primitiva double en el lenguaje
de programaci´on C que corresponde a 52 bits de mantisa y 11 bits; es m´as com´unmente conocido
como doble precisi´on cient´ıfica.
Seg´un Severance et al.[37] en precisi´on simple el menor n´umero normalizado es 1.2E-38 y
2.3. Los n´umeros en la computadora 13
Figura 2.3: Modelo para representaci´on de n´umeros en punto flotante IEEE 754.
2.2E-308 con doble precisi´on. Mientras que el n´umero m´as grande para simple y doble es 3.4 E+38
y 1.8 E+308 respectivamente. Ello nos brinda un marco de trabajo m´as amplio y con errores m´as
peque˜nos.
Con base en Null y Severace [29, 37] ´este est´andar incorpora NaNs (Not a Number, no es
n´umero) cuando el exponente sea igual a 255 y la mantisa no sea cero (exp = 255 y mantisa = 0),
los NaNs son utilizados como indicadores de error. Tambi´en incluye dos infinitos (−∞ y +∞) que
se presentan cuando el exponente es 255 y la mantisa es 0, positivo cuando el signo es 0 y negativo
cuando es 1. Al igual que en el caso de infinito, se tienen dos ceros uno positivo y otro negativo.
En el presente documento se utilizan n´umero de precisi´on simple como el formato (A) de la figura
2.3 mientras no se indique lo contrario. Como se ha especificado ese formato tiene una longitud de
32 bits para la representaci´on de los n´umeros por lo cual se pueden representar la siguiente cantidad
de n´umeros (n)
n = 232
= 4 294 967 296
De acuerdo con la definiciones anteriores para el caso donde el exponente es igual a 255 todos
los n´umeros son considerados NaNs, excepto cuando la mantisa es 0; este caso se presenta dos veces
para −∞ y +∞ respectivamente. Con base a ello podemos obtener la cantidad de NaNs que se
representan
NaNs = 2 × 223
− 2 = 16 777 214
Para obtener el total de n´umero representables con precisi´on simple sustraemos lo NaNs del
14 Cap´ıtulo 2. Marco Te´orico
total n
Total de reales representables = 4 294 967 296 − 16 777 214 = 4 278 190 082
De antemano sabemos que existe una diferencia entre el cero y el primer n´umero que puede ser
representado, haciendo el n´umero m´as peque˜no posible tendremos el menor n´umero distinto de cero
que puede ser representable como sigue
x =
signo
0
exponente
000 0000 0
mantisa
000 0000 0000 0000 0000 00012 = (−1)0 × 2−126 × 2−23 = 2−149
x 1.4 × 10−45
Como menciona Nakamura [28] al n´umero representable inmediatamente despu´es de la unidad se
le conoce como el epsil´on de la computadora el cual nos permite calcular el n´umero real representable
inmediatamente posterior; ´esto se obtiene al multiplicar el epsil´on por el real y sumarlo a ese real.
Para calcular el epsil´on se puede utilizar el fragmento de c´odigo de la figura 2.4. En ese c´odigo s´olo
hace falta indicar el tipo de variable que es “epsilon” (simple o doble). El ´ultimo valor impreso
corresponde al epsilon de la computadora. Para una ejecuci´on con precisi´on simple (float) se tiene
epsil´on 1.1921 × 10−7, en el otro caso (double) epsilon 2.2204 × 10−16. Cabe se˜nalar que el
denominador para calcular el epsil´on es dos porque la computadora empleada es binaria.
C´alculo del epsil´on
epsilon = 1;
while(1+epsilon>1)
{
printf("%fn",epsilon);
epsilon = epsilon/2;
}
Figura 2.4: C´alculo de epsil´on de la computadora.
Para corroborar que efectivamente el epsil´on de la computadora sirve para calcular la distancia
entre un n´umero real representable y su inmediatamente consecuente tomaremos el siguiente ejemplo
x1 =
signo
0
exponente
000 0000 1
mantisa
100 0000 0000 0000 0000 00002 = (−1)0 × 21−127 × 1.5
x1 = (−1)0 × 2−126 × 1.5 1.7632415262 × 10−38
2.3. Los n´umeros en la computadora 15
Ahora multiplicamos x1 por el epsil´on para obtener la diferencia (y) tomando m´as cifras signi-
ficativas para disminuir el error
x1 1.7632415262 × 10−38 y epsion = 1.1921 × 10−7
y = x1 × epsilon
y 1.7632415262 × 10−38 × 1.1921 × 10−7
y 2.1019602234 × 10−45
xα
2 = x1 + y = 1.7632415262 × 10−38 + 2.1019602234 × 10−45
xα
2 = 1.7632417364 × 10−38
Posteriormente se calcula el valor para x2 tomando el siguiente n´umero de la serie como sigue
x2 =
signo
0
exponente
000 0000 1
mantisa
100 0000 0000 0000 0000 00012 = (−1)0 × 21−127 × 1.5 + 2−23
x2 1.7632416664 × 10−38
Con estos resultados podemos decir que xα
2 = x2, donde el error se debe en gran medida a la
cantidad de cifras significativas tomadas en cuenta. Con base a los temas anteriores es concluyente
que la distancia entre un n´umero representable y su inmediatamente posterior crece conforme se
aleje de cero.
Figura 2.5: Rango de n´umero IEEE-754 precisi´on simple.
En la figura 2.5 se muestra el rango en el cual podemos representar n´umeros con el est´andar
IEEE-754. Siempre pensando que la mayor densidad de n´umeros est´an aleda˜nos al cero. Visualizar
el rango nos permite mapear los n´umeros para no caer en valores underflow u overflow e inclusive
elegir el tipo de precisi´on con la finalidad de tener una mayor exactitud.
La incapacidad para poder representar la totalidad de los n´umeros conlleva a tener resultados
16 Cap´ıtulo 2. Marco Te´orico
num´ericos aproximados. Ella es como una enfermedad con la que se nace; sino es tratada puede ser
letal.
2.4. Tipos de error en m´etodos num´ericos
En an´alisis num´erico un tema de vital importancia es el estudio del error en un resultado
num´erico. Esto se debe principalmente a que los datos de entrada no son exactos; tambi´en influye que
los m´etodos num´ericos introducen errores de varios tipos; por ello los resultados son aproximados.
Como menciona Chaillou [9] en muchos casos profesionales los errores son costosos y en algunos
letales. A continuaci´on se presentan los principales errores introducidos por los esquemas num´ericos.
Error de redondeo: este tipo de error se presenta debido a la cantidad de cifras significativas
que se asignan para las operaciones. En t´erminos de computaci´on este error es muy com´un y
depende de la exactitud de la primitiva utilizada (precisi´on simple, doble precisi´on, etc.), para
la representaci´on de los n´umeros reales en la m´aquina. Para tener una idea m´as clara tomemos
en cuenta un n´umero real x con k cifras en punto flotante, lo cual se representa como
x = 0.d1d2 . . . dk × Bn
donde B es la base del sistema
dado que ´unicamente se tienen t cifras significativas, siendo t < k, el n´umero real ser´a repre-
sentado como sigue
˜x = 0.d1d2 . . . dt × Bn
con ello se han perdido k − t cifras del valor real de x con lo cual ˜x es una aproximaci´on de
x. A continuaci´on se muestra un ejemplo
x = 1.2345678 con t = 4 se tiene ˜x = 1.2345
Este error es inherente a la computaci´on como consecuencia de la imposibilidad de representar
totalmente los n´umeros reales. Para disminuir este error se aumenta el tama˜no de la mantisa
de bits (aumentar k), as´ı se tendr´an m´as cifras para la representaci´on de los n´umeros; pero
ello repercutir´a en un aumento en el costo de c´alculo.
Error por truncamiento: este tipo de error aparece como consecuencia de las reglas de cifras
2.4. Tipos de error en m´etodos num´ericos 17
significativas que se establezcan, donde a partir de t cifras el valor se redondea al extremo
pr´oximo. Por ejemplo tomando tres cifras significativas (en punto flotante) de x para obtener
˜x como sigue
x1 = 23.333333 se redondea a ˜x1 = 23.333
x2 = 23.333690 se redondea a ˜x2 = 23.334
En problemas aplicados a m´etodos num´ericos el error de truncamiento surge al “truncar” una
serie de operaciones. Citando textualmente a Nakamura [28] el error de truncamiento se debe
a las aproximaciones utilizadas en la f´ormula matem´atica del modelo. Un claro ejemplo de ello
es la Serie de Taylor para mostrarlo veamos la expresi´on de esta serie
f(x + h) = f(x) + hf (x) +
h2
2!
f (x) +
h3
3!
f (x) + · · · +
hm
m!
f(m)
(x) + · · · (2.5)
En la pr´actica se trunca (2.5) debido a que es imposible utilizar un n´umero infinito de t´erminos.
A continuaci´on se representa una serie truncada de Taylor hasta despu´es del t´ermino de orden
m
f(x + h) = f(x) + hf (x) +
h2
2!
f (x) +
h3
3!
f (x) + · · · +
hm
m!
f(m)
(x) + O(hm+1
) (2.6)
donde O(hm+1) representa el error por el truncamiento.
La Serie de Taylor representa un punto de partida para la obtenci´on de m´etodos num´ericos.
En el polinomio de Taylor (2.6) el error de truncamiento se reducir´a conforme m → ∞.
Como menciona Nakamura [28] calcular el valor exacto del error de un polinomio de Taylor es
pr´acticamente imposible es por ello que se representa con una aproximaci´on que corresponde
O(hm+1). En general el error de truncamiento nace al representar una serie infinita con otra
serie finita de operaciones.
Error absoluto: este error corresponde a la diferencia absoluta entre un resultado exacto y
otro aproximado. Esto se representa como
EA = |x − ˜x| (2.7)
18 Cap´ıtulo 2. Marco Te´orico
donde x es el resultado exacto y ˜x es el aproximado.
Error relativo: consiste en normalizar el error respecto al resultado exacto. Lo cual se expresa
como
ER =
|x − ˜x|
|x|
(2.8)
donde x es el resultado exacto y ˜x es el aproximado. Si multiplicamos el error relativo por
cien se obtiene el error porcentual del resultado aproximado.
2.5. El lenguaje de programaci´on C
El lenguaje C es de alto nivel pero mantiene caracter´ısticas de bajo nivel. De alto nivel porque
es estructurado, f´acil de aprender pero m´as que nada racional[15]. Y de bajo nivel porque permite
trabajar con el lenguaje m´aquinas los bits, registros de la CPU y registros de memoria. Algunas de
las caracter´ısticas son la siguientes tomadas del libro de Basurto et al.[6]:
Potencia y flexibilidad: C es un lenguaje no tan alejado del lenguaje m´aquina lo cual
puede traducirse en un mejor desempe˜no computacional. Otro punto a favor del lenguaje es
la flexibilidad para la creaci´on de aplicaciones que van desde modestas aplicaciones de consola
a robustos sistemas operativos gr´aficos como UNIX y sus derivados.
Popularidad: como la mayor´ıa de los grandes proyectos, el lenguaje C debe su popularidad
a la variedad de recursos como compiladores, herramientas y librer´ıas.
Portabilidad: gracias al est´andar ANSI C un programa escrito en C puede ser compilado y
ejecutado en diferentes arquitecturas con pocos o nulos cambios.
Sencillez: el lenguaje C es muy f´acil de aprender por contar con un n´umero muy reducido de
palabras reservadas.
Estructura y modularidad: C es el primer lenguaje de programaci´on bien estructurado
que permite la agrupaci´on de c´odigo en funciones; que posteriormente puede ser reutilizado.
El conjunto de cualidades anteriormente descritas coadyuvan para que este lenguaje cuente
con el soporte de varias interfaces que permitan la programaci´on en paralelo y juntos sean una
herramienta importante para el c´omputo cient´ıfico.
2.6. Programaci´on en paralelo 19
En el presente documento se utiliza lenguaje C en su totalidad. Esto se debe a las caracter´ısticas
que son sencillez y racional para la creaci´on de c´odigo; as´ı como la flexibilidad en el manejo de
vectores y matrices mediante los apuntadores. La compatibilidad de C con la API OpenMP es el
motivo principal por el cual se utiliza este lenguaje de programaci´on. Cabe se˜nalar que FORTRAN
es otro lenguaje compatible con ´esta API; no se utiliz´o en este trabajo porque se ten´ıa un mejor
dominio del lenguaje C.
2.6. Programaci´on en paralelo
Como menciona Pacheco [31] de 1986 a 2002 el incremento del rendimiento en los micropro-
cesadores fu´e de 50 % por a˜no; el aumento de la velocidad de los procesadores estuvo sujeta a la
densidad de transistores del circuito integrado, cada a˜no se aumentaba en ese mismo porcentaje.
Como menciona Petersen et al.[34] esto se debe a una ley formulada por Gordon Moore (uno de
los fundadores de Intel) en 1965 conocida como ley de Moore: el incremento de la velocidad de los
procesadores deber´a ser duplicada cada dos a˜nos. Por problemas de dise˜no ya es imposible continuar
con esa tendencia, por lo cual en el lapso de 2002 a 2005 el aumento de la velocidad se redujo a
20 % anual.
Para 2005 la industria de microprocesadores acord´o incrementar el rendimiento con un cambio
en el dise˜no; se eligi´o el camino del paralelismo. Esto consiste en dejar de construir procesadores
monol´ıticos m´as r´apidos; para centrarse en la construcci´on de circuitos integrados que contengan
varios procesadores completos. Con base a Petersen et al.[34] actualmente las computadoras con
multiprocesadores y el desarrollo de algoritmos suman un mayor aumento en el rendimiento que el
establecido en la ley de Moore; esto habla del poder que le dota al c´omputo ´esta tendencia. Con las
medidas tomadas por los industriales se puede cumplir con las nuevas demandas de rendimiento en
las diferentes ´areas que lo requieran.
Las nuevas tendencias en la contrucci´on de hardware paralelo representa un nuevo reto para
los programadores, la realizaci´on de software capaz de explotar las nuevas caracter´ısticas de ´estos
recursos electr´onicos. En la actualidad la mayor´ıa del software en el mercado es serial; ello indica
que esas aplicaciones ´unicamente explotan una fracci´on de los recursos de la computadora.
Durante la realizaci´on de este trabajo se ha observado una fuerte tendencia en la programaci´on
de aplicaciones paralelas, ´estos programas son divididos en m´ultiples instancias tantas como n´ucleos
20 Cap´ıtulo 2. Marco Te´orico
contenga el sistema. Ello con la finalidad de presentar resultados en el menor tiempo posible.
Durante la traducci´on de aplicaciones seriales a paralelas nos encontramos con problemas de
adaptaci´on de algoritmos y/o modelos; como menciona Pacheco [31] un algoritmo serial eficiente
puede convertirse en uno paralelo ineficiente. Por ello la tarea de los programadores para traducir
programas secuenciales en paralelos es dif´ıcil.
La programaci´on en paralelo est´a influenciada directamente por la tendencia del desarrollo de
hardware denotada por la construcci´on de sistemas f´ısicos. Para la programaci´on en el lenguaje
estructurado C existen tres alternativas principales; Message-Passing Interface (MPI, Interfaz de
Paso de Mensajes), POSIX threads (Pthreads) y OpenMP. El primero de ellos esta orientado a
la programaci´on paralela para memoria distribuida. Los otros dos son utilizados en sistemas con
memoria compartida, como diferencia Pthreads al igual que MPI son librer´ıas y definiciones que
se usan dentro de programas mientras que OpenMP est´a constituido por una librer´ıa y algunas
modificaciones al compilador. Como menciona Petersen et al.[34] OpenMP es m´as f´acil de programar
e implementar que Pthreads.
En tiempo m´as reciente ha surgido un tipo de c´omputo distinto que consiste en utilizar la
tarjeta gr´afica (GPU) para resolver operaciones aritm´eticas. Un ejemplo de ello es la interfaz de
programaci´on CUDA propiedad de la empresa Nvidia, ´esto revoluciona la fabricaci´on de hardware
en la cual se incluyen miles de procesadores. Cada uno de ellos tiene mucho menores prestaciones
de procesamiento que un CPU; sin embargo, juntos le permiten al GPU desarrollar un incremento
sustancial de rendimiento comparable e inclusive mejor que la CPU. Al igual que las tres tecnolog´ıas
antes mencionadas CUDA trabaja con memoria compartida y distribuida. Una de sus opciones
programables es mediante el lenguaje C++. Con base al manual de Nvidia CUDA [30] el modelo de
programaci´on de CUDA est´a enfocado al paralelismo masivo, el dise˜no del hardware permite lanzar
miles de hilos de ejecuci´on a la vez. En la figura 2.6 extra´ıda de [30, fig.1-3 p´ag.3] se ilustra las
diferencias en la construcci´on de los dispositivos. En el caso de la CPU se cuenta con pocas unidades
de procesamiento pero con mayores capacidades y requiere mucho control y mucha memoria cach´e.
Por otra parte en la GPU se tiene una mayor cantidad de unidades de procesamiento con poco
control y poco cach´e; ´esto es lo que permite la ejecuci´on de miles de hilos a la vez. La principal
desventaja de CUDA es el marco de ejecuci´on que s´olo se limita a dispositivos compatibles de la
marca Nvidia, lo cual limita la popularidad en el uso de ´esta API. Cabe se˜nalar que un proyecto
2.7. OpenMP 21
encabezado por la marca norteamericana Apple llamado OpenCL permite la portabilidad de c´odigo
que utilice la GPU; mediante la compilaci´on en tiempo de ejecuci´on.
Figura 2.6: Arquitectura de hardware CPU versus GPU.
En la figura 2.7 se ilustran las arquitecturas de memoria compartida y distribuida respectiva-
mente; en (A) todos los cores-n´ucleos del sistema acceden a una misma memoria principal, con
ello todas las unidades de procesamiento pueden acceder a localidades de memoria donde otra uni-
dad esta trabajando. Cabe se˜nalar que la memoria principal es de tipo UMA (Memoria de Acceso
Uniforme) que permite una comunicaci´on intensiva entre los procesos que son ejecutados en los
diferentes n´ucleos. En (B) se muestra un sistema con memoria distribuida, los cuales est´an carac-
terizados porque cada una de las unidades-nodos de procesamiento tienen su propia memoria tipo
UMA, pero tambi´en pueden acceder a la memoria de cualquier otro nodo. Es preciso indicar que
es muy costo acceder a la memoria de un nodo desde otro en t´erminos de tiempo. A ´esto se debe
la barrera t´ecnida para no crear secciones de aplicaci´on que mantenga una comunicaci´on intensa
siempre y cuando las secciones sean ejecutadas en nodos diferentes. En ´este tipo de aplicaciones es
muy importante el papel que jugar´a el sistema de interconexi´on de nodos puesto que es un enorme
cuello de botella para el acceso a la memoria distribuida, generalmente se utiliza la fibra ´optica.
Hasta este punto se han mencionado algunas de las principales tendencias y caracter´ısticas de la
programaci´on en paralelo. Adem´as se indican los motivos por los cuales este paradigma representa
el futuro de la computaci´on de alto desempe˜no.
2.7. OpenMP
Como menciona Chapman et al. [11], OpenMP es una Interfaz de Programaci´on de Aplicaciones
(API) cuyas caracter´ısticas, se basan en esfuerzos anteriores para facilitar la programaci´on paralela
22 Cap´ıtulo 2. Marco Te´orico
Figura 2.7: Tipos de memoria en sistemas.
de memoria compartida. Las siglas MP denotan “multiprocessing” (multiproceso) lo cual es un
sin´onimo de programaci´on paralela de memoria compartida.
OpenMP es un acuerdo alcanzado entre los miembros de la Architecture Review Board (ARB)
para dar un enfoque port´atil, f´acil de usar y eficaz a la programaci´on paralela de memoria compar-
tida. Al contrario de lo que se puedr´ıa pensar OpenMP no es un lenguaje de programaci´on nuevo;
por el contrario es la notaci´on que se puede agregar a un programa secuencial en Fortran, C o C++,
a las cuales se le denomina directivas o pragmas que son instrucciones pre-procesador.
Una implementaci´on adecuada de OpenMP en un programa permitir´a a las aplicaciones benefi-
ciarse de la memoria compartida de las arquitecturas paralelas. En ocasiones con pocas modificacio-
nes al c´odigo se convierte una aplicaci´on serial en una paralela; en la pr´actica muchas aplicaciones
tiene un cierto grado de paralelismo que debe ser explotado. Como menciona Chandra et al.[10],
todos los proveedores de computadoras de memoria compartida de alto desempe˜no soportan la fun-
cionalidad de OpenMP, pero la portabilidad de aplicaciones ha sido casi imposible de alcanzar.
Desde un punto de vista general, una aplicaci´on serial se convierte en paralelo simplemente
incluyendo una directiva de OpenMP. Estas directivas van desde constructores de hilos hasta la
sincronizaci´on de los mismos para el acceso a los datos compartidos. Pero un punto muy importante
es que en la directiva se indica el tipo de reparto de las cargas de trabajo.
OpenMP utiliza el modelo fork-join, el cual consiste en que la ejecuci´on de un programa inicia
con un hilo llamado maestro. Cuando el proceso llega a una directiva se crea una regi´on paralela con
las especificaciones de la misma. La zona paralela se ejecuta sobre un mismo espacio de direcciones
lo cual permite compartir las variables declaradas, pero tambi´en declarar informaci´on privada [10,
2.7. OpenMP 23
Figura 2.8: Modelo de OpenMP.
11, 31, 34]. Al finalizar la fracci´on paralela los hilos esclavos se destruyen y continua la ejecuci´on
del hilo maestro.
En la figura 2.8 se ilustra la ejecuci´on de un programa con una regi´on paralela. Cuando el hilo
maestro llega al inicio (etapa fork) de ´esta zona se crean los hilos esclavos y se declaran la variables
locales de la zona. Posteriormente se realiza el reparto de cargas de trabajo, para que todos los
subprocesos ejecuten el mismo c´odigo. Despu´es de finalizar la ejecuci´on se destruyen las variables
locales de la regi´on paralela y todos los hilos acepto el maestro; es la etapa join. Al finalizar la regi´on
paralela, el proceso continua una ejecuci´on serial; si m´as adelante existiese otra regi´on paralela el
proceso se repite con las condiciones de la nueva directiva.
Soporte de compiladores
La norma industrial OpenMP es soportando por una gran variedad de compiladores; la mayor´ıa
de ellos con fines comerciales. Algunos ejemplos de ellos son: el compilador Oracle C/C++/Fortran
de Sun Microsystems Inc, el gigante de los procesadores Intel ofrece su compilador para Windows y
Linux con el nombre de Intel C/C++/Fortran, por su parte Microsoft’ brinda el soporte en Visual
C++ en su versi´on comercial entre otros.3 Tambi´en existe el compilador GNU GCC que brinda
soporte para el API de forma gratuita el cual es propiedad de la comunidad de c´odigo abierto de
GNU Project. Por tratarse de un est´andar nos garantiza que el c´odigo no debe ser re-escrito cuando
cambiemos el compilador.
El compilador GCC implementa OpenMP en la version 4.2.1 o posteriores. En su versi´on 4.3.2
3
La lista completa de compiladores que soporta OpenMP puede ser consultada en el sitio oficial
http://www.openmp.org.
24 Cap´ıtulo 2. Marco Te´orico
(Agosto de 2008) comenz´o a implementar OpenMP v3.0.4. Las nuevas versiones de GCC las encon-
tramos pre-cargadas en la mayor´ıa de las distribuciones Linux (recientes) por ello se convierte en el
m´as accesible. Por estas cuestiones los resultados que se muestren en la presente tesis corresponde
a c´odigo compilado con GCC v4.2.1.
Como se menciona en el manual oficial de GNU GCC v4.2.4 [40] el compilador lleva este nombre
por “GNU Compiler Collection” donde se engloba la posibilidad de compilar c´odigo en lenguajes
C, C++, Objective-C, Objective-C++, Java, Fortran y Ada. GCC cuenta con un gran n´umero
de optimizaci´on para aumentar el rendimiento de las aplicaciones conocidas como banderas de
compilaci´on, las especificaciones t´ecnicas de estas banderas no son tratadas en el presente trabajo.
Para la evaluaci´on de algoritmos paralelos se utilizan varios par´ametros entre los cuales destacan
el La ley de Amdahl, speed-up y el rendimiento computacional. En los temas siguientes se dar´a una
breve explicaci´on para llenar el contexto.
2.8. Escalabilidad paralela
La Escalabilidad paralela (Parallel Scalability) es el comportamiento de una aplicaci´on cuando
un creciente n´umero de hilos (threads o subprocesos) se utilizan para resolver un problema de tama˜no
constante. Idealmente, aumentar el n´umero de hilos de 1 a P dar´a un aceleramiento paralelo (speed-
up) de p [11]. Como menciona Pacheco [31] se dice que un programa es escalable si al aumentar el
n´umero de hilos la eficiencia persiste. Para definir este punto, en primer lugar se toma la ecuaci´on
de la eficiencia E
E =
T1
p · Tp
=
S
p
(2.9)
donde T1 es el tiempo de ejecuci´on con un n´ucleo, p es el n´umero de procesadores, Tp representa
el tiempo de ejecuci´on para p-hilos y S es el speed-up (2.13). En base a lo anterior supongamos que
aumentamos k veces el n´umero de procesadores con lo cual se tiene
Ekp =
T1
kp · Tkp
=
Skp
kp
(2.10)
Con base a (2.9) y (2.10) podemos determinar si un programa es escalable si E = Ekp. Tomando
como idea principal que un programa no puede ser paralizado de forma completa. Idealmente,
4
Esta informaci´on con base la documentaci´on del sitio web oficial http://gcc.gnu.org/gcc-4.3/
2.8. Escalabilidad paralela 25
pensamos que la reducci´on en tiempo de ejecuci´on es proporcional al aumento de hilos-procesadores,
en la pr´actica no es com´un que se presente la proporcionalidad, el principal obst´aculo es el acceso a
memoria ya que ´esta se encuentra compartida para todos los hilos, y por ende, se da una competencia
para el uso de la misma. Aunado a ello estas lo costos derivados por la sincronizaci´on y en general por
el manejo de las regiones paralelas. Existen ocasiones donde aumentar el n´umero de hilos se torna
contraproducente, se dice que la aplicaci´on tiene un l´ımite de hilos, y a partir de aqu´ı, aumentar´a el
tiempo de ejecuci´on conforme aumentemos la cantidad de hilos.
Para la evaluaci´on de la escalabilidad de la aplicaci´on se utilizan dos m´etodos: el primero Ley
de Amdahl el cual no pone en un contexto real de la escalabilidad te´orica que se puede obtener.
En segundo tenemos el speed-up el cual mide las veces que es m´as r´apido un algoritmo paralelo con
respecto al serial. Mientras tanto el desempe˜no computacional mide la cantidad de operaciones por
segundo de un programa. En los siguientes temas se desarrolla cada uno de ellos.
2.8.1. Ley de Amdahl
Como menciona Pacheco [31] fue desarrollada por Gene Amdahl en la d´ecada de 1960. ´Esta ley
indica que un programa serial s´olo se puede paralelizar una fracci´on; ello limitar´a muy significati-
vamente el speed-up; independientemente del n´umero de unidades de procesamiento.
La ley plantea la carencia de poder paralelizar un algoritmo serial de forma completa. S´olo
podemos hacer paralelo una fracci´on del c´odigo. Mientras m´as grande sea la fracci´on paralela, el
speed-up ser´a mayor para un n´umero creciente de procesadores; sin embargo, no siempre ser´a posi-
tivo aumentar la cantidad de hilos.
En la figura 2.9 se ilustra la ejecuci´on de un fragmento de programa con una secci´on en paralelo.
En ella se describe lo siguiente: en un principio el hilo maestro inicia la ejecuci´on y crea la regi´on
paralela. En la regi´on paralela los hilos esclavos ejecutan el proceso, al finalizar se destruyen los
hilos. Finalmente el hilo maestro continua con la ejecuci´on.
La ley de Amdahl nos permite calcular el speed-up m´aximo Sp como
Sp =
1
(1 − F) + F
p
(2.11)
donde F es la fracci´on de tiempo secuencial y p el n´umero de procesadores, entonces (1 − F)
representa la fracci´on serial del programa.
26 Cap´ıtulo 2. Marco Te´orico
Figura 2.9: Modelo de ejecuci´on de programas paralelos.
Tomando un programa que se ejecuta como el de la figura 2.9 donde la regi´on paralela es
F = 80 % del total de c´alculo. Con base a (2.11) se calcula el speed-up m´aximo (Sp) para 2
procesadores (n = 2) como sigue
Sp =
1
(1 − 0.8) + 0.8
2
=
1
0.2 + 0.4
= 1.66x
Ahora supongamos que otro c´odigo es altamente paralelizable F = 95 %, a continuaci´on se
calcula el nuevo Sp para ´este nuevo c´odigo
Sp =
1
(1 − 0.95) + 0.95
2
=
1
0.05 + 0.475
= 1.90x
Si calculamos el speed-up m´aximo para 4, 5, 8, 16, 32 procesadores para los dos ejemplos
anteriores se obtiene la gr´afica de la figura 2.10.
En la figura 2.10 se ilustra el speed-up de dos programas con 95 % y 80 % de paralelismo y son
comparados con el speed-up ideal. Para un n´umero reducido de procesadores ambos est´an cercanos
al te´orico; pero conforme el n´umero de procesadores aumentan el speed-up de los dos programas
empeora muy dr´asticamente. El speed-up que se puede esperar de un programa 95 % paralelo para
2.8. Escalabilidad paralela 27
5 10 15 20 25 30
5
10
15
20
25
30
Numero de procesadores
speed−up
Ideal
95%
80%
Figura 2.10: Speed-up con Ley de Amdahl.
m´as de 16 procesadores es muy pobre. Para otro 80 % paralelo pr´acticamente su l´ımite son 16
procesadores.
Con el paso del tiempo la Ley de Amdahl se volvi´o obsoleta y fue Gustafson quien la revalid´o a
finales de la d´ecada de 1980[20]. La versi´on moderna de la ecuaci´on de ´esta ley en (2.12)
Smax =
1
(1 − F) + F
S
(2.12)
donde lo ´unico que cambia es S que representa un speed-up. Cabe se˜nalar que conforme S se
aproxime a infinito (S → ∞) se redondea el denominador de (2.12) quedando 1/(1 − F).
2.8.2. Incremento de velocidad (speed-up)
El incremento de velocidad (speed-up), es la proporci´on del tiempo de reloj para la ejecuci´on
del programa en un hilo y el tiempo de reloj para la ejecuci´on del mismo programa en varios hilos.
Te´oricamente, debe ejecutar un programa en P-hilos, P veces tan r´apido como se ejecute en un
hilo[11]. En la literatura existente cuando se refiere a ´este tema se utiliza el t´ermino speed-up, ´este
documento no ser´a la excepci´on.
28 Cap´ıtulo 2. Marco Te´orico
Con base a lo ya mencionado se define a speed-up como sigue
S =
T1
Tp
(2.13)
donde S representa el speed-up, T1 el tiempo de ejecuci´on para un procesador y Tp el tiempo que
tarda la misma aplicaci´on en P-procesadores. La medida del speed-up es adimensional. Por ejemplo,
si una fracci´on de c´odigo seriado (T1) dura 10 segundos, despu´es cuando ese c´odigo se ejecuta en
forma paralela con dos procesadores (T2) dura 5.5 segundos. El speed-up que se tiene es el siguiente
S =
10
5.5
= 1.8x
Ahora si aumentamos el n´umero de procesadores a cuatro y tiene un tiempo de ejecuci´on (T4)
de 3 segundos, el speed-up entonces ser´a
S =
10
3
= 3.3x
Con los ejemplos anteriores se representa el proceso para determinar la aceleraci´on de ejecuciones
paralelas. En ninguno de los casos anteriores se llega al speed-up te´orico 2 y 4 respectivamente. En
temas siguientes se indica el motivo por el cual no se llega a ello.
Cuando se programa en paralelo siempre se busca alcanzar la proporcionalidad entre el aumento
de la velocidad respecto al n´umero de hilos, no siempre se alcanza dicha meta debido a los proble-
mas de acceso a memoria, los cuales depende del dise˜no de cada computadora. Es por ello que es
conveniente cuidar la implementaci´on del c´odigo a fin de obtener una mayor velocidad cuando se
cambie el n´umero de hilos.
2.8.3. Desempe˜no computacional
El desempe˜no o rendimiento computacional (en la literatura tambi´en se le conoce como perfor-
mance) se mide por las operaciones en punto flotante por segundo. Como menciona Null et al.[29]
la m´etrica para el rendimiento es el FLOPS (floating-point operations per second, operaciones en
punto flotante por segundo). Para calcular el desempe˜no se divide el n´umero de operaciones n entre
2.8. Escalabilidad paralela 29
el tiempo empleado t.
FLOPS =
n
t
(2.14)
Con las nuevas prestaciones que ofrecen las computadoras la cantidad de FLOPS es algo dif´ıcil
de manejar. Por ello se utilizan unidades de medida de FLOPS que se indican en la tabla 2.1.
Tabla 2.1: Unidades de medida de FLOPS
Nombre de la unidad Valor
KiloFlop 103
MegaFlop 106
GigaFlop 109
TeraFlop 1012
PetaFlop 1015
ExaFlop 1018
ZetaFlop 1021
YottaFlop 1024
Para obtener directamente una de las unidades de la tabla 2.1 de (2.14) basta con hacer lo
siguiente
K FLOPS =
n
t × 10e
(2.15)
donde e corresponde al exponente de la unidad, por ejemplo e = 9 si calculamos GigaFlops. Ello se
muestra a continuaci´on
GigaFlops =
n
t × 109
FLOPS es una unidad generalizada para mostrar resultados de rendimiento. En la presente
tesis se muestran todos los resultados de rendimiento utilizando ´esta unidad de medida. Para los
fines de la presente tesis ´unicamente se utilizan para evaluar los algoritmos paralelos el desempe˜no
computacional y el speed-up.
Con los temas que se han tratado durante el presente cap´ıtulo se establece un fundamento
te´orico lo cual se puede resumir. Los m´etodos num´ericos estas influenciados por las computadoras,
lo cual requiere de an´alisis y modelaci´on matem´atica que permitan adaptar el esquema al tipo de
problema en cuesti´on. Las nuevas generaciones de computadoras multin´ucleo permiten la ejecuci´on
de aplicaciones paralelas; ello conlleva que se dise˜nen nuevos algoritmos que puedan explotar ´estas
nuevas caracter´ıticas. ´Estos nuevos algoritmos deben ser eficientes para ellos son evaluados a fin de
30 Cap´ıtulo 2. Marco Te´orico
determinar su desempe˜no computacional as´ı como su speed-up. A diferencia de los n´umero reales
idealmente conocidos, en las computadoras la cantidad de n´umeros es limitada y su distribuci´on
en la l´ınea recta no es uniforme. Debido al m´etodo num´erico elegido y a la representaci´on de los
n´umeros en la computadora nace el error num´erico en los problemas de an´alisis num´erico, adem´as
de las propias contemplaciones hacia el resultado por parte quien implementa el m´etodo.
Cap´ıtulo 3
Producto matriz-vector Ax
La multiplicaci´on de una matriz y un vector, es una operaci´on simple que resuelve un problema
b´asico, pero importante [11]. La cual se presenta de forma frecuente en esquemas iterativos como lo
son el m´etodo de Jacobi y el de Gauss-Seidel, por mencionar algunos. Estos m´etodos son tratados
en cap´ıtulos siguientes.
Durante este cap´ıtulo se describen formas distintas para resolver A·x utilizando la computadora;
se˜nalando los pro y contras de cada una de ellas. Para ello se exhibe el rendimiento en speed-up y
Mflops1 con el fin de mostrar num´ericamente cual de ellos es el mejor procedimiento para codificarla.
En la primera secci´on se definen conceptos b´asicos para comprender el problema. C´omo se realiza
el producto entre una matriz y un vector, cuales son la normas que deben cumplirse para que se
pueda realizar.
En el segundo apartado se da una breve introducci´on a un t´ecnica de optimizaci´on de ciclos
conocida como Loop unrolling, la cual es utilizada para optimizar el producto de una matriz por
un vector.
Se estudia el c´alculo del residual en la secci´on tres, lo cual resulta ser un tema interesante, es
utilizado como condici´on de paro en m´etodos iterativos. El residual es la diferencia que existe entre
la soluci´on exacta y una aproximada.
La implementaci´on can´onica se realiza en la cuarta parte del cap´ıtulo.
En las secciones cinco y seis se realizan distintos procedimientos de optimizaci´on, para mejorar
1
flops (floating-point operations per second, operaciones en punto flotante por segundo) es una unidad de medida
para el desempe˜no de una aplicaci´on. Mflops denota que es un mill´on de flops (106
).
31
32 Cap´ıtulo 3. Producto matriz-vector Ax
el desempe˜no de la aplicaci´on. En primer lugar, es utilizada la t´ecnica de Loop unrolling para
optimizar el bucle. En segunda instancia, se optimiza a nivel de datos con la Tecnolog´ıa SIMD de
Intel R
. Al final de esta quinta secci´on se combinan ambas (Loop unrolling y SIMD) para exponer
el resultado que se presenta al combinarlas.
En la actualidad la gran mayor´ıa de las computadoras disponibles en el mercado, tienen m´as de
un procesador. En c´omputo es importante explotar todos los recursos de manera eficiente. Lo que
nos lleva a realizar aplicaciones que aprovechen el multin´ucleo, es decir, puedan ser ejecutadas en
varios procesadores de forma simult´anea, esta tarea se lleva a cabo en el s´eptimo apartado.
Por ´ultimo se muestran los resultados obtenidos tras las optimizaciones realizadas. Ello con la
finalidad de establecer la mejor opci´on para implementarla en los m´etodos iterativos de los cap´ıtulos
siguientes.
3.1. Concepto
El producto de una matriz y un vector es un operaci´on simple que resuelve un problema b´asico
pero importante [11]. En esta secci´on se presenta la multiplicaci´on de una matriz por un vector
desde un punto de vista matem´atico.
Antes de adentrarse es preciso definir lo que son las matrices y los vectores. Un vector no es
m´as que un conjunto ordenado de n´umeros uniformemente espaciados, en el ´area de inform´atica se
le conoce como arreglo unidimensional. Existen vectores de tipo columna y rengl´on dependiendo de
la orientaci´on del mismo. A continuaci´on se representa un vector de orden n.
X = [x1, x2, . . . , xn]T
(3.1)
En la ecuaci´on (3.1) se describe un vector rengl´on, tomando ese ejemplo para convertirlo a uno
de tipo columna s´olo resolvemos la transpuesta del mismo. A continuaci´on se ilustra lo mencionado.
X =








x1
x2
...
xn








(3.2)
3.1. Concepto 33
Una matriz es un arreglo rectangular de n´umeros con m filas y n columnas, o dicho de otra forma
una matriz es un arreglo bidimensional [28]. A continuaci´on se muestra la representaci´on general de
cualquier matriz.
A =








a1,1 a1,2 · · · a1,n
a2,1 a2,2 · · · a2,n
...
...
...
...
am,1 am,2 · · · am,n








(3.3)
En (3.3) se describe la forma general para representar una matriz de m-renglones y n-columnas,
decimos que es una matriz de m × n. En ´este documento ´unicamente se abordar´an matrices cuyo
n´umero de renglones es equivalente al de columnas. A este tipo de arreglo bidimensional se le conoce
como matriz cuadrada, a consecuencia cuando se mencione una matriz se supondr´a que es cuadrada;
mientras no se indique lo contrario.
Para llevar a cabo la multiplicaci´on de una matriz por un vector se requiere cumplir con dos
condiciones. La primera es que el vector tenga la forma de (3.2), es decir, sea un vector de tipo
columna o vertical. Tomando a (3.3) y (3.2), el orden del vector (n´umero de renglones) debe ser
exactamente igual al n´umero de columnas de la matriz; ´esta es la segunda condici´on. Por ende no
puede realizarse la siguiente operaci´on.
c = xA (3.4)
Cuando se cumplen las condiciones se puede realizar la operaci´on. Como resultado de multiplicar
la matriz A por el vector x se obtiene el vector c. La operaci´on se describe a continuaci´on,
Ax = c (3.5)
Si se desglosa (3.5), encontramos el siguiente procedimiento con base en (3.2) y (3.3). Donde se
expone que cada rengl´on de la matriz se multiplica por el vector.








a1,1 a1,2 · · · a1,n
a2,1 a2,2 · · · a2,n
...
...
...
...
am,1 am,2 · · · am,n
















x1
x2
...
xn








=








a1,1x1 + a1,2x2 + · · · + a1,nxn
a2,1x2 + a1,2x2 + · · · + a2,nxn
...
am,1xn + am,2x2 + · · · + am,nxn








(3.6)
34 Cap´ıtulo 3. Producto matriz-vector Ax
A continuaci´on se muestra una forma compacta de (3.6). En este documento ser´a utilizada ´esta
f´ormula (3.7) cuando se haga referencia a la ecuaci´on de la mutiplicaci´on de una matriz por un
vector, mientras la matriz no sea rectangular.
ci =
n
j=1
aijxj i = 1, 2, . . . , n (3.7)
Como se observa en (3.6) y (3.7) resolver la operaci´on en cuesti´on resulta trivial. Sin embargo,
el proceso es demandante en tiempo de calculo. La demanda de c´alculo aumenta conforme la matriz
A se vuelve m´as densa, es decir, el orden de la misma crece. Con base a (3.7) se realiza el algoritmo
que corresponde con el tema tratado lo cual permitir´a crear la funci´on para la misma ecuaci´on.
Algoritmo 3.1 Multiplicaci´on matriz-vector
Est´a definido por los siguientes seis pasos:
1. Hacer i = 0
2. Si (i < m)
Verdadero: hacer ci = 0,j = 0, posteriormente pasar al paso 3.
Falso: ir al paso 6
3. Hacer ci = ci + Aij · xj
4. Hacer j = j + 1
5. Si (j < n)
Verdadero: regresar al paso 3.
Falso: hacer i = i + 1, posteriormente regresar al paso 2.
6. Parar.
En esta secci´on se definieron las bases para resolver la operaci´on c = Ax. Lo cual es indispensable
para escribir funciones en c´odigo C que resuelvan la operaci´on en cuesti´on. Esta actividad se llevar´a a
cabo en secciones posteriores de este cap´ıtulo.
3.2. Loop unrolling
En esta secci´on se define una t´ecnica de optimizaci´on de ciclos principalmente de tipo for. La
t´ecnica llamada Loop Unroll o Loop unrolling (desdoble de ciclo). Esta t´ecnica sirve para optimizar
3.2. Loop unrolling 35
el c´odigo de programas para reducir el tiempo de ejecuci´on de la aplicaci´on, los cual incrementa el
desempe˜no computacional de la misma.
Como menciona Page [32] esta t´ecnica tiene como objetivo eliminar la sobrecarga asociada con
la operaci´on de un ciclo determinado. Cuando el n´umero de iteraciones es conocido se pueden listar
todos lo valores posibles para la variable de inducci´on2. Para ejemplificar, se tiene el siguiente ciclo:
for(i = 0; i < n; i++)
c[i] += a[i] * b[i];
Para ejemplificar tomemos n = 4 lo cual permite desdoblar el ciclo de forma completa quedando
como sigue
c[0] = a[0] × b[0]
c[1] = a[1] × b[1]
c[2] = a[2] × b[2]
c[3] = a[3] × b[3]
En este caso en particular la variable de inducci´on esta definida en el rango 0 ≤ i < n, al escribir
un c´odigo con las nuevas modificaciones se obtiene una aplicaci´on que realiza la misma tarea que
el ciclo original (para este caso en particular), pero ahora no hay gastos asociados al ciclo. En
consecuencia el rendimiento aumenta.
Cuando el valor de n es peque˜no el ciclo puede ser desdoblado en su totalidad. Sin embargo,
conforme n crece llevar a cabo un desdoble completo del bucle; ser´a una tarea pr´acticamente impo-
sible de realizar. Aunado a ello, el c´odigo resultante es tosco. Una forma ingeniosa para resolverlo
es hacer un desdoble por bloques, cada uno tan grande como se desee. Esto con el fin de reducir
el n´umero de iteraciones adem´as de exponer las operaciones que se pueden realizar en paralelo. A
continuaci´on se desarrolla un c´odigo general aplicable a cualquier Unroll.
r = n % k;
for(i = 0; i < n-r; i+=k)
c[i] += x[i]*y[i] + x[i+1]*y[i+1] + ... + x[i+k-1]*y[i+k-1];
for(i = n-r; i < n; i++)
c[i] += x[i]*y[i];
En el c´odigo anterior k representa el factor de unroll que se aplica; n el orden de los vectores y
r es el residual por si n no es divisible por k.
2
La variable de inducci´on es aquella que controla el funcionamiento del ciclo, en la mayor´ıa de los casos se representa
con i.
36 Cap´ıtulo 3. Producto matriz-vector Ax
Como menciona Page [32] al desarrollar un desdoble parcial queda claro que el n´umero de
operaciones dentro del cuerpo del ciclo se puede llevar a cabo de forma paralela.
La t´ecnica de Loop Unroll permite reducir la carga en el ciclo utilizando la l´ınea de cach´e del
procesador utilizando los valores que recientemente han sido cargados a la memoria caliente3. Ello
hace que sea muy utilizada gracias a la fidelidad que presenta en una implementaci´on. A´un cuando
la implementaci´on es por dem´as sencilla, la elecci´on de una regla para que esta t´ecnica funcione
siempre no es una tarea sencilla. Este problema esta ligado directamente a las caracter´ısticas del
procesador, los procesadores no-m´oviles ejecutan mejor las sobre-cargas en los ciclos que los que no
lo son.
3.3. C´alculo del residual
En esta secci´on se aborda el tema del c´alculo del residual, como un m´etodo para medir la
convergencia de los esquemas iterativos que se estudian en cap´ıtulos posteriores. Este procedimiento
mide el error entre la k-´esima iteraci´on con respecto a la soluci´on exacta del sistema lineal de
ecuaciones. Uno de los principales usos del c´alculo del residual es durante la medici´on de error en
los m´etodos iterativos de proyecci´on sobre subespacios de tipo Krylov[24]. Se realizar´a una funci´on
que realice este procedimiento, la cual ser´a utilizada en los siguientes cap´ıtulos.
El c´alculo del residual (r) se obtiene de sustraer el producto de A y x∗ a b como se muestra a
continuaci´on
r = b − Ax∗
(3.8)
donde, x∗ = una aproximaci´on a la soluci´on exacta de x, b, r, x∗ ∈ RN y, A ∈ RN×N
Para ello los vectores (b, r, x∗) tienen la forma del vector z la cual se expresa a continuaci´on,
z = (z1, z2, . . . , zn)T
Si x∗ = x ⇒ r = ¯0 Ahora si x ≈ x∗ ⇒ r = 0
Tomando en cuenta que la soluci´on exacta x es la suma de la aproximaci´on m´as el error (x =
x∗ + e), con lo que deducimos que
x = x∗
− e
3
La memoria caliente corresponde a un tipo de almacenamiento conocido como NUMA(Non-uniform memory
access, memor´ıa de acceso no uniforme) o memoria caliente es como se le conoce a la memoria cach´e del procesador
debido a que es una memoria de gran velocidad.
3.3. C´alculo del residual 37
Al sustituir x∗ en (3.8) tenemos
r = b − A(x∗
− e)
con ello se intuye que el residual es equivalente al error entre la soluci´on exacta y una aproximada
r ≈ e
Observe que el residual r es un vector de orden n, es decir, r ∈ Rn de la forma
r = (r1, r2, r3, . . . , rn)T
A continuaci´on el c´alculo del residual se traduce a c´odigo C, en la figura (3.1) se ilustra esta
tarea ya realizada.
Implementaci´on C´alculo del Residual
double calcularResidual(float **A, float *dx, float *b, int n)
{
double *residual,normResidual;
int i,j;
double rowDot;
residual = make_dvector(n);
for(i = 0; i < n; i++)
{
rowDot = 0.0;
for(j = 0; j < n; j++)
rowDot += A[i][j] * dx[j];
residual[i] = b[i] - rowDot;
}
normResidual = normInf(residual,n);
free_svector(residual);
return normResidual;
}
Figura 3.1: C´alculo del residual en C.
En la funci´on descrita con anterioridad, se utilizan tres m´etodos que se explican a continua-
ci´on. Cuando se llama a la funci´on make dvector(n) se reserva la memoria para un vector, en este
caso residual. La segunda funci´on normInf(residual,n) calcula la norma infinita de un vector con
38 Cap´ıtulo 3. Producto matriz-vector Ax
orden n. En el ´ultimo caso free dvector(residual) se libera la memoria previamente reservada con
make dvector(n).
En temas posteriores, cuando se indique el c´alculo del residual (dentro de l´ıneas de c´odigo), se
har´a aluci´on a esta funci´on cuando no se indique lo contrario.
El residual es un m´etodo que mide la diferencia entre una soluci´on exacta y una aproximada.
Se utiliza para determinar la convergencia en esquemas iterativos como son los m´etodos de Jacobi
y Gauss-Seidel. Para reducir el error derivado de la gran cantidad de operaciones en los m´etodos
directos se utilizan t´ecnicas iterativas de correcci´on del error del residual.
La funci´on que fue implementada puede ser optimizada con temas tratados en secciones poste-
riores de este cap´ıtulo, a fin de incrementar el desempe˜no computacional de la misma. Cabe se˜nalar
que esta funci´on no ser´a optimizada llegando a esos temas porque no es la finalidad del presente
documento.
3.4. Codificaci´on
En esta secci´on se realiza una primera implementaci´on en c´odigo C, para la ecuaci´on que corres-
ponde a la multiplicaci´on de una matriz por un vector, es decir, la ecuaci´on (3.7). En esta primera
funci´on secuencial no se utiliz´o ninguna de la optimizaciones. En temas posteriores se realizar´an
mejoras que impacten positivamente en el rendimiento.
Como se ha mencionado con anterioridad, el producto de una matriz por un vector es una
operaci´on muy sencilla. Traducirla a un lenguaje para computadora es tambi´en una tarea muy
simple. La fracci´on de c´odigo de la figura 3.2 es un primer resultado tras realizar la tarea en
cuesti´on.
Implementaci´on Can´onica de Ax
for(i = 0; i < n; i++)
{
c[i] = 0.0;
for(j = 0; j < n; j++)
c[i] = A[i][j] * x[j];
}
Figura 3.2: Implementaci´on can´onica de Ax.
3.5. Incremento del desempe˜no 39
Como puede observarse el c´odigo de la figura 3.2 est´a dise˜nado para matrices cuadradas. El
c´odigo es por dem´as sencillo y no existe nada extra˜no. Es preciso definir que en temas siguientes
cuando se mencione una implementaci´on can´onica del producto de una matriz po un vector, nos
referiremos a ´esta fracci´on de programa alojado dentro de una funci´on. En pocas palabras, ´esta
primera implementaci´on corresponde a una versi´on compacta de una funci´on can´onica que resuelve
la multiplicaci´on de una matriz por un vector.
La implementaci´on can´onica permite tener un primer acercamiento en la realizaci´on de una
aplicaci´on; la cual pueda ser ejecutada en forma paralela.
En esta secci´on se realiz´o una primera implementaci´on, la can´onica. Esta funci´on no cumple
con los objetivos planteados; es decir, no presenta un buen desemple˜no computacional. Adem´as
no es posible ejecutar esa aplicaci´on en varios procesadores de manera simult´anea. Tomando esto
dos puntos, y los que puedan surgir, definimos que la implementaci´on can´onica no es una opci´on,
en t´erminos de c´omputo de alto desempe˜no. En las siguientes secciones se tratan cada uno de los
puntos ya mencionados, a fin de cumplir con cada uno de ellos.
3.5. Incremento del desempe˜no
Muchos programas pasan gran parte de su tiempo de ejecuci´on en bucles; en este caso es mediante
ciclos que se accede a los elementos de la matriz; con una reorganizaci´on adecuada de los bucles se
puede explotar el cach´e de procesador donde se guardan m´as de un elemento que se va a utilizar en
la siguiente operaci´on. Los elementos que se encuentran en la l´ınea de cach´e en muchos casos pueden
ser procesados a la vez mediante una pila de operaciones. Esto puede mejorar el rendimiento de un
programa4. En esta secci´on se optimiza la versi´on can´onica de la mutiplicaci´on Ax con la t´ecnica
de Loop unrolling.
Para mejorar el rendimiento de la aplicaci´on es preciso realizar un an´alisis detallado de la forma
matem´atica, se realiza una descomposici´on a fin de buscar diferentes formas de programar el pro-
blema para definir las caracter´ısticas y determinar cual se adapta mejor a nuestros requerimientos.
Para ello es preciso desglosar y estudiar un gran n´umero de posibles soluciones, as´ı como analizarlas;
para determinar aquella que permita maximizar el desempe˜no sin incrementar significativamente el
4
Las modificaciones en c´odigo pueden ser aplicadas si y s´olo si no cambian el correcto funcionamiento de la
aplicaci´on.
40 Cap´ıtulo 3. Producto matriz-vector Ax
error num´erico para la soluci´on buscada. Recordemos la ecuaci´on,
ci =
n
j=1
aijxj i = 1, 2, . . . , n (3.9)
En m´as de una ocasi´on cuando se realiza una tarea se encuentra que existen varios caminos para
realizarla; cada uno de esos caminos con distancias y obst´aculos distintos. Nos encontramos justo en
uno de esos casos, para elegir el camino primero estudiaremos cada uno de ellos. Existen pr´acticas
utilizadas para la optimizaci´on ciclos con un n´umero significativo de iteraciones, generalmente en
bucles for’s. Las t´ecnicas tienen el prop´osito de disminuir el tiempo de ejecuci´on del bucle; consisten
en disminuir la cantidad de iteraciones haciendo un incremento mayor a la unidad en la variable
que controla el ciclo. Una de esas pr´acticas es la llamada Unroll Loops.
Como menciona Chapman et al.[11] el Unroll a un bucle es una pr´actica poderosa para reducir
efectivamente los gastos de ejecuci´on. Puede ayudar a mejorar la utilizaci´on de la l´ınea de cach´e con
la reutilizaci´on de datos. Como es sabido el compilador no es capaz de determinar las dependencias
de operaciones ni tampoco lo que respecta al acceso en los elementos dentro de ciclos; por lo que el
desarrollador suele hacer un mejor trabajo en la optimizaci´on de bucles.
Antes de resolver el producto c = Ax, se plantea lo siguiente,
ci = aix (3.10)
donde c y x son vectores verticales de orden de n-elementos, y ai es el i-´esimo vector horizontal de
la matriz A.
Partiendo de (3.10) encontramos diferentes formas de resolverlo, a continuaci´on se listan las
variantes a tomar en cuenta, para esto todas utilizan la t´ecnica de unroll.
1. s =
n
j=1
xjyj + xj+1yj+1 ∆ j = 2
2. s =
n
j=1
xiyj + xj+1yj+1 + xj+2yj+2 + xj+3yj+3 ∆ j = 4
3. s =
n/2
j=1
xjyj + xj+1yj+1 +
n
j=n/2
xjyj + xj+1yj+1 ∆ j = 2
4. s =
n/4
j=1
xjyj + xj+1yj+1 +
n/2
j=n/4
xjyj + xj+1yj+1 +
3n/4
j=n/2
xjyj + xj+1yj+1
3.5. Incremento del desempe˜no 41
+
n
j=3n/4
xjyj + xj+1yj+1 ∆ j = 2
5. s =
n
j=1
xiyj + xj+1yj+1 + xj+2yj+2 + xj+3yj+3 + xj+4yj+4 ∆ j = 5
6. s =
n
j=1
xiyj + xj+1yj+1 + xj+2yj+2 + xj+3yj+3 + xj+4yj+4 +xj+5yj+5 ∆ j = 6
7. s =
n
j=1
xiyj + xj+1yj+1 + xj+2yj+2 + xj+3yj+3 + xj+4yj+4 + xj+5yj+5 + xj+6yj+6
+xj+7yj+7 ∆ j = 8
8. s =
n
j=1
xiyj + xj+1yj+1 + xj+2yj+2 + xj+3yj+3 + xj+4yj+4 + xj+5yj+5 + xj+6yj+6
+xj+7yj+7 + xj+8yj+8 + xj+9yj+9 + xj+10yj+10 + xj+11yj+11 ∆ j = 12
Para comprender y tener una idea de como utilizar el unroll, en primera instancia se estudiar´an
y comparar´an las primeras cinco variantes (1-5), en segunda instancia se analiza el resto. En algunos
de los casos anteriores podemos realizar dos implementaciones lo cual se expresar´a en su momento.
A continuaci´on se har´a la codificaci´on de cada una de las opciones para conocer sus caracter´ısticas.
En la primera implementaci´on (figura 3.3) corresponde a ese mismo orden de la lista de opciones
enlistadas anteriormente. Como se puede observar el n´umero de iteraciones se reduce a la mitad, lo
cual te´oricamente hace pensar que el tiempo de ejecuci´on va a reducirse a la mitad de tiempo. Para
este caso en particular corresponde a un Unroll-2 donde se guardar´a el resultado obtenido a una
variable. Esta al igual del resto de las fracciones de c´odigo que corresponda con la lista de opciones,
representa la soluci´on de la multiplicaci´on de dos vectores.
C´odigo Opci´on 1
for(i = 0; i < n; i+=2)
suma += (x[i]* y[i]) + (x[i+1] * y[i+1]);
Figura 3.3: T´ecnica Loop Unrroll con factor 2.
A continuaci´on hacemos la codificaci´on de la segunda opci´on (figura 3.4), que corresponde a un
Unroll-4. En ´esta ocasi´on la cantidad de iteraciones se reduce a una cuarta parte. Al igual que en
el caso anterior el resultado es guardado dentro de una variable.
42 Cap´ıtulo 3. Producto matriz-vector Ax
C´odigo Opci´on 2
for(j = 0; j < n; j+=4)
suma += x[j]*y[j] + x[j+1]*y[j+1] + x[j+2]*y[j+2] + x[j+3]*y[j+3];
Figura 3.4: T´ecnica Loop Unroll con factor 4.
El siguiente c´odigo (figura 3.5) representa una forma distinta de programar la primera opci´on
de la figura 3.3, en ´esta ocasi´on, primero haciendo las operaciones con los ´ındices pares del vector
y posteriormente con los impares.
C´odigo Opci´on 1a
for(j = 0; j < n; j+=2){ suma += x[j]*y[j];}
for(j = 1; j < n; j+=2){ suma += x[j]*y[j];}
Figura 3.5: T´ecnica Loop Unroll con factor 2, dos ciclos for.
Como vemos en el c´odigo de la figura 3.6, se puede codificar de distintas formas un mismo
problema. En las implementaciones anteriores s´olo utilizamos una variable para almacenar el resul-
tado, de la operaci´on en cuesti´on, en las pr´oximas codificaciones se har´a uso de dos o m´as variables
para acumular el resultado mientras se realizan las operaciones. La siguiente fracci´on de programa
corresponde al mismo c´odigo anterior pero ahora haciendo uso de dos variables.
C´odigo Opci´on 3
for(j = 0; j < n; j +=2){ s1 += (x[j]*y[j]);}
for(j = 1; j < n; j +=2){ s2 += (x[j]*y[j]);}
suma = s1 + s2;
Figura 3.6: T´ecnica Loop Unroll con factor 2, dos variables.
La cuarta opci´on (figura 3.7) representa una forma m´as sofisticada para llevar a cabo la soluci´on
del problema ya que partimos la operaci´on principal en dos sub-operaciones, las cuales a su vez
presentan un incremento en j de dos (∆j = 2) lo cual reduce el n´umero de iteraciones a la mitad
e implementa dos variables, temporales, para llevar a cabo las operaciones. Ello ante los ojos del
unroll, corresponde al Unroll-2 dividido en dos mitades.
3.5. Incremento del desempe˜no 43
C´odigo Opci´on 4
for(j = 0; j < n/2; j += 2){ s1 += x[j]*y[j] + x[j+1]*y[j+1];}
for(j = n/2; j < n; j += 2){ s2 += x[j]*y[j] + x[j+1]*y[j+1];}
suma = s1 + s2;
Figura 3.7: T´ecnica Loop Unroll con factor 2, dos ciclos for y dos variables.
La siguiente implementaci´on (figura 3.8), de la quinta opci´on, sigue la nomenclatura a la anterior
y solamente difiere en la cantidad de partes, que para este caso son cuatro, y por ende el n´umero
de variables temporales aumenta a igual n´umero, a continuaci´on se muestra lo que con anterioridad
se ha mencionado.
C´odigo Opci´on 5
for(j = 0; j < n/4; j+=2) { s1 += x[j]*y[j] + x[j+1]*y[j+1];}
for(j = n/4; j > n/2; j+=2) { s2 += x[j]*y[j] + x[j+1]*y[j+1];}
for(j = n/2; j > 3*n/4; j+=2){ s3 += x[j]*y[j] + x[j+1]*y[j+1];}
for(j = 3*n/4; j > n; j+=2) { s4 += x[j]*y[j] + x[j+1]*y[j+1];}
suma = s1 + s2 + s3 + s4;
Figura 3.8: T´ecnica Loop Unroll con factor 2, cuatros ciclos for cuatro variables.
Todas la implementaciones anteriores tienen el fin de encontrar las ventajas y desventajas que
resulta despu´es de desglosar el problema de distintas formas. Para cada una de las codificaciones
los resultados arrojados son distintos, aunque en teor´ıa el resultado es una constante; en la pr´actica
el resultado difiere en cada una de las aplicaciones.
Para hacer m´as evidente los resultados es necesario que los vectores x y y sean de tipo float y
llenados con n´umero reales con signo, intercalados de preferencia.
En muchos lugares escuchamos que los nuevos dise˜nos se deben adaptar a la necesidades, es
por ello que en todo momento nos referimos como opciones a todas las implementaciones; en esta
ocasi´on ´unicamente se someter´an a pruebas de exactitud y de velocidad de ejecuci´on.
En la tabla 3.1 podemos observar los resultados de exactitud de las funciones cuando se someten
con vectores de longitud n y con diez mil iteraciones para cada valor de n. Los resultados son
muy congruentes; para valores reducidos de n es m´as provechoso realizarlo con la versi´on can´onica,
44 Cap´ıtulo 3. Producto matriz-vector Ax
en caso contrario cuando n es grande dividir el ciclo en varias partes ser´a mejor; en t´erminos de
exactitud.
Tabla 3.1: Producto de dos vectores: resultados de prueba de exactitud, observamos las veces que
es m´as exacta, mostrada en porcentaje ( %), cada funci´on durante las iteraciones para cada valor
de n.
Resultados de Prueba de Exactitud
Funci´on y Exactitud ( %)
N Can´onica 1 1a 2 3 4 5
16 49.90 26.26 10.63 1.27 7.10 3.50 1.34
32 39.38 29.04 11.50 1.86 10.74 5.59 1.89
64 29.20 28.17 12.00 2.99 15.35 8.52 3.77
128 22.01 23.80 12.70 4.45 18.06 12.84 6.14
256 17.42 28.17 10.73 6.01 19.26 16.10 9.76
512 13.44 20.72 10.01 7.46 18.62 19.22 13.52
1024 11.26 17.73 8.63 9.60 18.36 19.28 17.83
2048 9.68 15.04 9.08 10.18 17.30 20.76 19.53
4096 9.07 13.47 8.26 11.50 17.16 19.33 22.30
8192 8.30 12.38 7.95 12.45 16.40 20.56 22.78
16384 8.50 11.56 7.79 12.91 15.50 19.93 24.22
32768 7.67 10.55 7.98 13.57 15.06 19.62 25.55
Con base a lo que observamos en la tabla 3.1 decimos que si queremos cuidar la exactitud de la
operaci´on, necesitamos desdoblar las operaciones en k-partes utilizando una variable distinta para
cada parte, donde k depender´a del orden de los vectores (x, y). Ello por motivo que en valores de
n peque˜no es contraproducente, pero donde n tenga un valor suficientemente grande, la exactitud
mejorar´a conforme se implementen m´as desdobles.
Con base a estos resultados podemos inferir que es de vital importancia definir el grado de
exactitud que buscamos; lo cual se obtiene al aumentar la cantidad de desdobles. Por consecuencia
conforme aumentemos la cantidad de partes, el c´odigo fuente crecer´a y se convertir´a en tosco y
dificultar´a el entendimiento del mismo.
Una buena pregunta que surge con los resultados obtenidos es la siguiente: ¿Por qu´e los resulta-
dos son distintos para cada funci´on?, la respuesta es muy simple, por problemas de redondeo, como
menciona Chapra et al.[12], estas diferencias son originadas porque las computadoras utilizan un
determinado n´umero de cifras significativas para los c´alculos. Es por ello que algunas operaciones
Esquemas iterativos en paralelo con OpenMP
Esquemas iterativos en paralelo con OpenMP
Esquemas iterativos en paralelo con OpenMP
Esquemas iterativos en paralelo con OpenMP
Esquemas iterativos en paralelo con OpenMP
Esquemas iterativos en paralelo con OpenMP
Esquemas iterativos en paralelo con OpenMP
Esquemas iterativos en paralelo con OpenMP
Esquemas iterativos en paralelo con OpenMP
Esquemas iterativos en paralelo con OpenMP
Esquemas iterativos en paralelo con OpenMP
Esquemas iterativos en paralelo con OpenMP
Esquemas iterativos en paralelo con OpenMP
Esquemas iterativos en paralelo con OpenMP
Esquemas iterativos en paralelo con OpenMP
Esquemas iterativos en paralelo con OpenMP
Esquemas iterativos en paralelo con OpenMP
Esquemas iterativos en paralelo con OpenMP
Esquemas iterativos en paralelo con OpenMP
Esquemas iterativos en paralelo con OpenMP
Esquemas iterativos en paralelo con OpenMP
Esquemas iterativos en paralelo con OpenMP
Esquemas iterativos en paralelo con OpenMP
Esquemas iterativos en paralelo con OpenMP
Esquemas iterativos en paralelo con OpenMP
Esquemas iterativos en paralelo con OpenMP
Esquemas iterativos en paralelo con OpenMP
Esquemas iterativos en paralelo con OpenMP
Esquemas iterativos en paralelo con OpenMP
Esquemas iterativos en paralelo con OpenMP
Esquemas iterativos en paralelo con OpenMP
Esquemas iterativos en paralelo con OpenMP
Esquemas iterativos en paralelo con OpenMP
Esquemas iterativos en paralelo con OpenMP
Esquemas iterativos en paralelo con OpenMP
Esquemas iterativos en paralelo con OpenMP
Esquemas iterativos en paralelo con OpenMP
Esquemas iterativos en paralelo con OpenMP
Esquemas iterativos en paralelo con OpenMP
Esquemas iterativos en paralelo con OpenMP
Esquemas iterativos en paralelo con OpenMP
Esquemas iterativos en paralelo con OpenMP
Esquemas iterativos en paralelo con OpenMP
Esquemas iterativos en paralelo con OpenMP
Esquemas iterativos en paralelo con OpenMP
Esquemas iterativos en paralelo con OpenMP
Esquemas iterativos en paralelo con OpenMP
Esquemas iterativos en paralelo con OpenMP
Esquemas iterativos en paralelo con OpenMP
Esquemas iterativos en paralelo con OpenMP
Esquemas iterativos en paralelo con OpenMP
Esquemas iterativos en paralelo con OpenMP
Esquemas iterativos en paralelo con OpenMP
Esquemas iterativos en paralelo con OpenMP
Esquemas iterativos en paralelo con OpenMP
Esquemas iterativos en paralelo con OpenMP
Esquemas iterativos en paralelo con OpenMP
Esquemas iterativos en paralelo con OpenMP
Esquemas iterativos en paralelo con OpenMP
Esquemas iterativos en paralelo con OpenMP
Esquemas iterativos en paralelo con OpenMP
Esquemas iterativos en paralelo con OpenMP
Esquemas iterativos en paralelo con OpenMP
Esquemas iterativos en paralelo con OpenMP
Esquemas iterativos en paralelo con OpenMP
Esquemas iterativos en paralelo con OpenMP
Esquemas iterativos en paralelo con OpenMP
Esquemas iterativos en paralelo con OpenMP
Esquemas iterativos en paralelo con OpenMP
Esquemas iterativos en paralelo con OpenMP
Esquemas iterativos en paralelo con OpenMP
Esquemas iterativos en paralelo con OpenMP
Esquemas iterativos en paralelo con OpenMP

Más contenido relacionado

La actualidad más candente

Ingeniería aplicada de yacimientos petrolíferos craft & hawkins
Ingeniería aplicada de yacimientos petrolíferos craft & hawkinsIngeniería aplicada de yacimientos petrolíferos craft & hawkins
Ingeniería aplicada de yacimientos petrolíferos craft & hawkinsGeorge Sterling
 
Engineering manual bge
Engineering manual bgeEngineering manual bge
Engineering manual bgeronaldo laime
 
Alejandro tfm
Alejandro tfmAlejandro tfm
Alejandro tfmmpaljacar
 
Propagación de ondas 01
Propagación de ondas 01Propagación de ondas 01
Propagación de ondas 01Eugenio Moreno
 
Balance de materiales en yacimientos de petoleo con gas disuelto
Balance de materiales en yacimientos de petoleo con gas disueltoBalance de materiales en yacimientos de petoleo con gas disuelto
Balance de materiales en yacimientos de petoleo con gas disueltoMagnus Fernandez
 
Introduccion poo con_java
Introduccion poo con_javaIntroduccion poo con_java
Introduccion poo con_javaRobert Wolf
 
Electrónica: Electrotecnia 350 conceptos teóricos 800 problemas
Electrónica: Electrotecnia 350 conceptos teóricos 800 problemasElectrónica: Electrotecnia 350 conceptos teóricos 800 problemas
Electrónica: Electrotecnia 350 conceptos teóricos 800 problemasSANTIAGO PABLO ALBERTO
 

La actualidad más candente (11)

Scd 13-14 todo
Scd 13-14 todoScd 13-14 todo
Scd 13-14 todo
 
Ingeniería aplicada de yacimientos petrolíferos craft & hawkins
Ingeniería aplicada de yacimientos petrolíferos craft & hawkinsIngeniería aplicada de yacimientos petrolíferos craft & hawkins
Ingeniería aplicada de yacimientos petrolíferos craft & hawkins
 
Engineering manual bge
Engineering manual bgeEngineering manual bge
Engineering manual bge
 
Alejandro tfm
Alejandro tfmAlejandro tfm
Alejandro tfm
 
Propagación de ondas 01
Propagación de ondas 01Propagación de ondas 01
Propagación de ondas 01
 
Amd apuntes-fluidos
Amd apuntes-fluidosAmd apuntes-fluidos
Amd apuntes-fluidos
 
Balance de materiales en yacimientos de petoleo con gas disuelto
Balance de materiales en yacimientos de petoleo con gas disueltoBalance de materiales en yacimientos de petoleo con gas disuelto
Balance de materiales en yacimientos de petoleo con gas disuelto
 
Volantesde inercia
Volantesde inerciaVolantesde inercia
Volantesde inercia
 
Pdf convertido
Pdf convertidoPdf convertido
Pdf convertido
 
Introduccion poo con_java
Introduccion poo con_javaIntroduccion poo con_java
Introduccion poo con_java
 
Electrónica: Electrotecnia 350 conceptos teóricos 800 problemas
Electrónica: Electrotecnia 350 conceptos teóricos 800 problemasElectrónica: Electrotecnia 350 conceptos teóricos 800 problemas
Electrónica: Electrotecnia 350 conceptos teóricos 800 problemas
 

Destacado

Udg vir.uso tec.3 un 3, act.pr.9 may
Udg vir.uso tec.3 un 3, act.pr.9 mayUdg vir.uso tec.3 un 3, act.pr.9 may
Udg vir.uso tec.3 un 3, act.pr.9 mayleticiadiazaguayo55
 
Interferometría digital
Interferometría digitalInterferometría digital
Interferometría digitalSotero Ordones
 
Cómo se crea una ley en méxico
Cómo se crea una ley en méxicoCómo se crea una ley en méxico
Cómo se crea una ley en méxicoBarbieSeyer
 
Guía a la redacción en el estilo APA, 6ta edición
Guía a la redacción en el estilo  APA, 6ta edición Guía a la redacción en el estilo  APA, 6ta edición
Guía a la redacción en el estilo APA, 6ta edición MariaC Bernal
 
Normas APA sexta edición (comentarios Centro de Escritura Javeriano)
Normas APA sexta edición  (comentarios Centro de Escritura Javeriano)Normas APA sexta edición  (comentarios Centro de Escritura Javeriano)
Normas APA sexta edición (comentarios Centro de Escritura Javeriano)MariaC Bernal
 
Contexto de la investigacion
Contexto de la investigacionContexto de la investigacion
Contexto de la investigacionNatalia Cardozo
 
Filosofía de las Ciencias Humanas y Sociales
Filosofía de las Ciencias Humanas y SocialesFilosofía de las Ciencias Humanas y Sociales
Filosofía de las Ciencias Humanas y SocialesMarco González
 
Definir cuál es el contexto de la investigación
Definir cuál es el contexto de la investigaciónDefinir cuál es el contexto de la investigación
Definir cuál es el contexto de la investigaciónArelisRico
 
Historia y evolución del cerdo
Historia y evolución del cerdoHistoria y evolución del cerdo
Historia y evolución del cerdoSonia Baldivieso
 
Tesis para Optar Título Profesional de Licenciada en Educación
Tesis para Optar Título Profesional de Licenciada en EducaciónTesis para Optar Título Profesional de Licenciada en Educación
Tesis para Optar Título Profesional de Licenciada en EducaciónLUPE AMELIA RIVERA GONZALES
 

Destacado (11)

OpenMP
OpenMPOpenMP
OpenMP
 
Udg vir.uso tec.3 un 3, act.pr.9 may
Udg vir.uso tec.3 un 3, act.pr.9 mayUdg vir.uso tec.3 un 3, act.pr.9 may
Udg vir.uso tec.3 un 3, act.pr.9 may
 
Interferometría digital
Interferometría digitalInterferometría digital
Interferometría digital
 
Cómo se crea una ley en méxico
Cómo se crea una ley en méxicoCómo se crea una ley en méxico
Cómo se crea una ley en méxico
 
Guía a la redacción en el estilo APA, 6ta edición
Guía a la redacción en el estilo  APA, 6ta edición Guía a la redacción en el estilo  APA, 6ta edición
Guía a la redacción en el estilo APA, 6ta edición
 
Normas APA sexta edición (comentarios Centro de Escritura Javeriano)
Normas APA sexta edición  (comentarios Centro de Escritura Javeriano)Normas APA sexta edición  (comentarios Centro de Escritura Javeriano)
Normas APA sexta edición (comentarios Centro de Escritura Javeriano)
 
Contexto de la investigacion
Contexto de la investigacionContexto de la investigacion
Contexto de la investigacion
 
Filosofía de las Ciencias Humanas y Sociales
Filosofía de las Ciencias Humanas y SocialesFilosofía de las Ciencias Humanas y Sociales
Filosofía de las Ciencias Humanas y Sociales
 
Definir cuál es el contexto de la investigación
Definir cuál es el contexto de la investigaciónDefinir cuál es el contexto de la investigación
Definir cuál es el contexto de la investigación
 
Historia y evolución del cerdo
Historia y evolución del cerdoHistoria y evolución del cerdo
Historia y evolución del cerdo
 
Tesis para Optar Título Profesional de Licenciada en Educación
Tesis para Optar Título Profesional de Licenciada en EducaciónTesis para Optar Título Profesional de Licenciada en Educación
Tesis para Optar Título Profesional de Licenciada en Educación
 

Similar a Esquemas iterativos en paralelo con OpenMP

Algoritmos programacion-python
Algoritmos programacion-pythonAlgoritmos programacion-python
Algoritmos programacion-pythonLUIS COAQUIRA
 
Algoritmos y programacion_i_-_con_lengua
Algoritmos y programacion_i_-_con_lenguaAlgoritmos y programacion_i_-_con_lengua
Algoritmos y programacion_i_-_con_lenguaDarío Herrera
 
ApuntesC++.pdf
ApuntesC++.pdfApuntesC++.pdf
ApuntesC++.pdfbilgrado01
 
Libro programación-en-c++
Libro programación-en-c++Libro programación-en-c++
Libro programación-en-c++Andres Escobar
 
Introduccion a la_programacion_con_c
Introduccion a la_programacion_con_cIntroduccion a la_programacion_con_c
Introduccion a la_programacion_con_cAbefo
 
Introducción a la programación en c
Introducción a la programación en cIntroducción a la programación en c
Introducción a la programación en cvictdiazm
 
Serie aprender a_investigar,_módulo_4_análisis_de_la_información
Serie aprender a_investigar,_módulo_4_análisis_de_la_informaciónSerie aprender a_investigar,_módulo_4_análisis_de_la_información
Serie aprender a_investigar,_módulo_4_análisis_de_la_informaciónSistemadeEstudiosMed
 
notas de análisis numerico
notas de análisis numericonotas de análisis numerico
notas de análisis numericoxino7
 
Serie aprender a investigar 4
Serie aprender a investigar 4Serie aprender a investigar 4
Serie aprender a investigar 4JCASTINI
 
Desarrollo proyectos-informaticos-con-java
Desarrollo proyectos-informaticos-con-javaDesarrollo proyectos-informaticos-con-java
Desarrollo proyectos-informaticos-con-javaFreddy Quina
 
Libro javacontapa
Libro javacontapaLibro javacontapa
Libro javacontapaTabu Carlos
 
Libro javacontapa
Libro javacontapaLibro javacontapa
Libro javacontapaRobert Wolf
 
MANUAL DE LENGUAJE C
MANUAL DE LENGUAJE CMANUAL DE LENGUAJE C
MANUAL DE LENGUAJE Cclaudiocj7
 

Similar a Esquemas iterativos en paralelo con OpenMP (20)

Calculo diferencial
Calculo diferencialCalculo diferencial
Calculo diferencial
 
Algoritmos programacion-python
Algoritmos programacion-pythonAlgoritmos programacion-python
Algoritmos programacion-python
 
Algoritmos programacion-python
Algoritmos programacion-pythonAlgoritmos programacion-python
Algoritmos programacion-python
 
Algoritmos y programacion_i_-_con_lengua
Algoritmos y programacion_i_-_con_lenguaAlgoritmos y programacion_i_-_con_lengua
Algoritmos y programacion_i_-_con_lengua
 
ApuntesC++.pdf
ApuntesC++.pdfApuntesC++.pdf
ApuntesC++.pdf
 
Libro programación-en-c++
Libro programación-en-c++Libro programación-en-c++
Libro programación-en-c++
 
Introduccion a la_programacion_con_c
Introduccion a la_programacion_con_cIntroduccion a la_programacion_con_c
Introduccion a la_programacion_con_c
 
Graficaci ón
Graficaci ónGraficaci ón
Graficaci ón
 
Introducción a la programación en C
Introducción a la programación en CIntroducción a la programación en C
Introducción a la programación en C
 
Introducción a la programación en c
Introducción a la programación en cIntroducción a la programación en c
Introducción a la programación en c
 
Serie aprender a_investigar,_módulo_4_análisis_de_la_información
Serie aprender a_investigar,_módulo_4_análisis_de_la_informaciónSerie aprender a_investigar,_módulo_4_análisis_de_la_información
Serie aprender a_investigar,_módulo_4_análisis_de_la_información
 
Aa i modulo 4
Aa i modulo 4Aa i modulo 4
Aa i modulo 4
 
TFM_MJVillanueva
TFM_MJVillanuevaTFM_MJVillanueva
TFM_MJVillanueva
 
notas de análisis numerico
notas de análisis numericonotas de análisis numerico
notas de análisis numerico
 
Serie aprender a investigar 4
Serie aprender a investigar 4Serie aprender a investigar 4
Serie aprender a investigar 4
 
Desarrollo proyectos-informaticos-con-java
Desarrollo proyectos-informaticos-con-javaDesarrollo proyectos-informaticos-con-java
Desarrollo proyectos-informaticos-con-java
 
Bsc_Thesis
Bsc_ThesisBsc_Thesis
Bsc_Thesis
 
Libro javacontapa
Libro javacontapaLibro javacontapa
Libro javacontapa
 
Libro javacontapa
Libro javacontapaLibro javacontapa
Libro javacontapa
 
MANUAL DE LENGUAJE C
MANUAL DE LENGUAJE CMANUAL DE LENGUAJE C
MANUAL DE LENGUAJE C
 

Más de Sotero Ordones

Algoritmo Iterativo Eficiente para el Análisis de Interferogramas con Corrimi...
Algoritmo Iterativo Eficiente para el Análisis de Interferogramas con Corrimi...Algoritmo Iterativo Eficiente para el Análisis de Interferogramas con Corrimi...
Algoritmo Iterativo Eficiente para el Análisis de Interferogramas con Corrimi...Sotero Ordones
 
Incremento en el desempeño de la multiplicación Matriz-Vector
Incremento en el desempeño de la multiplicación Matriz-VectorIncremento en el desempeño de la multiplicación Matriz-Vector
Incremento en el desempeño de la multiplicación Matriz-VectorSotero Ordones
 
Tutorial velos y transparencias Photoshop
Tutorial velos y transparencias PhotoshopTutorial velos y transparencias Photoshop
Tutorial velos y transparencias PhotoshopSotero Ordones
 
Recortar figuras complejas con photoshop
Recortar figuras complejas con photoshopRecortar figuras complejas con photoshop
Recortar figuras complejas con photoshopSotero Ordones
 
Convertir una fotografía en dibujo con photoshop
Convertir una fotografía en dibujo con photoshopConvertir una fotografía en dibujo con photoshop
Convertir una fotografía en dibujo con photoshopSotero Ordones
 
Enmascarar un árbol en photoshop
Enmascarar un árbol en photoshopEnmascarar un árbol en photoshop
Enmascarar un árbol en photoshopSotero Ordones
 
Efectos de fotos photoshop
Efectos de fotos photoshopEfectos de fotos photoshop
Efectos de fotos photoshopSotero Ordones
 
Búsqueda avanzada en google
Búsqueda avanzada en googleBúsqueda avanzada en google
Búsqueda avanzada en googleSotero Ordones
 

Más de Sotero Ordones (8)

Algoritmo Iterativo Eficiente para el Análisis de Interferogramas con Corrimi...
Algoritmo Iterativo Eficiente para el Análisis de Interferogramas con Corrimi...Algoritmo Iterativo Eficiente para el Análisis de Interferogramas con Corrimi...
Algoritmo Iterativo Eficiente para el Análisis de Interferogramas con Corrimi...
 
Incremento en el desempeño de la multiplicación Matriz-Vector
Incremento en el desempeño de la multiplicación Matriz-VectorIncremento en el desempeño de la multiplicación Matriz-Vector
Incremento en el desempeño de la multiplicación Matriz-Vector
 
Tutorial velos y transparencias Photoshop
Tutorial velos y transparencias PhotoshopTutorial velos y transparencias Photoshop
Tutorial velos y transparencias Photoshop
 
Recortar figuras complejas con photoshop
Recortar figuras complejas con photoshopRecortar figuras complejas con photoshop
Recortar figuras complejas con photoshop
 
Convertir una fotografía en dibujo con photoshop
Convertir una fotografía en dibujo con photoshopConvertir una fotografía en dibujo con photoshop
Convertir una fotografía en dibujo con photoshop
 
Enmascarar un árbol en photoshop
Enmascarar un árbol en photoshopEnmascarar un árbol en photoshop
Enmascarar un árbol en photoshop
 
Efectos de fotos photoshop
Efectos de fotos photoshopEfectos de fotos photoshop
Efectos de fotos photoshop
 
Búsqueda avanzada en google
Búsqueda avanzada en googleBúsqueda avanzada en google
Búsqueda avanzada en google
 

Último

Infografía EE con pie del 2023 (3)-1.pdf
Infografía EE con pie del 2023 (3)-1.pdfInfografía EE con pie del 2023 (3)-1.pdf
Infografía EE con pie del 2023 (3)-1.pdfAlfaresbilingual
 
6.-Como-Atraer-El-Amor-01-Lain-Garcia-Calvo.pdf
6.-Como-Atraer-El-Amor-01-Lain-Garcia-Calvo.pdf6.-Como-Atraer-El-Amor-01-Lain-Garcia-Calvo.pdf
6.-Como-Atraer-El-Amor-01-Lain-Garcia-Calvo.pdfMiNeyi1
 
2024 KIT DE HABILIDADES SOCIOEMOCIONALES.pdf
2024 KIT DE HABILIDADES SOCIOEMOCIONALES.pdf2024 KIT DE HABILIDADES SOCIOEMOCIONALES.pdf
2024 KIT DE HABILIDADES SOCIOEMOCIONALES.pdfMiguelHuaman31
 
OCTAVO SEGUNDO PERIODO. EMPRENDIEMIENTO VS
OCTAVO SEGUNDO PERIODO. EMPRENDIEMIENTO VSOCTAVO SEGUNDO PERIODO. EMPRENDIEMIENTO VS
OCTAVO SEGUNDO PERIODO. EMPRENDIEMIENTO VSYadi Campos
 
🦄💫4° SEM32 WORD PLANEACIÓN PROYECTOS DARUKEL 23-24.docx
🦄💫4° SEM32 WORD PLANEACIÓN PROYECTOS DARUKEL 23-24.docx🦄💫4° SEM32 WORD PLANEACIÓN PROYECTOS DARUKEL 23-24.docx
🦄💫4° SEM32 WORD PLANEACIÓN PROYECTOS DARUKEL 23-24.docxEliaHernndez7
 
ACERTIJO DE POSICIÓN DE CORREDORES EN LA OLIMPIADA. Por JAVIER SOLIS NOYOLA
ACERTIJO DE POSICIÓN DE CORREDORES EN LA OLIMPIADA. Por JAVIER SOLIS NOYOLAACERTIJO DE POSICIÓN DE CORREDORES EN LA OLIMPIADA. Por JAVIER SOLIS NOYOLA
ACERTIJO DE POSICIÓN DE CORREDORES EN LA OLIMPIADA. Por JAVIER SOLIS NOYOLAJAVIER SOLIS NOYOLA
 
Prueba de evaluación Geografía e Historia Comunidad de Madrid 4ºESO
Prueba de evaluación Geografía e Historia Comunidad de Madrid 4ºESOPrueba de evaluación Geografía e Historia Comunidad de Madrid 4ºESO
Prueba de evaluación Geografía e Historia Comunidad de Madrid 4ºESOluismii249
 
Proyecto de aprendizaje dia de la madre MINT.pdf
Proyecto de aprendizaje dia de la madre MINT.pdfProyecto de aprendizaje dia de la madre MINT.pdf
Proyecto de aprendizaje dia de la madre MINT.pdfpatriciaines1993
 
PLAN DE REFUERZO ESCOLAR primaria (1).docx
PLAN DE REFUERZO ESCOLAR primaria (1).docxPLAN DE REFUERZO ESCOLAR primaria (1).docx
PLAN DE REFUERZO ESCOLAR primaria (1).docxlupitavic
 
2 REGLAMENTO RM 0912-2024 DE MODALIDADES DE GRADUACIÓN_.pptx
2 REGLAMENTO RM 0912-2024 DE MODALIDADES DE GRADUACIÓN_.pptx2 REGLAMENTO RM 0912-2024 DE MODALIDADES DE GRADUACIÓN_.pptx
2 REGLAMENTO RM 0912-2024 DE MODALIDADES DE GRADUACIÓN_.pptxRigoTito
 
Curso = Metodos Tecnicas y Modelos de Enseñanza.pdf
Curso = Metodos Tecnicas y Modelos de Enseñanza.pdfCurso = Metodos Tecnicas y Modelos de Enseñanza.pdf
Curso = Metodos Tecnicas y Modelos de Enseñanza.pdfFrancisco158360
 
SEXTO SEGUNDO PERIODO EMPRENDIMIENTO.pptx
SEXTO SEGUNDO PERIODO EMPRENDIMIENTO.pptxSEXTO SEGUNDO PERIODO EMPRENDIMIENTO.pptx
SEXTO SEGUNDO PERIODO EMPRENDIMIENTO.pptxYadi Campos
 
BIOMETANO SÍ, PERO NO ASÍ. LA NUEVA BURBUJA ENERGÉTICA
BIOMETANO SÍ, PERO NO ASÍ. LA NUEVA BURBUJA ENERGÉTICABIOMETANO SÍ, PERO NO ASÍ. LA NUEVA BURBUJA ENERGÉTICA
BIOMETANO SÍ, PERO NO ASÍ. LA NUEVA BURBUJA ENERGÉTICAÁngel Encinas
 
Qué es la Inteligencia artificial generativa
Qué es la Inteligencia artificial generativaQué es la Inteligencia artificial generativa
Qué es la Inteligencia artificial generativaDecaunlz
 
Caja de herramientas de inteligencia artificial para la academia y la investi...
Caja de herramientas de inteligencia artificial para la academia y la investi...Caja de herramientas de inteligencia artificial para la academia y la investi...
Caja de herramientas de inteligencia artificial para la academia y la investi...Lourdes Feria
 
Tema 17. Biología de los microorganismos 2024
Tema 17. Biología de los microorganismos 2024Tema 17. Biología de los microorganismos 2024
Tema 17. Biología de los microorganismos 2024IES Vicent Andres Estelles
 

Último (20)

Infografía EE con pie del 2023 (3)-1.pdf
Infografía EE con pie del 2023 (3)-1.pdfInfografía EE con pie del 2023 (3)-1.pdf
Infografía EE con pie del 2023 (3)-1.pdf
 
6.-Como-Atraer-El-Amor-01-Lain-Garcia-Calvo.pdf
6.-Como-Atraer-El-Amor-01-Lain-Garcia-Calvo.pdf6.-Como-Atraer-El-Amor-01-Lain-Garcia-Calvo.pdf
6.-Como-Atraer-El-Amor-01-Lain-Garcia-Calvo.pdf
 
Supuestos_prácticos_funciones.docx
Supuestos_prácticos_funciones.docxSupuestos_prácticos_funciones.docx
Supuestos_prácticos_funciones.docx
 
2024 KIT DE HABILIDADES SOCIOEMOCIONALES.pdf
2024 KIT DE HABILIDADES SOCIOEMOCIONALES.pdf2024 KIT DE HABILIDADES SOCIOEMOCIONALES.pdf
2024 KIT DE HABILIDADES SOCIOEMOCIONALES.pdf
 
OCTAVO SEGUNDO PERIODO. EMPRENDIEMIENTO VS
OCTAVO SEGUNDO PERIODO. EMPRENDIEMIENTO VSOCTAVO SEGUNDO PERIODO. EMPRENDIEMIENTO VS
OCTAVO SEGUNDO PERIODO. EMPRENDIEMIENTO VS
 
🦄💫4° SEM32 WORD PLANEACIÓN PROYECTOS DARUKEL 23-24.docx
🦄💫4° SEM32 WORD PLANEACIÓN PROYECTOS DARUKEL 23-24.docx🦄💫4° SEM32 WORD PLANEACIÓN PROYECTOS DARUKEL 23-24.docx
🦄💫4° SEM32 WORD PLANEACIÓN PROYECTOS DARUKEL 23-24.docx
 
ACERTIJO DE POSICIÓN DE CORREDORES EN LA OLIMPIADA. Por JAVIER SOLIS NOYOLA
ACERTIJO DE POSICIÓN DE CORREDORES EN LA OLIMPIADA. Por JAVIER SOLIS NOYOLAACERTIJO DE POSICIÓN DE CORREDORES EN LA OLIMPIADA. Por JAVIER SOLIS NOYOLA
ACERTIJO DE POSICIÓN DE CORREDORES EN LA OLIMPIADA. Por JAVIER SOLIS NOYOLA
 
Prueba de evaluación Geografía e Historia Comunidad de Madrid 4ºESO
Prueba de evaluación Geografía e Historia Comunidad de Madrid 4ºESOPrueba de evaluación Geografía e Historia Comunidad de Madrid 4ºESO
Prueba de evaluación Geografía e Historia Comunidad de Madrid 4ºESO
 
Interpretación de cortes geológicos 2024
Interpretación de cortes geológicos 2024Interpretación de cortes geológicos 2024
Interpretación de cortes geológicos 2024
 
Proyecto de aprendizaje dia de la madre MINT.pdf
Proyecto de aprendizaje dia de la madre MINT.pdfProyecto de aprendizaje dia de la madre MINT.pdf
Proyecto de aprendizaje dia de la madre MINT.pdf
 
PLAN DE REFUERZO ESCOLAR primaria (1).docx
PLAN DE REFUERZO ESCOLAR primaria (1).docxPLAN DE REFUERZO ESCOLAR primaria (1).docx
PLAN DE REFUERZO ESCOLAR primaria (1).docx
 
2 REGLAMENTO RM 0912-2024 DE MODALIDADES DE GRADUACIÓN_.pptx
2 REGLAMENTO RM 0912-2024 DE MODALIDADES DE GRADUACIÓN_.pptx2 REGLAMENTO RM 0912-2024 DE MODALIDADES DE GRADUACIÓN_.pptx
2 REGLAMENTO RM 0912-2024 DE MODALIDADES DE GRADUACIÓN_.pptx
 
Curso = Metodos Tecnicas y Modelos de Enseñanza.pdf
Curso = Metodos Tecnicas y Modelos de Enseñanza.pdfCurso = Metodos Tecnicas y Modelos de Enseñanza.pdf
Curso = Metodos Tecnicas y Modelos de Enseñanza.pdf
 
Medición del Movimiento Online 2024.pptx
Medición del Movimiento Online 2024.pptxMedición del Movimiento Online 2024.pptx
Medición del Movimiento Online 2024.pptx
 
SEXTO SEGUNDO PERIODO EMPRENDIMIENTO.pptx
SEXTO SEGUNDO PERIODO EMPRENDIMIENTO.pptxSEXTO SEGUNDO PERIODO EMPRENDIMIENTO.pptx
SEXTO SEGUNDO PERIODO EMPRENDIMIENTO.pptx
 
Unidad 3 | Metodología de la Investigación
Unidad 3 | Metodología de la InvestigaciónUnidad 3 | Metodología de la Investigación
Unidad 3 | Metodología de la Investigación
 
BIOMETANO SÍ, PERO NO ASÍ. LA NUEVA BURBUJA ENERGÉTICA
BIOMETANO SÍ, PERO NO ASÍ. LA NUEVA BURBUJA ENERGÉTICABIOMETANO SÍ, PERO NO ASÍ. LA NUEVA BURBUJA ENERGÉTICA
BIOMETANO SÍ, PERO NO ASÍ. LA NUEVA BURBUJA ENERGÉTICA
 
Qué es la Inteligencia artificial generativa
Qué es la Inteligencia artificial generativaQué es la Inteligencia artificial generativa
Qué es la Inteligencia artificial generativa
 
Caja de herramientas de inteligencia artificial para la academia y la investi...
Caja de herramientas de inteligencia artificial para la academia y la investi...Caja de herramientas de inteligencia artificial para la academia y la investi...
Caja de herramientas de inteligencia artificial para la academia y la investi...
 
Tema 17. Biología de los microorganismos 2024
Tema 17. Biología de los microorganismos 2024Tema 17. Biología de los microorganismos 2024
Tema 17. Biología de los microorganismos 2024
 

Esquemas iterativos en paralelo con OpenMP

  • 1. CENTRO UNIVERSITARIO DE LA COSTA SUR UNIVERSIDAD DE GUADALAJARA DIVISI´ON DE DESARROLLO REGIONAL DEPARTAMENTO DE INGENIER´IAS INGENIER´IA EN TELEINFORM´ATICA PARA OBTENER EL T´ITULO DE INGENIERO EN TELEINFORM´ATICA BAJO LA MODALIDAD DE TITULACI´ON TESIS CON EL T´ITULO “Esquemas Iterativos en Paralelo con OpenMP” PRESENTA Sotero Ordo˜nes Nogales DIRECTOR Dr. Jos´e Antonio Mu˜noz G´omez ASESORES Dr. Luis Isidro Aguirre Salas Dr. Omar Aguilar Loreto Autl´an de la Grana, Jalisco. Enero 2013
  • 2.
  • 3. UNIVERSIDAD DE GUADALAJARA CENTRO UNIVERSITARIO DE LA COSTA SUR SECRETARÍA ACADÉMICA – COORDINACIÓN DE INGENIERÍA EN TELEINFORMÁTICA Avenida Independencia Nacional # 151, Autlán de Navarro, Jalisco; C.P. 48900, Tels. (317) 382-50-10 Y 382-32- 00 http://www.cucsur.udg.mx C. SOTERO ORDOÑES NOGALES Egresado de la Carrera de Ingeniería en Teleinformática P R E S E N T E A través de la presente, se le informa que fue APROBADA su modalidad de titulación de TESIS, para titularse de la carrera de Ingeniero en Teleinformática. Así mismo, se le informa que estará asignado como Director al DR. JOSE ANTONIO MUÑOZ GÓMEZ y DR. OMAR AGUILAR LORETO y DR. LUIS ISIDRO AGUIRRE SALAS, como asesores. Se anexa una guía con los temas que debe considerar para realizar dicho documento y se le informa a su vez que tiene 8 meses a partir de la fecha del presente para entrega del trabajo recepcional con el visto bueno del Director. Debe presentar siete ejemplares impresos con una copia de este oficio en primer término. Además, debe agregar portada y un formato específicos, solicitarlos antes de su entrega. ATENTAMENTE “PIENSA Y TRABAJA” AUTLÁN DE NAVARRO, JAL. 04 DE DICIEMBRE DE 2012. ___________________________________________ M.T.A. CLAUDIA DIANE VACA GAVIÑO COORDINADOR DE LA CARRERA DE INGENIERÍA Y DE TSU EN TELEINFORMÁTICA C.C.P ARCHIVO
  • 4.
  • 5.
  • 6.
  • 7. Dedicatorias y Agradecimientos He llegado al final de una peque˜na traves´ıa en el viaje de la vida; durante ´este trayecto he adquirido experiencias que han dejado estelas imborrables. Me permito mencionar a las dos personas que se convirtieron en la estrella polar de este pobre marinero: A Nora Marisol Ch´avez Guerrero, ...mi inspiraci´on y motivaci´on. A mi padre, Luis Ord´o˜nez D´ıaz que siempre estar´a en mi recuerdo. Hay personas que nos hablan y ni las escuchamos... hay personas que nos hieren y no dejan ni cicatriz... pero hay personas que simplemente aparecen en nues- tra vida y nos marcan para siempre. Cec´ılia Meireles
  • 8. Un marinero no es nadie sin la ayuda de aquellos que lo han acompa˜nado en el barco. Quiero agradecer a esas personas con las que no s´olo compart´ı este viaje, sino colaboraron en la toma del rumbo, me refiero a la tripulaci´on: Mi familia y Dios Por estar all´ı siempre apoyandome, toda la paciencia y esfuerzo que han realizado para ver cumplido este sue˜no. Especialmente a mi se˜nora madre a quien no me alcanzar´a toda una vida, ni cada una de las palabras del mundo para agradecerte por todo lo que ha hecho por m´ı. A mis hermanos Juan, Isabel, Angelina y Julio que sin la ayuda ´esto no ser´ıa posible. Dr Antonio Gracias por ese apoyo incondicional no s´olo durante la realizaci´on del presente documento; sino tambi´en en el transcurso de mi formaci´on profesional y personal dentro de ´esta instituci´on. Por la paciencia y dedicaci´on para aclarar los temas oscuros. Por permitirme utilizar las computadoras para la evaluaci´on de los resultados y la elaboraci´on de la presente tesis. Los doctores Luis Isidro y Omar Gracias m´as que ser mis maestros ser mis amigos. Sus valiosas aportaciones y observaciones a la presente tesis. Agradezco todas sus ense˜nazas que no s´olo se limitaron a lecciones acad´emicas sino tambi´en de vida. Me es imposible citar textualmente las frases que me dijeron; pero la esencia la conservo. Para llevar a puerto ´esta peque˜na embarcaci´on colaboraron muchas personas que por ahora me es imposible nombrar a cada una de ellas; todos esos momentos que hicieron divertida la traves´ıa. Como olvidar ´esta tan acertada frase de uno de ellos: ...la universidad es como una espada, cuanto m´as la afilemos y practique- mos...estaremos mejor preparados para enfrentar, al coyote que est´a al asecho en el camino de la vida... Luis Isidro Aguirre Salas
  • 9. ´Indice general ´Indice de figuras XI ´Indice de tablas XIII Resumen XV 1. Introducci´on 1 2. Marco Te´orico 7 2.1. M´etodos num´ericos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 2.2. Modelaci´on matem´atica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 2.3. Los n´umeros en la computadora . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 2.4. Tipos de error en m´etodos num´ericos . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 2.5. El lenguaje de programaci´on C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 2.6. Programaci´on en paralelo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 2.7. OpenMP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 2.8. Escalabilidad paralela . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 2.8.1. Ley de Amdahl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 2.8.2. Incremento de velocidad (speed-up) . . . . . . . . . . . . . . . . . . . . . . . 27 2.8.3. Desempe˜no computacional . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 3. Producto matriz-vector Ax 31 3.1. Concepto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 3.2. Loop unrolling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 3.3. C´alculo del residual . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 3.4. Codificaci´on . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 3.5. Incremento del desempe˜no . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 3.6. Procesamiento vectorial (SIMD) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 3.7. Codificaci´on en paralelo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 3.8. Evaluaci´on de algoritmos en paralelo . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 ix
  • 10. x ´Indice general 4. M´etodo Iterativo de Jacobi 69 4.1. Concepto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 4.2. Codificaci´on del m´etodo de Jacobi en C . . . . . . . . . . . . . . . . . . . . . . . . . 81 4.2.1. Simplificando c´odigo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 4.2.2. Optimizaci´on de c´odigo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86 4.3. M´etodo de Jacobi en paralelo con OpenMP . . . . . . . . . . . . . . . . . . . . . . . 87 4.4. Evaluaci´on de algoritmo en paralelo . . . . . . . . . . . . . . . . . . . . . . . . . . . 90 5. M´etodo de Gauss-Seidel 93 5.1. Concepto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 5.2. Programaci´on en lenguaje C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96 5.3. Codificaci´on en paralelo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 5.4. Gauss-Seidel versus Jacobi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 6. Conclusiones y trabajo a futuro 109 Bibliograf´ıa 113
  • 11. ´Indice de figuras 2.1. Distribuci´on de n´umeros enteros con formato predefinido. . . . . . . . . . . . . . . . 10 2.2. Distribuci´on de n´umeros reales con formato predefinido. . . . . . . . . . . . . . . . . 12 2.3. Modelo para representaci´on de n´umeros en punto flotante IEEE 754. . . . . . . . . . 13 2.4. C´alculo de epsil´on de la computadora. . . . . . . . . . . . . . . . . . . . . . . . . . . 14 2.5. Rango de n´umero IEEE-754 precisi´on simple. . . . . . . . . . . . . . . . . . . . . . . 15 2.6. Arquitectura de hardware CPU versus GPU. . . . . . . . . . . . . . . . . . . . . . . 21 2.7. Tipos de memoria en sistemas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 2.8. Modelo de OpenMP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 2.9. Modelo de ejecuci´on de programas paralelos. . . . . . . . . . . . . . . . . . . . . . . 26 2.10. Speed-up con Ley de Amdahl. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 3.1. C´alculo del residual en C. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 3.2. Implementaci´on can´onica de Ax. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 3.3. T´ecnica Loop Unrroll con factor 2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 3.4. T´ecnica Loop Unroll con factor 4. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 3.5. T´ecnica Loop Unroll con factor 2, dos ciclos for. . . . . . . . . . . . . . . . . . . . . 42 3.6. T´ecnica Loop Unroll con factor 2, dos variables. . . . . . . . . . . . . . . . . . . . . . 42 3.7. T´ecnica Loop Unroll con factor 2, dos ciclos for y dos variables. . . . . . . . . . . . . 43 3.8. T´ecnica Loop Unroll con factor 2, cuatros ciclos for cuatro variables. . . . . . . . . . 43 3.9. T´ecnica Loop Unroll con factor 5. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 3.10. T´ecnica Loop Unroll con factor 6. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 3.11. T´ecnica Loop Unroll con factor 8. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 3.12. T´ecnica Loop Unroll con factor 10. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 3.13. T´ecnica Loop Unroll con factor 12. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 3.14. Speed-up para la multiplicaci´on de dos vectores. . . . . . . . . . . . . . . . . . . . . 48 3.15. Funci´on general de la multiplicaci´on Ax con Unroll. . . . . . . . . . . . . . . . . . . 50 3.16. Speed-up de Ax utilizando la t´ecnica de Unroll. . . . . . . . . . . . . . . . . . . . . . 51 3.17. Rendimiento computacional de Ax al utilizar la t´ecnica de Unroll. . . . . . . . . . . 52 3.18. Modelo SIMD. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 3.19. Funci´on en MMX que multiplica dos vectores x y y. . . . . . . . . . . . . . . . . . . 55 3.20. Desempe˜no de Ax al utilizar MMX con bandera de compilaci´on -O2. . . . . . . . . . 59 3.21. Implementaci´on can´onica en paralelo de Ax. . . . . . . . . . . . . . . . . . . . . . . . 60 xi
  • 12. xii ´Indice de figuras 3.22. Rendimiento de la versi´on can´onica de Ax en paralelo con bandera de compilaci´on -O2. 62 3.23. Implementaci´on general de Ax en paralelo. . . . . . . . . . . . . . . . . . . . . . . . 62 3.24. Desempe˜no de la versi´on can´onica de Ax con banderas de compilaci´on. . . . . . . . . 63 3.25. Escalabilidad paralela de Ax en su la versi´on Unroll-10 con bandera -O2. . . . . . . 64 3.26. Escalabilidad paralela de Ax en su la versi´on MMX con bandera -O2. . . . . . . . . 65 3.27. Comparativa del rendimiento computacional de las versiones can´onica, Unroll-10 y MMX con bandera de compilaci´on -O2. . . . . . . . . . . . . . . . . . . . . . . . . . 66 4.1. Primera implementaci´on del m´etodo de Jacobi en lenguaje C. . . . . . . . . . . . . . 82 4.2. C´odigo en lenguaje C del esquema de Jacobi. . . . . . . . . . . . . . . . . . . . . . . 83 4.3. Porcentaje del tiempo de ejecuci´on del m´etodo de Jacobi con y sin sentencia if. . . . 84 4.4. C´odigo general de Jacobi optimizado. . . . . . . . . . . . . . . . . . . . . . . . . . . . 86 4.5. Tiempos de ejecuci´on de Jacobi en serie, versiones [Can´onica, Unroll4, MMX] para n = 5000. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 4.6. C´odigo de versi´on can´onica en paralelo de Jacobi. . . . . . . . . . . . . . . . . . . . . 88 4.7. Speed-up del m´etodo de Jacobi en paralelo en su versi´on can´onica. . . . . . . . . . . 89 4.8. Speed-up del m´etodo de Jacobi en paralelo en su versi´on MMX. . . . . . . . . . . . . 90 5.1. M´etodo de Gauss-Seidel en lenguaje C, versi´on can´onica. . . . . . . . . . . . . . . . . 97 5.2. M´etodo de Gauss-Seidel con OpenMP. . . . . . . . . . . . . . . . . . . . . . . . . . . 98 5.3. Descomposici´on del vector soluci´on x para dos procesadores. . . . . . . . . . . . . . . 99 5.4. Escalabilidad paralela del m´etodo Gauss-Seidel versi´on can´onica. . . . . . . . . . . . 101 5.5. M´etodo de Jacobi con diferencias finitas. . . . . . . . . . . . . . . . . . . . . . . . . . 104 5.6. M´etodo de Gauss-Seidel con diferencias finitas. . . . . . . . . . . . . . . . . . . . . . 104 5.7. Aproximaci´on num´erica a u(x, y) = sen x cos y con Gauss-Seidel. . . . . . . . . . . . . 106
  • 13. ´Indice de tablas 2.1. Unidades de medida de FLOPS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 3.1. Producto de dos vectores: resultados de prueba de exactitud, observamos las veces que es m´as exacta, mostrada en porcentaje ( %), cada funci´on durante las iteraciones para cada valor de n. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 3.2. Producto de dos vectores: resultados de prueba de velocidad, observamos la tasa de exactitud de cada funci´on con respecto al n´umero de iteraciones (10,000). . . . . . . 45 3.3. Producto de dos vectores: comparaci´on de rendimiento de las funciones can´onica, MMX y Unroll-4; observamos el rendimiento que nos brinda la funci´on en MMX respecto a la forma tradicional y en comparaci´on con la funci´on con Unroll de 4. . . 58 4.1. M´etodo iterativo de Jacobi: primera evaluaci´on de rendimiento, observamos el por- centaje de la reducci´on del tiempo en ejecuci´on cuando se remueve la condici´on (if). 85 5.1. M´etodo de Gauss-Seidel en paralelo; iteraciones para converger. . . . . . . . . . . . . 100 5.2. Convergencia de Gauss-Seidel vs Jacobi. . . . . . . . . . . . . . . . . . . . . . . . . . 105 xiii
  • 14.
  • 15. Resumen El presente trabajo de tesis aborda la creaci´on de algoritmos paralelos para la soluci´on num´eri- ca de sistemas de ecuaciones lineales mediante esquemas iterativos de tipo Jacobi y Gauss-Seidel; con especial ´enfasis en el rendimiento y la escalabilidad. Este documento se centra en dos aspec- tos principales. En un primer momento, estudiamos la implementaci´on de t´ecnicas avanzadas de programaci´on para maximizar el rendimiento en ejecuciones seriadas. Una de las t´ecnicas permite utilizar m´odulos de procesamiento vectorial del procesador con la finalidad de realizar varias ope- raciones a la vez; es decir, conseguir paralelismo a nivel de datos (conocido como SIMD). Tambi´en se utilizan caracter´ısticas del compilador GCC para optimizar el c´odigo y catapultar el rendimiento serial de estas primeras funciones. En un segundo momento, se realiza un estudio exhaustivo de cada uno de los m´etodos que permitan escribir funciones que realmente puedan ser ejecutadas en m´as de un n´ucleo utilizando el API llamada OpenMP apoyado con los resultados de las t´ecnicas utilizadas (Bandera de compilaci´on, Loop unrolling, SIMD). En general con el estudio realizado observamos una escalabilidad lineal de dos a cuatro procesadores. Por otro lado cuando empleamos ocho procesadores se observa un aumento de 5.4x. xv
  • 16.
  • 17. Cap´ıtulo 1 Introducci´on Una de las herramientas m´as valiosas para la resoluci´on de problemas pr´acticos de Ingenier´ıa son las computadoras digitales mediante la utilizaci´on de m´etodos num´ericos. En un n´umero significativo de esos problemas s´olo se puede obtener una soluci´on aproximada, a esto se debe la importancia del estudio de la rama de las matem´aticas llamada an´alisis num´erico. Esta rama involucra el estudio de m´etodos num´ericos. El desarrollo de ´estos esquemas es notablemente influenciado y determinado por las computadoras, las cuales permiten realizar los c´alculos de manera veloz, confiable y sobre todo flexible. En la actualidad la computadora es una herramienta indispensable para las actividades coti- dianas, escolares, de oficina y cient´ıficas. Con necesidades cada vez m´as complejas, es por ello que se busca que las aplicaciones puedan realizar los c´alculos lo m´as r´apido posible aprovechando los recursos del equipo con la mayor eficiencia posible. En el pasado para cubrir con las necesidades del mercado se incrementaba la velocidad del procesador, aumentando el n´umero de transistores al circuito integrado. Como lo previ´o Gordon Moore, en la actualidad, ya no es posible disminuir el tama˜no de los transistores. Para compensarlo se han construido procesadores que tienen m´as de un n´ucleo de procesamiento (2, 4, 8, 12). Las computadoras de uso general que est´an en el mercado al momento de la realizaci´on del presente trabajo cuentan con procesadores paralelos, es decir tienen m´as de un n´ucleo de procesamiento. Esta cualidad indica que el c´omputo en paralelo est´a a disposici´on de todos. Cuando la arquitectura del hardware de las computadoras pas´o a ser paralelo se cre´o la necesidad de desarrollar aplicaciones que aprovechen ´estas caracter´ısticas. La incorporaci´on de n´ucleos de 1
  • 18. 2 Cap´ıtulo 1. Introducci´on procesamiento tienen el fin de que las aplicaciones se ejecuten m´as r´apido. Para ejemplificar el problema sup´ongase lo siguiente: se quiere extraer el agua de un tanque que tiene 1, 000 m3 para ello se utiliza una bomba que extrae 250 m3 del l´ıquido por cada hora de trabajo. Esta m´aquina terminar´a su tarea en 4 horas. Si en un momento se aumenta 7 bombas m´as para hacer un total de 8, la tarea ser´a concluida en apenas 30 minutos, con ello se redujo el tiempo del proceso. Esto refleja la importancia del c´omputo en paralelo. Con lo ya mencionado el c´omputo en paralelo es la soluci´on a problemas contempor´aneos. Cabe mencionar que en la actualidad la mayor´ıa de las aplicaciones son seriales, es decir se ejecutan solo en uno de los n´ucleos; entonces estos programas no est´an aprovechando al m´aximo los recursos con los que cuenta el equipo. Para contrarrestarlo se fomenta el deseo de escribir c´odigos que puedan ejecutarse en paralelo. Una pregunta que surge con lo mencionado; ¿En qu´e nos beneficia la programaci´on en paralelo? La respuesta es por dem´as sencilla. En el mundo de la industria manufacturera se realizan procesos de control de calidad, en los cuales se recurre a la simulaci´on de eventos mediante computadoras. Estas medidas son cada d´ıa m´as frecuentes. Un ejemplo m´as que evidente ocurren en la industria automotriz en la simulaci´on de sus prototipos frente a las colisiones. Hacer estas pruebas en f´ısico representa un costo econ´omico muy representativo; es por ello que se recurre a la simulaci´on del evento con resultados fidedignos. Para obtener estos resultados tan realistas se deben tomar en cuenta muchas variantes que influyen en los resultados del proceso, todo esto aumenta la complejidad de operaciones en modelo del suceso. El costo computacional de un modelo depende del grado de complejidad operacional. Con ello es concluyente que estas simulaciones deben ser resueltas con programaci´on en paralelo, para reducir los tiempos de simulaciones y as´ı reducir el ciclo de lanzamiento de los nuevos modelos; lo cual es primordial para la generaci´on de utilidades de la industria automotriz. Motivaci´on La principal motivaci´on del presente proyecto consiste en explotar al m´aximo lo recursos que ofrecen las computadoras; mediante tecnolog´ıas para la programaci´on en paralelo. En los labores de la ingenier´ıa y en la ciencia en general se formulan problemas mediante modelos matem´aticos y son tratados num´ericamente, ello conduce frecuente a resolverlos por sistemas de
  • 19. Cap´ıtulo 1. Introducci´on 3 ecuaciones lineales. Como es bien sabido esta tarea es muy demandante en tiempo de c´alculo. En virtud de ello y con base a la tendencia del an´alisis num´erico es inherente que sean resueltos con aplicaciones computacionales paralelas. Para la resoluci´on de sistemas de ecuaciones lineales existen dos tipos de m´etodos; directos e iterativos. Los m´etodos directos son utilizados para sistemas hasta de pocos miles de nodos debido a su orden de complejidad; ocasionando que sea imposible el resolverlo por cuestiones de tiempo. Por otra parte los m´etodos iterativos se utilizan para sistemas con una mayor cantidad de nodos en virtud de su orden de complejidad que es menor a la de los directos. Dentro de los m´etodos iterativos se encuentran el de Jacobi y Gauss-Seidel que son los dos pilares fundamentales. En la presente tesis se estudia el dise˜no de dos algoritmos paralelos que implementen los esquemas de Jacobi y Gauss- Seidel. En la literatura existen algoritmos iterativos paralelos reportados, sin embargo no existe c´odigo fuente por ello en el presente documento se d´a ´enfasis al desarrollo de ´estos algoritmos desde un punto de vista pr´actico con la finalidad de proporcionar ese c´odigo fuente. En la literatura hemos encontrado distintos modelos matem´aticos y esquemas en paralelo con OpenMP para la resoluci´on de sistemas lineales de ecuaciones [21, 26, 35, 36]. Sin embargo, se enfocan principalmente a sistemas ralos o esparcidos y tipo QR o de Cholesky. Esto se debe princi- palmente a que las discretizaci´on de ecuaciones diferenciales parciales (EDP) esta basada principal- mente en los m´etodos de elemento finito, volumen finito y diferencia finita los cuales generan este tipo de matrices. En el desarrollo profesional de m´etodos num´ericos se busca la innovaci´on para poner a disposici´on el nuevo software. Existen una gran variedad de librer´ıas p´ublicas para la optimizaci´on de c´odigo, ejemplos son BLAS (Basic Linear Algebra Subprograms) y LAPACK (Linear Algebra Package) que permiten la optimizaci´on para programas secuenciales. Dentro de las arquitectura multicore encontramos en el top las librer´ıas espec´ıficas Intel R Math Kernel Library, CUBLAS y CULA de CUDA R ; est´an altamente optimizadas para sus respectivas arquitecturas de hardware. En general, el uso de estos paquetes de optimizaci´on no son utilizadas en el desarrollo del software comercial, excepto para la construcci´on de programas muy especializados o en proyectos que se encargan de aglomerar todas estas optimizaciones como por ejemplo PLASMA (Parallel Linear Algebra Software for Multiprocessor Architectures). Proyectos como FLAME (Formal Linear Algebra Methods Environment) y PLASMA reflejan
  • 20. 4 Cap´ıtulo 1. Introducci´on una fuerte tendencia de encapsular y abstraer el c´odigo lo que facilita el trabajo del programador. En el caso de FLAME se abstrae el hardware dando mayor portabilidad a estas aplicaciones; haciendo transparente el hardware, lo que permite ejecutar una implementaci´on en cualquier arquitectura. Adem´as permite utilizar todos los recursos disponibles CPU y GPU. Al abstraer el c´odigo se aumenta la dificultad para la optimizaci´on m´as espec´ıfica de las apli- caciones. Adem´as la falta de c´odigo fuente que pueda ser analizado y/o modificado; limita la parte acad´emica. Estas librer´ıas se asemejan a las “cajas negras” porque no sabemos que hay dentro y por tanto no aprendemos de ellas. Lo anterior dicho, motiva que el presente trabajo se dirija al estudio e implementaci´on de los dos pilares de los m´etodos iterativos, con herramientas p´ublicas; con fines acad´emicos. Esto se debe a que el estudio de los m´etodos iterativos de Jacobi y Gauss-Seidel tiene fines did´acticos y conforma la base de estudio para las t´ecnicas modernas de m´etodos num´ericos. En la actualidad el software especializado y la investigaci´on de frontera emplean m´etodos proyectados sobre subespacios de tipo Krylov[1, 2, 16, 22, 38], ejemplos de software especializado son las librer´ıas de Portable Extensible Toolkit for Scientific computation (PETSc) con implementaciones paralelas [4, 34, 42]. El estudio de ello est´a fuera del alcance de la presente memoria. Objetivo general La presente tesis tiene como objetivo el desarrollo de esquemas iterativos en paralelo con OpenMP para la soluci´on num´erica de sistemas de ecuaciones lineales. Para ello emplearemos una computadora con arquitectura de tipo multi-n´ucleo con memoria compartida y utilizamos el lenguaje de programaci´on C. Objetivos particulares A continuaci´on se listan los objetivos espec´ıficos que ser´an tratados durante la realizaci´on del presente documento: 1. Dise˜nar e implementar el m´etodo de Jacobi y Gauss-Seidel en paralelo para resolver sistemas de ecuaciones lineales. 2. Incrementar el rendimiento computacional mediante t´ecnicas avanzadas de programaci´on.
  • 21. Cap´ıtulo 1. Introducci´on 5 3. Medir el desempe˜no de los algoritmos dise˜nados para cuantificar los beneficios del paradigma de programaci´on. 4. Medir la escalabilidad de los algoritmos dise˜nados en computadoras multi-n´ucleo. 5. Crear un biblioteca de funciones que permitan resolver num´ericamente sistemas de ecuaciones lineales en paralelo para computadoras SMP. Al t´ermino de la presente tesis se habr´an cumplido con los objetivos planteados; los cuales pondr´an en evidencia los beneficios mediante el incremento del rendimiento por paralelizar m´etodos num´ericos. Con los resultados obtenidos se busca motivar la incipiente tendencia de generalizar la programaci´on en paralelo. La estructura del presente trabajo de tesis est´a organizada en seis cap´ıtulos que se describen a continuaci´on. En el primer cap´ıtulo, el presente, se describen los objetivos que permitir´an llevar a buen t´ermino el proceso de elaboraci´on de la presente memoria. Tambi´en se mencionan las razones que dan importancia a este estudio. Enseguida, en el tema 2 se plantea un marco te´orico que le permita al lector familiarizarse desde un punto de vista general, con los conceptos que se tratan durante el restos de los cap´ıtulos. Aunado a ello se realiza una breve descripci´on de las t´ecnicas y herramientas tecnol´ogicas que ser´an utilizadas. Se indican temas de vital importancia para la evaluaci´on de algoritmos en paralelo como lo son Speed-up, Ley de Amdahl y Escalabilidad paralela, as´ı como la representaci´on de los n´umeros reales en la computadora. Tambi´en se da un breve introducci´on que intuye a la comprensi´on del error en los m´etodos num´ericos. En el cap´ıtulo 3 tratamos uno de los problemas m´as b´asico pero de importancia muy relevante, el Producto matriz-vector. Se pone un especial cuidado en el estudio de ´este tema por representar un proceso muy demandante de tiempo de c´alculo. Se emplean modernas t´ecnicas de programaci´on como Loop unrolling y procesamiento vectorial con Intel MMX R para explotar nuevas caracter´ısti- cas de los microprocesadores; para determinar cual representa la mejor opci´on en paralelo. Cabe se˜nalar que en este bloque se estudia el C´alculo del residual una t´ecnica utilizada como condici´on de paro en los esquemas iterativos. Posteriormente en el cap´ıtulo 4 se estudia el M´etodo iterativo de Jacobi, en primer lugar se tratan algunos de los m´etodos directos para la solucion de sistemas lineales de ecuaciones m´as conocidos,
  • 22. 6 Cap´ıtulo 1. Introducci´on Regla de Krammer, Eliminaci´on de Gauss-Jordan y la Factorizaci´on LU para determinar los pros y contras de ambas categor´ıas (m´etodos directos e iterativos). Despu´es se realiza una descripci´on del esquema y consecuentemente la programaci´on. Con el ´unico fin de aumentar el rendimiento se realiza una serie de optimizaciones basadas en los resultados del tema anterior. Al final de este cap´ıtulo se realiza una evaluaci´on exhaustiva que arroja resultados muy concretos con respecto a las modificaciones realizadas en cada uno de los subtemas. En el cap´ıtulo 5 tratamos el M´etodo Iterativo de Gauss-Seidel (G-S), en primer lugar se da una descripci´on del m´etodo con vistas hacia la programaci´on del mismo. En segundo lugar se implementa OpenMP prestando especial antenci´on en la dependencia de operaciones a las que esta sujeto G-S. En un tercer momento se realiza una comparaci´on con diferencias finitas para medir convergencia de Jacobi y G-S, lo cual permita enmarcar las diferencias te´oricas de ambos. Finalmente en el cap´ıtulo 6 mostramos las conclusiones generales y el trabajo a futuro.
  • 23. Cap´ıtulo 2 Marco Te´orico 2.1. M´etodos num´ericos En palabras de Chaillou [9] son las t´ecnicas mediante las cuales es posible formular problemas de manera que puedan resolverse utilizando operaciones aritm´eticas. Es importante el estudio de los m´etodos o esquemas num´ericos porque representan una herra- mienta importante para el an´alisis y dise˜no de algoritmos que permiten la resoluci´on de problemas de la ciencia. Existe una extensa gama de esquemas num´ericos para la resoluci´on de gran parte de los problemas. Sin embargo, con el mismo m´etodo no se puede resolver todos problemas; por ello es indispensable el an´alisis de un grupo de candidatos con el fin de determinar cual de ellos es el m´as indicado para el problema que se est´e estudiando. Como menciona Penad´es [33] con la aparici´on de los multiprocesadores se presenta un nuevo reto, adecuar los antiguos algoritmos para las nuevas tecnolog´ıas; entre las que destaca la computaci´on matricial. Pero esta nueva tendencia tambi´en sugiere y motiva la b´usqueda de m´etodos nuevos que se adecuen mejor a la vanguardia tecnol´ogica con el fin de aumentar el rendimiento computacional para la resoluci´on de ciertos problemas. 2.2. Modelaci´on matem´atica Una definici´on muy simple es la proporcionada por Chaillou en [9] la cual dice: un modelo matem´atico es una formulaci´on o ecuaci´on que expresa las caracter´ısticas fundamentales de un 7
  • 24. 8 Cap´ıtulo 2. Marco Te´orico sistema o proceso f´ısico en t´erminos mat´ematicos. Esto nos indica que un modelo corresponde a una explicaci´on de un proceso de un forma simple, lo cual conduce a resultados predecibles. Los modelos matem´aticos sirven para obtener cierta informaci´on de un problema que se est´e estu- diando; si bien en cierto que frecuentemente contienen errores que ponen en evidencia componentes esenciales de una realidad compleja [9]. Existe un clasificaci´on de tipos de modelos matem´aticos en funci´on a su ´area de estudio; estos temas no son tratados con la profundidad necesaria debido que no es la finalidad del presente trabajo. 2.3. Los n´umeros en la computadora En el mundo real existen varios sistemas num´ericos entre los que destacan los sistemas ar´abico, binario, octal, hexadecimal. El m´as utilizado por todo ser humano es el ar´abico o mejor conocido como decimal. Por otro lado el sistema num´erico de las computadoras es el binario para describir los estados encendido (1) apagado (0); as´ı un d´ıgito binario o bit es la unidad de informaci´on m´as b´asica en la computadora. Debido a que los humanos utilizamos el sistema decimal y las computadoras el binario se hizo necesario realizar conversiones de n´umeros entre ellos. Fue Gottfried Leibniz (1646–1716) quien desde siglos pasados lo hab´ıa resuelto. Leibniz argument´o que cualquier n´umero entero puede ser representado por una serie de unos y ceros. En documentos como [29, 37] se emplea el formato mantisa/exponente para representar n´umeros binarios tomando la idea de la notaci´on cient´ıfica. Como se muestra en (2.1) 1010 = 10.010 × 100 = 1.010 × 101 = 0.110 × 102 10102 = 1010.02 × 20 = 101.02 × 21 = 10.102 × 22 (2.1) El manejo de los n´umeros en la computadora es mediante la notaci´on cient´ıfica del sistema binario.1 Sin embargo, los formatos que se utilizan permiten representar los n´umeros como en (2.1) sin escribir de forma expl´ıcita el punto decimal. El formato signo/mantisa/exponente se expresa 1 El sistema num´erico de la computadora se debe a la arquitectura de la misma. Recordando que existen compu- tadoras binarias, octales y hexadecimales. Las computadoras comerciales son binarias.
  • 25. 2.3. Los n´umeros en la computadora 9 como una palabra con las siguientes caracter´ısticas para un valor x x = signo s e1e2e3 . . . ek exponente mantisa m1m2m3m4 . . . mn (2.2) Sabiendo que cuando el bit de s est´e encendido se trata de un n´umero negativo. Tomando como referencia (2.2) la longitud de la palabra que equivale a (1 + k + n) donde los valores de k y n son definidos por el dise˜nador y 1 representa el bit s del signo; para definir los valores de k y n es imprescindible pensar en la exactitud con lo que se representar´an los n´umero reales, as´ı como analizar el costo computacional que representa. Para ejemplificar tomaremos un formato de 8 bits como sigue x = signo b1 b2 b3 b4 exponente mantisa b5 b6 b7 b8 (2.3) Partiendo de (2.3) representemos 1010 = 10102 con cuatro bits. Con el formato en cuesti´on puede ser representado como sigue x = sig 0 0 0 1 exp man 1 0 1 0 = 10102 × 21 = 1010 Ahora tomando un valor mayor por ejemplo 6410 = 10000002, lo cual en notaci´on cient´ıfica se expresa como 1000 × 23 y se representa como sigue x = sig 0 0 1 1 exp man 1 0 0 0 = 10002 × 23 = 6410 Para representar un n´umero negativo por ejemplo −1810 se realiza lo siguiente x = sig 1 0 1 0 exp man 1 0 0 1 = −1 × 10012 × 22 = −1810 Como se puede observar el valor m´as grande y el menor que se pueden representar son xmax = 0 111 1111 = 1 × 11112 × 27 = 192010 xmin = 1 111 1111 = −1 × 11112 × 27 = −192010
  • 26. 10 Cap´ıtulo 2. Marco Te´orico Para exponer el formato de (2.3) ante una situaci´on cotidiana en el c´alculo intensivo tomemos el n´umero 2710 = 110112 como sabemos tenemos s´olo cuatro bits de mantisa y este nuevo n´umero tiene 5 bits, lo cual tomamos los 4 bits m´as significativos y tenemos lo siguiente x = 1 0 0 1 0 2 13 1 1 0 1 = 1 × 11012 × 22 = 2610 Ello no es equivalente con el n´umero que se trata de representar y el siguiente ser´ıa x = 1 0 0 1 0 2 14 1 1 1 0 = 1 × 11102 × 22 = 2810 Con ello es m´as que evidente que no se puede representar el n´umero 27 utilizando el formato de (2.3). Pero ´esto no significa que sea el ´unico. En la figura 2.1 se ilustra los n´umeros que se pueden representar con ´este formato. Las l´ıneas verticales (|) indican la posici´on en la linea recta de cada uno de los n´umeros, por lo que no existen n´umeros en los espacios entre las l´ıneas. Como se puede observan la mayor densidad de n´umeros est´a en los aleda˜nos de cero y conforme nos alejamos la densidad disminuye. −2000 −1500 −1000 −500 0 500 1000 1500 2000 Figura 2.1: Distribuci´on de n´umeros enteros con formato predefinido. Bien, con el formato de (2.3) se han representado n´umeros enteros pero con un aspecto impor- tante, existen n´umeros que pueden ser representados de m´as de una forma lo cual no es bueno.2 Con lo anterior se han representado n´umeros enteros de una forma no ortodoxa pero nos brinda un primer acercamiento para representar n´umeros reales. Tomando la idea del formato (2.3) y con base a Hidalgo [19, Ap´endice E] se realiza una modificaci´on simple que se expresa en (2.4) x = signo b1 b2 b3 b4 exponente bimp b5 b6 b7 b8 mantisa (2.4) donde la mantisa trata la parte fraccionaria del n´umero [ver (2.1)] y bimp es un bit impl´ıcito que 2 Nota: con este formato se han representado n´umeros enteros ´unica y exclusivamente para exponer el formato mantiza/exponente y no representa el verdadero formato para la representaci´on de enteros en la computadora.
  • 27. 2.3. Los n´umeros en la computadora 11 act´ua as´ı si 0 < exp < 7, entonces bimp = 1. si exp = 0 y mantisa = 0, entonces bimp = 0. Tambi´en se establece la necesidad de representar los exponentes con signo por ello se indica lo siguiente si 0 < exp < 7, entonces exp = exp - 3. si exp = 0 y mantisa = 0, entonces exp = -2. Con base a ello se establece que para un valor x se obtiene como sigue x = (−1)s · 2exp−3 · 1.mantisa para 0 < exp < 7 y x = (−1)s · 2−2 · 0.mantisa para exp = 0 donde exp es el valor del exponente, s el signo y [(0 : 1).mantisa] es el bit impl´ıcito (bimp) y el valor de las mantisa (b5b6b7b8). La idea anterior hace que el n´umero 010110012 con el formato (2.4) se convierte en decimal de la siguiente forma x = s=0 0 signo exp=5 1 0 1 exponente bimp.mantisa=1.5625 bimp 1 0 0 1 mantisa = (−1)0 · 25−3 · 1.5625 = 6.2510 Ahora se convierten x1 = 111010102 y x2 = 000001102 a decimal como sigue x1 = 11101010 = (−1)1 · 26−3 · 1.625 = −1310 x2 = 00000110 = (−1)0 · 2−2 · 0.375 = 0.0937510 Como se puede observar el cambiar el formato de representaci´on de los n´umeros hace que los valores al convertirlos a decimal sea distinto. En la figura 2.2 se ilustra la distribuci´on de los n´umeros representables con ´este formato, donde se puede observar que la densidad de la ret´ıcula cercas del cero es muy alta. Conforme nos alejamos de cero la cantidad de n´umeros representables disminuye.
  • 28. 12 Cap´ıtulo 2. Marco Te´orico −16−15.0 −10 −5 0 5 10 15 16 Figura 2.2: Distribuci´on de n´umeros reales con formato predefinido. Con los dos ejemplos planteados se tiene una idea m´as concreta de la representaci´on de los n´umeros mediante una serie de bits. En ambos casos se utiliz´o 8 bits como longitud de palabra. Sin embargo el resultado es distinto pero con similitudes. La mayor densidad de n´umeros representables est´an cercas del cero y en los extremos existe una menor densidad. En el primer ejemplo se repre- sentaron n´umeros enteros con un rango (-1920,1920) mientras que en el segundo se representaron n´umeros reales en un rango de (-15.5,15.5). Es evidente la imposibilidad de representar la totalidad de los n´umeros con una longitud de palabra finita. La representaci´on de los num´eros reales (n´umeros con fracci´on de entero) en la computadora fue en su momento un tema herm´etico en cada una de las empresas manufactureras de las mismas. El hermetismo era a tal grado que las empresas ten´ıan su propio protocolo, lo que limitaba la por- tabilidad. Como menciona Severance et al.[37] esos formatos para representar n´umeros en punto flotante se enfocaron primordialmente en la exactitud y no tanto en un balance entre exactitud y velocidad. Con base a Null et al.[29] la soluci´on para ello lleg´o en 1985 por parte del Instituto de Ingenieros El´ectricos y Electr´onicos (IEEE por sus singl´as en ingl´es) que produjeron un est´andar para representar n´umero en punto flotante para simple y doble precisi´on, el est´andar se titul´o “IEEE 754-1985 Standard for Binary Floating-Point Arithmetic”. El nuevo est´andar tuvo sus inicios du- rante el dise˜no del coprocesador para punto flotante Intel i8087 [37]. Pasaron m´as de 10 a˜nos para que los grandes fabricantes adoptaran el IEEE 754 de forma generalizada en la contrucci´on de computadoras. En la figura 2.3 se ilustra como se representan dos tipos de n´umeros definidos en el est´andar de IEEE. Como se puede observa el formato es signo/exponente/mantisa al igual que en el segundo ejemplo. (A) es un formato que en el lenguaje de programaci´on C se le conoce como float donde se tienen 23 bits de mantisa y 8 de exponente. (B) corresponde la primitiva double en el lenguaje de programaci´on C que corresponde a 52 bits de mantisa y 11 bits; es m´as com´unmente conocido como doble precisi´on cient´ıfica. Seg´un Severance et al.[37] en precisi´on simple el menor n´umero normalizado es 1.2E-38 y
  • 29. 2.3. Los n´umeros en la computadora 13 Figura 2.3: Modelo para representaci´on de n´umeros en punto flotante IEEE 754. 2.2E-308 con doble precisi´on. Mientras que el n´umero m´as grande para simple y doble es 3.4 E+38 y 1.8 E+308 respectivamente. Ello nos brinda un marco de trabajo m´as amplio y con errores m´as peque˜nos. Con base en Null y Severace [29, 37] ´este est´andar incorpora NaNs (Not a Number, no es n´umero) cuando el exponente sea igual a 255 y la mantisa no sea cero (exp = 255 y mantisa = 0), los NaNs son utilizados como indicadores de error. Tambi´en incluye dos infinitos (−∞ y +∞) que se presentan cuando el exponente es 255 y la mantisa es 0, positivo cuando el signo es 0 y negativo cuando es 1. Al igual que en el caso de infinito, se tienen dos ceros uno positivo y otro negativo. En el presente documento se utilizan n´umero de precisi´on simple como el formato (A) de la figura 2.3 mientras no se indique lo contrario. Como se ha especificado ese formato tiene una longitud de 32 bits para la representaci´on de los n´umeros por lo cual se pueden representar la siguiente cantidad de n´umeros (n) n = 232 = 4 294 967 296 De acuerdo con la definiciones anteriores para el caso donde el exponente es igual a 255 todos los n´umeros son considerados NaNs, excepto cuando la mantisa es 0; este caso se presenta dos veces para −∞ y +∞ respectivamente. Con base a ello podemos obtener la cantidad de NaNs que se representan NaNs = 2 × 223 − 2 = 16 777 214 Para obtener el total de n´umero representables con precisi´on simple sustraemos lo NaNs del
  • 30. 14 Cap´ıtulo 2. Marco Te´orico total n Total de reales representables = 4 294 967 296 − 16 777 214 = 4 278 190 082 De antemano sabemos que existe una diferencia entre el cero y el primer n´umero que puede ser representado, haciendo el n´umero m´as peque˜no posible tendremos el menor n´umero distinto de cero que puede ser representable como sigue x = signo 0 exponente 000 0000 0 mantisa 000 0000 0000 0000 0000 00012 = (−1)0 × 2−126 × 2−23 = 2−149 x 1.4 × 10−45 Como menciona Nakamura [28] al n´umero representable inmediatamente despu´es de la unidad se le conoce como el epsil´on de la computadora el cual nos permite calcular el n´umero real representable inmediatamente posterior; ´esto se obtiene al multiplicar el epsil´on por el real y sumarlo a ese real. Para calcular el epsil´on se puede utilizar el fragmento de c´odigo de la figura 2.4. En ese c´odigo s´olo hace falta indicar el tipo de variable que es “epsilon” (simple o doble). El ´ultimo valor impreso corresponde al epsilon de la computadora. Para una ejecuci´on con precisi´on simple (float) se tiene epsil´on 1.1921 × 10−7, en el otro caso (double) epsilon 2.2204 × 10−16. Cabe se˜nalar que el denominador para calcular el epsil´on es dos porque la computadora empleada es binaria. C´alculo del epsil´on epsilon = 1; while(1+epsilon>1) { printf("%fn",epsilon); epsilon = epsilon/2; } Figura 2.4: C´alculo de epsil´on de la computadora. Para corroborar que efectivamente el epsil´on de la computadora sirve para calcular la distancia entre un n´umero real representable y su inmediatamente consecuente tomaremos el siguiente ejemplo x1 = signo 0 exponente 000 0000 1 mantisa 100 0000 0000 0000 0000 00002 = (−1)0 × 21−127 × 1.5 x1 = (−1)0 × 2−126 × 1.5 1.7632415262 × 10−38
  • 31. 2.3. Los n´umeros en la computadora 15 Ahora multiplicamos x1 por el epsil´on para obtener la diferencia (y) tomando m´as cifras signi- ficativas para disminuir el error x1 1.7632415262 × 10−38 y epsion = 1.1921 × 10−7 y = x1 × epsilon y 1.7632415262 × 10−38 × 1.1921 × 10−7 y 2.1019602234 × 10−45 xα 2 = x1 + y = 1.7632415262 × 10−38 + 2.1019602234 × 10−45 xα 2 = 1.7632417364 × 10−38 Posteriormente se calcula el valor para x2 tomando el siguiente n´umero de la serie como sigue x2 = signo 0 exponente 000 0000 1 mantisa 100 0000 0000 0000 0000 00012 = (−1)0 × 21−127 × 1.5 + 2−23 x2 1.7632416664 × 10−38 Con estos resultados podemos decir que xα 2 = x2, donde el error se debe en gran medida a la cantidad de cifras significativas tomadas en cuenta. Con base a los temas anteriores es concluyente que la distancia entre un n´umero representable y su inmediatamente posterior crece conforme se aleje de cero. Figura 2.5: Rango de n´umero IEEE-754 precisi´on simple. En la figura 2.5 se muestra el rango en el cual podemos representar n´umeros con el est´andar IEEE-754. Siempre pensando que la mayor densidad de n´umeros est´an aleda˜nos al cero. Visualizar el rango nos permite mapear los n´umeros para no caer en valores underflow u overflow e inclusive elegir el tipo de precisi´on con la finalidad de tener una mayor exactitud. La incapacidad para poder representar la totalidad de los n´umeros conlleva a tener resultados
  • 32. 16 Cap´ıtulo 2. Marco Te´orico num´ericos aproximados. Ella es como una enfermedad con la que se nace; sino es tratada puede ser letal. 2.4. Tipos de error en m´etodos num´ericos En an´alisis num´erico un tema de vital importancia es el estudio del error en un resultado num´erico. Esto se debe principalmente a que los datos de entrada no son exactos; tambi´en influye que los m´etodos num´ericos introducen errores de varios tipos; por ello los resultados son aproximados. Como menciona Chaillou [9] en muchos casos profesionales los errores son costosos y en algunos letales. A continuaci´on se presentan los principales errores introducidos por los esquemas num´ericos. Error de redondeo: este tipo de error se presenta debido a la cantidad de cifras significativas que se asignan para las operaciones. En t´erminos de computaci´on este error es muy com´un y depende de la exactitud de la primitiva utilizada (precisi´on simple, doble precisi´on, etc.), para la representaci´on de los n´umeros reales en la m´aquina. Para tener una idea m´as clara tomemos en cuenta un n´umero real x con k cifras en punto flotante, lo cual se representa como x = 0.d1d2 . . . dk × Bn donde B es la base del sistema dado que ´unicamente se tienen t cifras significativas, siendo t < k, el n´umero real ser´a repre- sentado como sigue ˜x = 0.d1d2 . . . dt × Bn con ello se han perdido k − t cifras del valor real de x con lo cual ˜x es una aproximaci´on de x. A continuaci´on se muestra un ejemplo x = 1.2345678 con t = 4 se tiene ˜x = 1.2345 Este error es inherente a la computaci´on como consecuencia de la imposibilidad de representar totalmente los n´umeros reales. Para disminuir este error se aumenta el tama˜no de la mantisa de bits (aumentar k), as´ı se tendr´an m´as cifras para la representaci´on de los n´umeros; pero ello repercutir´a en un aumento en el costo de c´alculo. Error por truncamiento: este tipo de error aparece como consecuencia de las reglas de cifras
  • 33. 2.4. Tipos de error en m´etodos num´ericos 17 significativas que se establezcan, donde a partir de t cifras el valor se redondea al extremo pr´oximo. Por ejemplo tomando tres cifras significativas (en punto flotante) de x para obtener ˜x como sigue x1 = 23.333333 se redondea a ˜x1 = 23.333 x2 = 23.333690 se redondea a ˜x2 = 23.334 En problemas aplicados a m´etodos num´ericos el error de truncamiento surge al “truncar” una serie de operaciones. Citando textualmente a Nakamura [28] el error de truncamiento se debe a las aproximaciones utilizadas en la f´ormula matem´atica del modelo. Un claro ejemplo de ello es la Serie de Taylor para mostrarlo veamos la expresi´on de esta serie f(x + h) = f(x) + hf (x) + h2 2! f (x) + h3 3! f (x) + · · · + hm m! f(m) (x) + · · · (2.5) En la pr´actica se trunca (2.5) debido a que es imposible utilizar un n´umero infinito de t´erminos. A continuaci´on se representa una serie truncada de Taylor hasta despu´es del t´ermino de orden m f(x + h) = f(x) + hf (x) + h2 2! f (x) + h3 3! f (x) + · · · + hm m! f(m) (x) + O(hm+1 ) (2.6) donde O(hm+1) representa el error por el truncamiento. La Serie de Taylor representa un punto de partida para la obtenci´on de m´etodos num´ericos. En el polinomio de Taylor (2.6) el error de truncamiento se reducir´a conforme m → ∞. Como menciona Nakamura [28] calcular el valor exacto del error de un polinomio de Taylor es pr´acticamente imposible es por ello que se representa con una aproximaci´on que corresponde O(hm+1). En general el error de truncamiento nace al representar una serie infinita con otra serie finita de operaciones. Error absoluto: este error corresponde a la diferencia absoluta entre un resultado exacto y otro aproximado. Esto se representa como EA = |x − ˜x| (2.7)
  • 34. 18 Cap´ıtulo 2. Marco Te´orico donde x es el resultado exacto y ˜x es el aproximado. Error relativo: consiste en normalizar el error respecto al resultado exacto. Lo cual se expresa como ER = |x − ˜x| |x| (2.8) donde x es el resultado exacto y ˜x es el aproximado. Si multiplicamos el error relativo por cien se obtiene el error porcentual del resultado aproximado. 2.5. El lenguaje de programaci´on C El lenguaje C es de alto nivel pero mantiene caracter´ısticas de bajo nivel. De alto nivel porque es estructurado, f´acil de aprender pero m´as que nada racional[15]. Y de bajo nivel porque permite trabajar con el lenguaje m´aquinas los bits, registros de la CPU y registros de memoria. Algunas de las caracter´ısticas son la siguientes tomadas del libro de Basurto et al.[6]: Potencia y flexibilidad: C es un lenguaje no tan alejado del lenguaje m´aquina lo cual puede traducirse en un mejor desempe˜no computacional. Otro punto a favor del lenguaje es la flexibilidad para la creaci´on de aplicaciones que van desde modestas aplicaciones de consola a robustos sistemas operativos gr´aficos como UNIX y sus derivados. Popularidad: como la mayor´ıa de los grandes proyectos, el lenguaje C debe su popularidad a la variedad de recursos como compiladores, herramientas y librer´ıas. Portabilidad: gracias al est´andar ANSI C un programa escrito en C puede ser compilado y ejecutado en diferentes arquitecturas con pocos o nulos cambios. Sencillez: el lenguaje C es muy f´acil de aprender por contar con un n´umero muy reducido de palabras reservadas. Estructura y modularidad: C es el primer lenguaje de programaci´on bien estructurado que permite la agrupaci´on de c´odigo en funciones; que posteriormente puede ser reutilizado. El conjunto de cualidades anteriormente descritas coadyuvan para que este lenguaje cuente con el soporte de varias interfaces que permitan la programaci´on en paralelo y juntos sean una herramienta importante para el c´omputo cient´ıfico.
  • 35. 2.6. Programaci´on en paralelo 19 En el presente documento se utiliza lenguaje C en su totalidad. Esto se debe a las caracter´ısticas que son sencillez y racional para la creaci´on de c´odigo; as´ı como la flexibilidad en el manejo de vectores y matrices mediante los apuntadores. La compatibilidad de C con la API OpenMP es el motivo principal por el cual se utiliza este lenguaje de programaci´on. Cabe se˜nalar que FORTRAN es otro lenguaje compatible con ´esta API; no se utiliz´o en este trabajo porque se ten´ıa un mejor dominio del lenguaje C. 2.6. Programaci´on en paralelo Como menciona Pacheco [31] de 1986 a 2002 el incremento del rendimiento en los micropro- cesadores fu´e de 50 % por a˜no; el aumento de la velocidad de los procesadores estuvo sujeta a la densidad de transistores del circuito integrado, cada a˜no se aumentaba en ese mismo porcentaje. Como menciona Petersen et al.[34] esto se debe a una ley formulada por Gordon Moore (uno de los fundadores de Intel) en 1965 conocida como ley de Moore: el incremento de la velocidad de los procesadores deber´a ser duplicada cada dos a˜nos. Por problemas de dise˜no ya es imposible continuar con esa tendencia, por lo cual en el lapso de 2002 a 2005 el aumento de la velocidad se redujo a 20 % anual. Para 2005 la industria de microprocesadores acord´o incrementar el rendimiento con un cambio en el dise˜no; se eligi´o el camino del paralelismo. Esto consiste en dejar de construir procesadores monol´ıticos m´as r´apidos; para centrarse en la construcci´on de circuitos integrados que contengan varios procesadores completos. Con base a Petersen et al.[34] actualmente las computadoras con multiprocesadores y el desarrollo de algoritmos suman un mayor aumento en el rendimiento que el establecido en la ley de Moore; esto habla del poder que le dota al c´omputo ´esta tendencia. Con las medidas tomadas por los industriales se puede cumplir con las nuevas demandas de rendimiento en las diferentes ´areas que lo requieran. Las nuevas tendencias en la contrucci´on de hardware paralelo representa un nuevo reto para los programadores, la realizaci´on de software capaz de explotar las nuevas caracter´ısticas de ´estos recursos electr´onicos. En la actualidad la mayor´ıa del software en el mercado es serial; ello indica que esas aplicaciones ´unicamente explotan una fracci´on de los recursos de la computadora. Durante la realizaci´on de este trabajo se ha observado una fuerte tendencia en la programaci´on de aplicaciones paralelas, ´estos programas son divididos en m´ultiples instancias tantas como n´ucleos
  • 36. 20 Cap´ıtulo 2. Marco Te´orico contenga el sistema. Ello con la finalidad de presentar resultados en el menor tiempo posible. Durante la traducci´on de aplicaciones seriales a paralelas nos encontramos con problemas de adaptaci´on de algoritmos y/o modelos; como menciona Pacheco [31] un algoritmo serial eficiente puede convertirse en uno paralelo ineficiente. Por ello la tarea de los programadores para traducir programas secuenciales en paralelos es dif´ıcil. La programaci´on en paralelo est´a influenciada directamente por la tendencia del desarrollo de hardware denotada por la construcci´on de sistemas f´ısicos. Para la programaci´on en el lenguaje estructurado C existen tres alternativas principales; Message-Passing Interface (MPI, Interfaz de Paso de Mensajes), POSIX threads (Pthreads) y OpenMP. El primero de ellos esta orientado a la programaci´on paralela para memoria distribuida. Los otros dos son utilizados en sistemas con memoria compartida, como diferencia Pthreads al igual que MPI son librer´ıas y definiciones que se usan dentro de programas mientras que OpenMP est´a constituido por una librer´ıa y algunas modificaciones al compilador. Como menciona Petersen et al.[34] OpenMP es m´as f´acil de programar e implementar que Pthreads. En tiempo m´as reciente ha surgido un tipo de c´omputo distinto que consiste en utilizar la tarjeta gr´afica (GPU) para resolver operaciones aritm´eticas. Un ejemplo de ello es la interfaz de programaci´on CUDA propiedad de la empresa Nvidia, ´esto revoluciona la fabricaci´on de hardware en la cual se incluyen miles de procesadores. Cada uno de ellos tiene mucho menores prestaciones de procesamiento que un CPU; sin embargo, juntos le permiten al GPU desarrollar un incremento sustancial de rendimiento comparable e inclusive mejor que la CPU. Al igual que las tres tecnolog´ıas antes mencionadas CUDA trabaja con memoria compartida y distribuida. Una de sus opciones programables es mediante el lenguaje C++. Con base al manual de Nvidia CUDA [30] el modelo de programaci´on de CUDA est´a enfocado al paralelismo masivo, el dise˜no del hardware permite lanzar miles de hilos de ejecuci´on a la vez. En la figura 2.6 extra´ıda de [30, fig.1-3 p´ag.3] se ilustra las diferencias en la construcci´on de los dispositivos. En el caso de la CPU se cuenta con pocas unidades de procesamiento pero con mayores capacidades y requiere mucho control y mucha memoria cach´e. Por otra parte en la GPU se tiene una mayor cantidad de unidades de procesamiento con poco control y poco cach´e; ´esto es lo que permite la ejecuci´on de miles de hilos a la vez. La principal desventaja de CUDA es el marco de ejecuci´on que s´olo se limita a dispositivos compatibles de la marca Nvidia, lo cual limita la popularidad en el uso de ´esta API. Cabe se˜nalar que un proyecto
  • 37. 2.7. OpenMP 21 encabezado por la marca norteamericana Apple llamado OpenCL permite la portabilidad de c´odigo que utilice la GPU; mediante la compilaci´on en tiempo de ejecuci´on. Figura 2.6: Arquitectura de hardware CPU versus GPU. En la figura 2.7 se ilustran las arquitecturas de memoria compartida y distribuida respectiva- mente; en (A) todos los cores-n´ucleos del sistema acceden a una misma memoria principal, con ello todas las unidades de procesamiento pueden acceder a localidades de memoria donde otra uni- dad esta trabajando. Cabe se˜nalar que la memoria principal es de tipo UMA (Memoria de Acceso Uniforme) que permite una comunicaci´on intensiva entre los procesos que son ejecutados en los diferentes n´ucleos. En (B) se muestra un sistema con memoria distribuida, los cuales est´an carac- terizados porque cada una de las unidades-nodos de procesamiento tienen su propia memoria tipo UMA, pero tambi´en pueden acceder a la memoria de cualquier otro nodo. Es preciso indicar que es muy costo acceder a la memoria de un nodo desde otro en t´erminos de tiempo. A ´esto se debe la barrera t´ecnida para no crear secciones de aplicaci´on que mantenga una comunicaci´on intensa siempre y cuando las secciones sean ejecutadas en nodos diferentes. En ´este tipo de aplicaciones es muy importante el papel que jugar´a el sistema de interconexi´on de nodos puesto que es un enorme cuello de botella para el acceso a la memoria distribuida, generalmente se utiliza la fibra ´optica. Hasta este punto se han mencionado algunas de las principales tendencias y caracter´ısticas de la programaci´on en paralelo. Adem´as se indican los motivos por los cuales este paradigma representa el futuro de la computaci´on de alto desempe˜no. 2.7. OpenMP Como menciona Chapman et al. [11], OpenMP es una Interfaz de Programaci´on de Aplicaciones (API) cuyas caracter´ısticas, se basan en esfuerzos anteriores para facilitar la programaci´on paralela
  • 38. 22 Cap´ıtulo 2. Marco Te´orico Figura 2.7: Tipos de memoria en sistemas. de memoria compartida. Las siglas MP denotan “multiprocessing” (multiproceso) lo cual es un sin´onimo de programaci´on paralela de memoria compartida. OpenMP es un acuerdo alcanzado entre los miembros de la Architecture Review Board (ARB) para dar un enfoque port´atil, f´acil de usar y eficaz a la programaci´on paralela de memoria compar- tida. Al contrario de lo que se puedr´ıa pensar OpenMP no es un lenguaje de programaci´on nuevo; por el contrario es la notaci´on que se puede agregar a un programa secuencial en Fortran, C o C++, a las cuales se le denomina directivas o pragmas que son instrucciones pre-procesador. Una implementaci´on adecuada de OpenMP en un programa permitir´a a las aplicaciones benefi- ciarse de la memoria compartida de las arquitecturas paralelas. En ocasiones con pocas modificacio- nes al c´odigo se convierte una aplicaci´on serial en una paralela; en la pr´actica muchas aplicaciones tiene un cierto grado de paralelismo que debe ser explotado. Como menciona Chandra et al.[10], todos los proveedores de computadoras de memoria compartida de alto desempe˜no soportan la fun- cionalidad de OpenMP, pero la portabilidad de aplicaciones ha sido casi imposible de alcanzar. Desde un punto de vista general, una aplicaci´on serial se convierte en paralelo simplemente incluyendo una directiva de OpenMP. Estas directivas van desde constructores de hilos hasta la sincronizaci´on de los mismos para el acceso a los datos compartidos. Pero un punto muy importante es que en la directiva se indica el tipo de reparto de las cargas de trabajo. OpenMP utiliza el modelo fork-join, el cual consiste en que la ejecuci´on de un programa inicia con un hilo llamado maestro. Cuando el proceso llega a una directiva se crea una regi´on paralela con las especificaciones de la misma. La zona paralela se ejecuta sobre un mismo espacio de direcciones lo cual permite compartir las variables declaradas, pero tambi´en declarar informaci´on privada [10,
  • 39. 2.7. OpenMP 23 Figura 2.8: Modelo de OpenMP. 11, 31, 34]. Al finalizar la fracci´on paralela los hilos esclavos se destruyen y continua la ejecuci´on del hilo maestro. En la figura 2.8 se ilustra la ejecuci´on de un programa con una regi´on paralela. Cuando el hilo maestro llega al inicio (etapa fork) de ´esta zona se crean los hilos esclavos y se declaran la variables locales de la zona. Posteriormente se realiza el reparto de cargas de trabajo, para que todos los subprocesos ejecuten el mismo c´odigo. Despu´es de finalizar la ejecuci´on se destruyen las variables locales de la regi´on paralela y todos los hilos acepto el maestro; es la etapa join. Al finalizar la regi´on paralela, el proceso continua una ejecuci´on serial; si m´as adelante existiese otra regi´on paralela el proceso se repite con las condiciones de la nueva directiva. Soporte de compiladores La norma industrial OpenMP es soportando por una gran variedad de compiladores; la mayor´ıa de ellos con fines comerciales. Algunos ejemplos de ellos son: el compilador Oracle C/C++/Fortran de Sun Microsystems Inc, el gigante de los procesadores Intel ofrece su compilador para Windows y Linux con el nombre de Intel C/C++/Fortran, por su parte Microsoft’ brinda el soporte en Visual C++ en su versi´on comercial entre otros.3 Tambi´en existe el compilador GNU GCC que brinda soporte para el API de forma gratuita el cual es propiedad de la comunidad de c´odigo abierto de GNU Project. Por tratarse de un est´andar nos garantiza que el c´odigo no debe ser re-escrito cuando cambiemos el compilador. El compilador GCC implementa OpenMP en la version 4.2.1 o posteriores. En su versi´on 4.3.2 3 La lista completa de compiladores que soporta OpenMP puede ser consultada en el sitio oficial http://www.openmp.org.
  • 40. 24 Cap´ıtulo 2. Marco Te´orico (Agosto de 2008) comenz´o a implementar OpenMP v3.0.4. Las nuevas versiones de GCC las encon- tramos pre-cargadas en la mayor´ıa de las distribuciones Linux (recientes) por ello se convierte en el m´as accesible. Por estas cuestiones los resultados que se muestren en la presente tesis corresponde a c´odigo compilado con GCC v4.2.1. Como se menciona en el manual oficial de GNU GCC v4.2.4 [40] el compilador lleva este nombre por “GNU Compiler Collection” donde se engloba la posibilidad de compilar c´odigo en lenguajes C, C++, Objective-C, Objective-C++, Java, Fortran y Ada. GCC cuenta con un gran n´umero de optimizaci´on para aumentar el rendimiento de las aplicaciones conocidas como banderas de compilaci´on, las especificaciones t´ecnicas de estas banderas no son tratadas en el presente trabajo. Para la evaluaci´on de algoritmos paralelos se utilizan varios par´ametros entre los cuales destacan el La ley de Amdahl, speed-up y el rendimiento computacional. En los temas siguientes se dar´a una breve explicaci´on para llenar el contexto. 2.8. Escalabilidad paralela La Escalabilidad paralela (Parallel Scalability) es el comportamiento de una aplicaci´on cuando un creciente n´umero de hilos (threads o subprocesos) se utilizan para resolver un problema de tama˜no constante. Idealmente, aumentar el n´umero de hilos de 1 a P dar´a un aceleramiento paralelo (speed- up) de p [11]. Como menciona Pacheco [31] se dice que un programa es escalable si al aumentar el n´umero de hilos la eficiencia persiste. Para definir este punto, en primer lugar se toma la ecuaci´on de la eficiencia E E = T1 p · Tp = S p (2.9) donde T1 es el tiempo de ejecuci´on con un n´ucleo, p es el n´umero de procesadores, Tp representa el tiempo de ejecuci´on para p-hilos y S es el speed-up (2.13). En base a lo anterior supongamos que aumentamos k veces el n´umero de procesadores con lo cual se tiene Ekp = T1 kp · Tkp = Skp kp (2.10) Con base a (2.9) y (2.10) podemos determinar si un programa es escalable si E = Ekp. Tomando como idea principal que un programa no puede ser paralizado de forma completa. Idealmente, 4 Esta informaci´on con base la documentaci´on del sitio web oficial http://gcc.gnu.org/gcc-4.3/
  • 41. 2.8. Escalabilidad paralela 25 pensamos que la reducci´on en tiempo de ejecuci´on es proporcional al aumento de hilos-procesadores, en la pr´actica no es com´un que se presente la proporcionalidad, el principal obst´aculo es el acceso a memoria ya que ´esta se encuentra compartida para todos los hilos, y por ende, se da una competencia para el uso de la misma. Aunado a ello estas lo costos derivados por la sincronizaci´on y en general por el manejo de las regiones paralelas. Existen ocasiones donde aumentar el n´umero de hilos se torna contraproducente, se dice que la aplicaci´on tiene un l´ımite de hilos, y a partir de aqu´ı, aumentar´a el tiempo de ejecuci´on conforme aumentemos la cantidad de hilos. Para la evaluaci´on de la escalabilidad de la aplicaci´on se utilizan dos m´etodos: el primero Ley de Amdahl el cual no pone en un contexto real de la escalabilidad te´orica que se puede obtener. En segundo tenemos el speed-up el cual mide las veces que es m´as r´apido un algoritmo paralelo con respecto al serial. Mientras tanto el desempe˜no computacional mide la cantidad de operaciones por segundo de un programa. En los siguientes temas se desarrolla cada uno de ellos. 2.8.1. Ley de Amdahl Como menciona Pacheco [31] fue desarrollada por Gene Amdahl en la d´ecada de 1960. ´Esta ley indica que un programa serial s´olo se puede paralelizar una fracci´on; ello limitar´a muy significati- vamente el speed-up; independientemente del n´umero de unidades de procesamiento. La ley plantea la carencia de poder paralelizar un algoritmo serial de forma completa. S´olo podemos hacer paralelo una fracci´on del c´odigo. Mientras m´as grande sea la fracci´on paralela, el speed-up ser´a mayor para un n´umero creciente de procesadores; sin embargo, no siempre ser´a posi- tivo aumentar la cantidad de hilos. En la figura 2.9 se ilustra la ejecuci´on de un fragmento de programa con una secci´on en paralelo. En ella se describe lo siguiente: en un principio el hilo maestro inicia la ejecuci´on y crea la regi´on paralela. En la regi´on paralela los hilos esclavos ejecutan el proceso, al finalizar se destruyen los hilos. Finalmente el hilo maestro continua con la ejecuci´on. La ley de Amdahl nos permite calcular el speed-up m´aximo Sp como Sp = 1 (1 − F) + F p (2.11) donde F es la fracci´on de tiempo secuencial y p el n´umero de procesadores, entonces (1 − F) representa la fracci´on serial del programa.
  • 42. 26 Cap´ıtulo 2. Marco Te´orico Figura 2.9: Modelo de ejecuci´on de programas paralelos. Tomando un programa que se ejecuta como el de la figura 2.9 donde la regi´on paralela es F = 80 % del total de c´alculo. Con base a (2.11) se calcula el speed-up m´aximo (Sp) para 2 procesadores (n = 2) como sigue Sp = 1 (1 − 0.8) + 0.8 2 = 1 0.2 + 0.4 = 1.66x Ahora supongamos que otro c´odigo es altamente paralelizable F = 95 %, a continuaci´on se calcula el nuevo Sp para ´este nuevo c´odigo Sp = 1 (1 − 0.95) + 0.95 2 = 1 0.05 + 0.475 = 1.90x Si calculamos el speed-up m´aximo para 4, 5, 8, 16, 32 procesadores para los dos ejemplos anteriores se obtiene la gr´afica de la figura 2.10. En la figura 2.10 se ilustra el speed-up de dos programas con 95 % y 80 % de paralelismo y son comparados con el speed-up ideal. Para un n´umero reducido de procesadores ambos est´an cercanos al te´orico; pero conforme el n´umero de procesadores aumentan el speed-up de los dos programas empeora muy dr´asticamente. El speed-up que se puede esperar de un programa 95 % paralelo para
  • 43. 2.8. Escalabilidad paralela 27 5 10 15 20 25 30 5 10 15 20 25 30 Numero de procesadores speed−up Ideal 95% 80% Figura 2.10: Speed-up con Ley de Amdahl. m´as de 16 procesadores es muy pobre. Para otro 80 % paralelo pr´acticamente su l´ımite son 16 procesadores. Con el paso del tiempo la Ley de Amdahl se volvi´o obsoleta y fue Gustafson quien la revalid´o a finales de la d´ecada de 1980[20]. La versi´on moderna de la ecuaci´on de ´esta ley en (2.12) Smax = 1 (1 − F) + F S (2.12) donde lo ´unico que cambia es S que representa un speed-up. Cabe se˜nalar que conforme S se aproxime a infinito (S → ∞) se redondea el denominador de (2.12) quedando 1/(1 − F). 2.8.2. Incremento de velocidad (speed-up) El incremento de velocidad (speed-up), es la proporci´on del tiempo de reloj para la ejecuci´on del programa en un hilo y el tiempo de reloj para la ejecuci´on del mismo programa en varios hilos. Te´oricamente, debe ejecutar un programa en P-hilos, P veces tan r´apido como se ejecute en un hilo[11]. En la literatura existente cuando se refiere a ´este tema se utiliza el t´ermino speed-up, ´este documento no ser´a la excepci´on.
  • 44. 28 Cap´ıtulo 2. Marco Te´orico Con base a lo ya mencionado se define a speed-up como sigue S = T1 Tp (2.13) donde S representa el speed-up, T1 el tiempo de ejecuci´on para un procesador y Tp el tiempo que tarda la misma aplicaci´on en P-procesadores. La medida del speed-up es adimensional. Por ejemplo, si una fracci´on de c´odigo seriado (T1) dura 10 segundos, despu´es cuando ese c´odigo se ejecuta en forma paralela con dos procesadores (T2) dura 5.5 segundos. El speed-up que se tiene es el siguiente S = 10 5.5 = 1.8x Ahora si aumentamos el n´umero de procesadores a cuatro y tiene un tiempo de ejecuci´on (T4) de 3 segundos, el speed-up entonces ser´a S = 10 3 = 3.3x Con los ejemplos anteriores se representa el proceso para determinar la aceleraci´on de ejecuciones paralelas. En ninguno de los casos anteriores se llega al speed-up te´orico 2 y 4 respectivamente. En temas siguientes se indica el motivo por el cual no se llega a ello. Cuando se programa en paralelo siempre se busca alcanzar la proporcionalidad entre el aumento de la velocidad respecto al n´umero de hilos, no siempre se alcanza dicha meta debido a los proble- mas de acceso a memoria, los cuales depende del dise˜no de cada computadora. Es por ello que es conveniente cuidar la implementaci´on del c´odigo a fin de obtener una mayor velocidad cuando se cambie el n´umero de hilos. 2.8.3. Desempe˜no computacional El desempe˜no o rendimiento computacional (en la literatura tambi´en se le conoce como perfor- mance) se mide por las operaciones en punto flotante por segundo. Como menciona Null et al.[29] la m´etrica para el rendimiento es el FLOPS (floating-point operations per second, operaciones en punto flotante por segundo). Para calcular el desempe˜no se divide el n´umero de operaciones n entre
  • 45. 2.8. Escalabilidad paralela 29 el tiempo empleado t. FLOPS = n t (2.14) Con las nuevas prestaciones que ofrecen las computadoras la cantidad de FLOPS es algo dif´ıcil de manejar. Por ello se utilizan unidades de medida de FLOPS que se indican en la tabla 2.1. Tabla 2.1: Unidades de medida de FLOPS Nombre de la unidad Valor KiloFlop 103 MegaFlop 106 GigaFlop 109 TeraFlop 1012 PetaFlop 1015 ExaFlop 1018 ZetaFlop 1021 YottaFlop 1024 Para obtener directamente una de las unidades de la tabla 2.1 de (2.14) basta con hacer lo siguiente K FLOPS = n t × 10e (2.15) donde e corresponde al exponente de la unidad, por ejemplo e = 9 si calculamos GigaFlops. Ello se muestra a continuaci´on GigaFlops = n t × 109 FLOPS es una unidad generalizada para mostrar resultados de rendimiento. En la presente tesis se muestran todos los resultados de rendimiento utilizando ´esta unidad de medida. Para los fines de la presente tesis ´unicamente se utilizan para evaluar los algoritmos paralelos el desempe˜no computacional y el speed-up. Con los temas que se han tratado durante el presente cap´ıtulo se establece un fundamento te´orico lo cual se puede resumir. Los m´etodos num´ericos estas influenciados por las computadoras, lo cual requiere de an´alisis y modelaci´on matem´atica que permitan adaptar el esquema al tipo de problema en cuesti´on. Las nuevas generaciones de computadoras multin´ucleo permiten la ejecuci´on de aplicaciones paralelas; ello conlleva que se dise˜nen nuevos algoritmos que puedan explotar ´estas nuevas caracter´ıticas. ´Estos nuevos algoritmos deben ser eficientes para ellos son evaluados a fin de
  • 46. 30 Cap´ıtulo 2. Marco Te´orico determinar su desempe˜no computacional as´ı como su speed-up. A diferencia de los n´umero reales idealmente conocidos, en las computadoras la cantidad de n´umeros es limitada y su distribuci´on en la l´ınea recta no es uniforme. Debido al m´etodo num´erico elegido y a la representaci´on de los n´umeros en la computadora nace el error num´erico en los problemas de an´alisis num´erico, adem´as de las propias contemplaciones hacia el resultado por parte quien implementa el m´etodo.
  • 47. Cap´ıtulo 3 Producto matriz-vector Ax La multiplicaci´on de una matriz y un vector, es una operaci´on simple que resuelve un problema b´asico, pero importante [11]. La cual se presenta de forma frecuente en esquemas iterativos como lo son el m´etodo de Jacobi y el de Gauss-Seidel, por mencionar algunos. Estos m´etodos son tratados en cap´ıtulos siguientes. Durante este cap´ıtulo se describen formas distintas para resolver A·x utilizando la computadora; se˜nalando los pro y contras de cada una de ellas. Para ello se exhibe el rendimiento en speed-up y Mflops1 con el fin de mostrar num´ericamente cual de ellos es el mejor procedimiento para codificarla. En la primera secci´on se definen conceptos b´asicos para comprender el problema. C´omo se realiza el producto entre una matriz y un vector, cuales son la normas que deben cumplirse para que se pueda realizar. En el segundo apartado se da una breve introducci´on a un t´ecnica de optimizaci´on de ciclos conocida como Loop unrolling, la cual es utilizada para optimizar el producto de una matriz por un vector. Se estudia el c´alculo del residual en la secci´on tres, lo cual resulta ser un tema interesante, es utilizado como condici´on de paro en m´etodos iterativos. El residual es la diferencia que existe entre la soluci´on exacta y una aproximada. La implementaci´on can´onica se realiza en la cuarta parte del cap´ıtulo. En las secciones cinco y seis se realizan distintos procedimientos de optimizaci´on, para mejorar 1 flops (floating-point operations per second, operaciones en punto flotante por segundo) es una unidad de medida para el desempe˜no de una aplicaci´on. Mflops denota que es un mill´on de flops (106 ). 31
  • 48. 32 Cap´ıtulo 3. Producto matriz-vector Ax el desempe˜no de la aplicaci´on. En primer lugar, es utilizada la t´ecnica de Loop unrolling para optimizar el bucle. En segunda instancia, se optimiza a nivel de datos con la Tecnolog´ıa SIMD de Intel R . Al final de esta quinta secci´on se combinan ambas (Loop unrolling y SIMD) para exponer el resultado que se presenta al combinarlas. En la actualidad la gran mayor´ıa de las computadoras disponibles en el mercado, tienen m´as de un procesador. En c´omputo es importante explotar todos los recursos de manera eficiente. Lo que nos lleva a realizar aplicaciones que aprovechen el multin´ucleo, es decir, puedan ser ejecutadas en varios procesadores de forma simult´anea, esta tarea se lleva a cabo en el s´eptimo apartado. Por ´ultimo se muestran los resultados obtenidos tras las optimizaciones realizadas. Ello con la finalidad de establecer la mejor opci´on para implementarla en los m´etodos iterativos de los cap´ıtulos siguientes. 3.1. Concepto El producto de una matriz y un vector es un operaci´on simple que resuelve un problema b´asico pero importante [11]. En esta secci´on se presenta la multiplicaci´on de una matriz por un vector desde un punto de vista matem´atico. Antes de adentrarse es preciso definir lo que son las matrices y los vectores. Un vector no es m´as que un conjunto ordenado de n´umeros uniformemente espaciados, en el ´area de inform´atica se le conoce como arreglo unidimensional. Existen vectores de tipo columna y rengl´on dependiendo de la orientaci´on del mismo. A continuaci´on se representa un vector de orden n. X = [x1, x2, . . . , xn]T (3.1) En la ecuaci´on (3.1) se describe un vector rengl´on, tomando ese ejemplo para convertirlo a uno de tipo columna s´olo resolvemos la transpuesta del mismo. A continuaci´on se ilustra lo mencionado. X =         x1 x2 ... xn         (3.2)
  • 49. 3.1. Concepto 33 Una matriz es un arreglo rectangular de n´umeros con m filas y n columnas, o dicho de otra forma una matriz es un arreglo bidimensional [28]. A continuaci´on se muestra la representaci´on general de cualquier matriz. A =         a1,1 a1,2 · · · a1,n a2,1 a2,2 · · · a2,n ... ... ... ... am,1 am,2 · · · am,n         (3.3) En (3.3) se describe la forma general para representar una matriz de m-renglones y n-columnas, decimos que es una matriz de m × n. En ´este documento ´unicamente se abordar´an matrices cuyo n´umero de renglones es equivalente al de columnas. A este tipo de arreglo bidimensional se le conoce como matriz cuadrada, a consecuencia cuando se mencione una matriz se supondr´a que es cuadrada; mientras no se indique lo contrario. Para llevar a cabo la multiplicaci´on de una matriz por un vector se requiere cumplir con dos condiciones. La primera es que el vector tenga la forma de (3.2), es decir, sea un vector de tipo columna o vertical. Tomando a (3.3) y (3.2), el orden del vector (n´umero de renglones) debe ser exactamente igual al n´umero de columnas de la matriz; ´esta es la segunda condici´on. Por ende no puede realizarse la siguiente operaci´on. c = xA (3.4) Cuando se cumplen las condiciones se puede realizar la operaci´on. Como resultado de multiplicar la matriz A por el vector x se obtiene el vector c. La operaci´on se describe a continuaci´on, Ax = c (3.5) Si se desglosa (3.5), encontramos el siguiente procedimiento con base en (3.2) y (3.3). Donde se expone que cada rengl´on de la matriz se multiplica por el vector.         a1,1 a1,2 · · · a1,n a2,1 a2,2 · · · a2,n ... ... ... ... am,1 am,2 · · · am,n                 x1 x2 ... xn         =         a1,1x1 + a1,2x2 + · · · + a1,nxn a2,1x2 + a1,2x2 + · · · + a2,nxn ... am,1xn + am,2x2 + · · · + am,nxn         (3.6)
  • 50. 34 Cap´ıtulo 3. Producto matriz-vector Ax A continuaci´on se muestra una forma compacta de (3.6). En este documento ser´a utilizada ´esta f´ormula (3.7) cuando se haga referencia a la ecuaci´on de la mutiplicaci´on de una matriz por un vector, mientras la matriz no sea rectangular. ci = n j=1 aijxj i = 1, 2, . . . , n (3.7) Como se observa en (3.6) y (3.7) resolver la operaci´on en cuesti´on resulta trivial. Sin embargo, el proceso es demandante en tiempo de calculo. La demanda de c´alculo aumenta conforme la matriz A se vuelve m´as densa, es decir, el orden de la misma crece. Con base a (3.7) se realiza el algoritmo que corresponde con el tema tratado lo cual permitir´a crear la funci´on para la misma ecuaci´on. Algoritmo 3.1 Multiplicaci´on matriz-vector Est´a definido por los siguientes seis pasos: 1. Hacer i = 0 2. Si (i < m) Verdadero: hacer ci = 0,j = 0, posteriormente pasar al paso 3. Falso: ir al paso 6 3. Hacer ci = ci + Aij · xj 4. Hacer j = j + 1 5. Si (j < n) Verdadero: regresar al paso 3. Falso: hacer i = i + 1, posteriormente regresar al paso 2. 6. Parar. En esta secci´on se definieron las bases para resolver la operaci´on c = Ax. Lo cual es indispensable para escribir funciones en c´odigo C que resuelvan la operaci´on en cuesti´on. Esta actividad se llevar´a a cabo en secciones posteriores de este cap´ıtulo. 3.2. Loop unrolling En esta secci´on se define una t´ecnica de optimizaci´on de ciclos principalmente de tipo for. La t´ecnica llamada Loop Unroll o Loop unrolling (desdoble de ciclo). Esta t´ecnica sirve para optimizar
  • 51. 3.2. Loop unrolling 35 el c´odigo de programas para reducir el tiempo de ejecuci´on de la aplicaci´on, los cual incrementa el desempe˜no computacional de la misma. Como menciona Page [32] esta t´ecnica tiene como objetivo eliminar la sobrecarga asociada con la operaci´on de un ciclo determinado. Cuando el n´umero de iteraciones es conocido se pueden listar todos lo valores posibles para la variable de inducci´on2. Para ejemplificar, se tiene el siguiente ciclo: for(i = 0; i < n; i++) c[i] += a[i] * b[i]; Para ejemplificar tomemos n = 4 lo cual permite desdoblar el ciclo de forma completa quedando como sigue c[0] = a[0] × b[0] c[1] = a[1] × b[1] c[2] = a[2] × b[2] c[3] = a[3] × b[3] En este caso en particular la variable de inducci´on esta definida en el rango 0 ≤ i < n, al escribir un c´odigo con las nuevas modificaciones se obtiene una aplicaci´on que realiza la misma tarea que el ciclo original (para este caso en particular), pero ahora no hay gastos asociados al ciclo. En consecuencia el rendimiento aumenta. Cuando el valor de n es peque˜no el ciclo puede ser desdoblado en su totalidad. Sin embargo, conforme n crece llevar a cabo un desdoble completo del bucle; ser´a una tarea pr´acticamente impo- sible de realizar. Aunado a ello, el c´odigo resultante es tosco. Una forma ingeniosa para resolverlo es hacer un desdoble por bloques, cada uno tan grande como se desee. Esto con el fin de reducir el n´umero de iteraciones adem´as de exponer las operaciones que se pueden realizar en paralelo. A continuaci´on se desarrolla un c´odigo general aplicable a cualquier Unroll. r = n % k; for(i = 0; i < n-r; i+=k) c[i] += x[i]*y[i] + x[i+1]*y[i+1] + ... + x[i+k-1]*y[i+k-1]; for(i = n-r; i < n; i++) c[i] += x[i]*y[i]; En el c´odigo anterior k representa el factor de unroll que se aplica; n el orden de los vectores y r es el residual por si n no es divisible por k. 2 La variable de inducci´on es aquella que controla el funcionamiento del ciclo, en la mayor´ıa de los casos se representa con i.
  • 52. 36 Cap´ıtulo 3. Producto matriz-vector Ax Como menciona Page [32] al desarrollar un desdoble parcial queda claro que el n´umero de operaciones dentro del cuerpo del ciclo se puede llevar a cabo de forma paralela. La t´ecnica de Loop Unroll permite reducir la carga en el ciclo utilizando la l´ınea de cach´e del procesador utilizando los valores que recientemente han sido cargados a la memoria caliente3. Ello hace que sea muy utilizada gracias a la fidelidad que presenta en una implementaci´on. A´un cuando la implementaci´on es por dem´as sencilla, la elecci´on de una regla para que esta t´ecnica funcione siempre no es una tarea sencilla. Este problema esta ligado directamente a las caracter´ısticas del procesador, los procesadores no-m´oviles ejecutan mejor las sobre-cargas en los ciclos que los que no lo son. 3.3. C´alculo del residual En esta secci´on se aborda el tema del c´alculo del residual, como un m´etodo para medir la convergencia de los esquemas iterativos que se estudian en cap´ıtulos posteriores. Este procedimiento mide el error entre la k-´esima iteraci´on con respecto a la soluci´on exacta del sistema lineal de ecuaciones. Uno de los principales usos del c´alculo del residual es durante la medici´on de error en los m´etodos iterativos de proyecci´on sobre subespacios de tipo Krylov[24]. Se realizar´a una funci´on que realice este procedimiento, la cual ser´a utilizada en los siguientes cap´ıtulos. El c´alculo del residual (r) se obtiene de sustraer el producto de A y x∗ a b como se muestra a continuaci´on r = b − Ax∗ (3.8) donde, x∗ = una aproximaci´on a la soluci´on exacta de x, b, r, x∗ ∈ RN y, A ∈ RN×N Para ello los vectores (b, r, x∗) tienen la forma del vector z la cual se expresa a continuaci´on, z = (z1, z2, . . . , zn)T Si x∗ = x ⇒ r = ¯0 Ahora si x ≈ x∗ ⇒ r = 0 Tomando en cuenta que la soluci´on exacta x es la suma de la aproximaci´on m´as el error (x = x∗ + e), con lo que deducimos que x = x∗ − e 3 La memoria caliente corresponde a un tipo de almacenamiento conocido como NUMA(Non-uniform memory access, memor´ıa de acceso no uniforme) o memoria caliente es como se le conoce a la memoria cach´e del procesador debido a que es una memoria de gran velocidad.
  • 53. 3.3. C´alculo del residual 37 Al sustituir x∗ en (3.8) tenemos r = b − A(x∗ − e) con ello se intuye que el residual es equivalente al error entre la soluci´on exacta y una aproximada r ≈ e Observe que el residual r es un vector de orden n, es decir, r ∈ Rn de la forma r = (r1, r2, r3, . . . , rn)T A continuaci´on el c´alculo del residual se traduce a c´odigo C, en la figura (3.1) se ilustra esta tarea ya realizada. Implementaci´on C´alculo del Residual double calcularResidual(float **A, float *dx, float *b, int n) { double *residual,normResidual; int i,j; double rowDot; residual = make_dvector(n); for(i = 0; i < n; i++) { rowDot = 0.0; for(j = 0; j < n; j++) rowDot += A[i][j] * dx[j]; residual[i] = b[i] - rowDot; } normResidual = normInf(residual,n); free_svector(residual); return normResidual; } Figura 3.1: C´alculo del residual en C. En la funci´on descrita con anterioridad, se utilizan tres m´etodos que se explican a continua- ci´on. Cuando se llama a la funci´on make dvector(n) se reserva la memoria para un vector, en este caso residual. La segunda funci´on normInf(residual,n) calcula la norma infinita de un vector con
  • 54. 38 Cap´ıtulo 3. Producto matriz-vector Ax orden n. En el ´ultimo caso free dvector(residual) se libera la memoria previamente reservada con make dvector(n). En temas posteriores, cuando se indique el c´alculo del residual (dentro de l´ıneas de c´odigo), se har´a aluci´on a esta funci´on cuando no se indique lo contrario. El residual es un m´etodo que mide la diferencia entre una soluci´on exacta y una aproximada. Se utiliza para determinar la convergencia en esquemas iterativos como son los m´etodos de Jacobi y Gauss-Seidel. Para reducir el error derivado de la gran cantidad de operaciones en los m´etodos directos se utilizan t´ecnicas iterativas de correcci´on del error del residual. La funci´on que fue implementada puede ser optimizada con temas tratados en secciones poste- riores de este cap´ıtulo, a fin de incrementar el desempe˜no computacional de la misma. Cabe se˜nalar que esta funci´on no ser´a optimizada llegando a esos temas porque no es la finalidad del presente documento. 3.4. Codificaci´on En esta secci´on se realiza una primera implementaci´on en c´odigo C, para la ecuaci´on que corres- ponde a la multiplicaci´on de una matriz por un vector, es decir, la ecuaci´on (3.7). En esta primera funci´on secuencial no se utiliz´o ninguna de la optimizaciones. En temas posteriores se realizar´an mejoras que impacten positivamente en el rendimiento. Como se ha mencionado con anterioridad, el producto de una matriz por un vector es una operaci´on muy sencilla. Traducirla a un lenguaje para computadora es tambi´en una tarea muy simple. La fracci´on de c´odigo de la figura 3.2 es un primer resultado tras realizar la tarea en cuesti´on. Implementaci´on Can´onica de Ax for(i = 0; i < n; i++) { c[i] = 0.0; for(j = 0; j < n; j++) c[i] = A[i][j] * x[j]; } Figura 3.2: Implementaci´on can´onica de Ax.
  • 55. 3.5. Incremento del desempe˜no 39 Como puede observarse el c´odigo de la figura 3.2 est´a dise˜nado para matrices cuadradas. El c´odigo es por dem´as sencillo y no existe nada extra˜no. Es preciso definir que en temas siguientes cuando se mencione una implementaci´on can´onica del producto de una matriz po un vector, nos referiremos a ´esta fracci´on de programa alojado dentro de una funci´on. En pocas palabras, ´esta primera implementaci´on corresponde a una versi´on compacta de una funci´on can´onica que resuelve la multiplicaci´on de una matriz por un vector. La implementaci´on can´onica permite tener un primer acercamiento en la realizaci´on de una aplicaci´on; la cual pueda ser ejecutada en forma paralela. En esta secci´on se realiz´o una primera implementaci´on, la can´onica. Esta funci´on no cumple con los objetivos planteados; es decir, no presenta un buen desemple˜no computacional. Adem´as no es posible ejecutar esa aplicaci´on en varios procesadores de manera simult´anea. Tomando esto dos puntos, y los que puedan surgir, definimos que la implementaci´on can´onica no es una opci´on, en t´erminos de c´omputo de alto desempe˜no. En las siguientes secciones se tratan cada uno de los puntos ya mencionados, a fin de cumplir con cada uno de ellos. 3.5. Incremento del desempe˜no Muchos programas pasan gran parte de su tiempo de ejecuci´on en bucles; en este caso es mediante ciclos que se accede a los elementos de la matriz; con una reorganizaci´on adecuada de los bucles se puede explotar el cach´e de procesador donde se guardan m´as de un elemento que se va a utilizar en la siguiente operaci´on. Los elementos que se encuentran en la l´ınea de cach´e en muchos casos pueden ser procesados a la vez mediante una pila de operaciones. Esto puede mejorar el rendimiento de un programa4. En esta secci´on se optimiza la versi´on can´onica de la mutiplicaci´on Ax con la t´ecnica de Loop unrolling. Para mejorar el rendimiento de la aplicaci´on es preciso realizar un an´alisis detallado de la forma matem´atica, se realiza una descomposici´on a fin de buscar diferentes formas de programar el pro- blema para definir las caracter´ısticas y determinar cual se adapta mejor a nuestros requerimientos. Para ello es preciso desglosar y estudiar un gran n´umero de posibles soluciones, as´ı como analizarlas; para determinar aquella que permita maximizar el desempe˜no sin incrementar significativamente el 4 Las modificaciones en c´odigo pueden ser aplicadas si y s´olo si no cambian el correcto funcionamiento de la aplicaci´on.
  • 56. 40 Cap´ıtulo 3. Producto matriz-vector Ax error num´erico para la soluci´on buscada. Recordemos la ecuaci´on, ci = n j=1 aijxj i = 1, 2, . . . , n (3.9) En m´as de una ocasi´on cuando se realiza una tarea se encuentra que existen varios caminos para realizarla; cada uno de esos caminos con distancias y obst´aculos distintos. Nos encontramos justo en uno de esos casos, para elegir el camino primero estudiaremos cada uno de ellos. Existen pr´acticas utilizadas para la optimizaci´on ciclos con un n´umero significativo de iteraciones, generalmente en bucles for’s. Las t´ecnicas tienen el prop´osito de disminuir el tiempo de ejecuci´on del bucle; consisten en disminuir la cantidad de iteraciones haciendo un incremento mayor a la unidad en la variable que controla el ciclo. Una de esas pr´acticas es la llamada Unroll Loops. Como menciona Chapman et al.[11] el Unroll a un bucle es una pr´actica poderosa para reducir efectivamente los gastos de ejecuci´on. Puede ayudar a mejorar la utilizaci´on de la l´ınea de cach´e con la reutilizaci´on de datos. Como es sabido el compilador no es capaz de determinar las dependencias de operaciones ni tampoco lo que respecta al acceso en los elementos dentro de ciclos; por lo que el desarrollador suele hacer un mejor trabajo en la optimizaci´on de bucles. Antes de resolver el producto c = Ax, se plantea lo siguiente, ci = aix (3.10) donde c y x son vectores verticales de orden de n-elementos, y ai es el i-´esimo vector horizontal de la matriz A. Partiendo de (3.10) encontramos diferentes formas de resolverlo, a continuaci´on se listan las variantes a tomar en cuenta, para esto todas utilizan la t´ecnica de unroll. 1. s = n j=1 xjyj + xj+1yj+1 ∆ j = 2 2. s = n j=1 xiyj + xj+1yj+1 + xj+2yj+2 + xj+3yj+3 ∆ j = 4 3. s = n/2 j=1 xjyj + xj+1yj+1 + n j=n/2 xjyj + xj+1yj+1 ∆ j = 2 4. s = n/4 j=1 xjyj + xj+1yj+1 + n/2 j=n/4 xjyj + xj+1yj+1 + 3n/4 j=n/2 xjyj + xj+1yj+1
  • 57. 3.5. Incremento del desempe˜no 41 + n j=3n/4 xjyj + xj+1yj+1 ∆ j = 2 5. s = n j=1 xiyj + xj+1yj+1 + xj+2yj+2 + xj+3yj+3 + xj+4yj+4 ∆ j = 5 6. s = n j=1 xiyj + xj+1yj+1 + xj+2yj+2 + xj+3yj+3 + xj+4yj+4 +xj+5yj+5 ∆ j = 6 7. s = n j=1 xiyj + xj+1yj+1 + xj+2yj+2 + xj+3yj+3 + xj+4yj+4 + xj+5yj+5 + xj+6yj+6 +xj+7yj+7 ∆ j = 8 8. s = n j=1 xiyj + xj+1yj+1 + xj+2yj+2 + xj+3yj+3 + xj+4yj+4 + xj+5yj+5 + xj+6yj+6 +xj+7yj+7 + xj+8yj+8 + xj+9yj+9 + xj+10yj+10 + xj+11yj+11 ∆ j = 12 Para comprender y tener una idea de como utilizar el unroll, en primera instancia se estudiar´an y comparar´an las primeras cinco variantes (1-5), en segunda instancia se analiza el resto. En algunos de los casos anteriores podemos realizar dos implementaciones lo cual se expresar´a en su momento. A continuaci´on se har´a la codificaci´on de cada una de las opciones para conocer sus caracter´ısticas. En la primera implementaci´on (figura 3.3) corresponde a ese mismo orden de la lista de opciones enlistadas anteriormente. Como se puede observar el n´umero de iteraciones se reduce a la mitad, lo cual te´oricamente hace pensar que el tiempo de ejecuci´on va a reducirse a la mitad de tiempo. Para este caso en particular corresponde a un Unroll-2 donde se guardar´a el resultado obtenido a una variable. Esta al igual del resto de las fracciones de c´odigo que corresponda con la lista de opciones, representa la soluci´on de la multiplicaci´on de dos vectores. C´odigo Opci´on 1 for(i = 0; i < n; i+=2) suma += (x[i]* y[i]) + (x[i+1] * y[i+1]); Figura 3.3: T´ecnica Loop Unrroll con factor 2. A continuaci´on hacemos la codificaci´on de la segunda opci´on (figura 3.4), que corresponde a un Unroll-4. En ´esta ocasi´on la cantidad de iteraciones se reduce a una cuarta parte. Al igual que en el caso anterior el resultado es guardado dentro de una variable.
  • 58. 42 Cap´ıtulo 3. Producto matriz-vector Ax C´odigo Opci´on 2 for(j = 0; j < n; j+=4) suma += x[j]*y[j] + x[j+1]*y[j+1] + x[j+2]*y[j+2] + x[j+3]*y[j+3]; Figura 3.4: T´ecnica Loop Unroll con factor 4. El siguiente c´odigo (figura 3.5) representa una forma distinta de programar la primera opci´on de la figura 3.3, en ´esta ocasi´on, primero haciendo las operaciones con los ´ındices pares del vector y posteriormente con los impares. C´odigo Opci´on 1a for(j = 0; j < n; j+=2){ suma += x[j]*y[j];} for(j = 1; j < n; j+=2){ suma += x[j]*y[j];} Figura 3.5: T´ecnica Loop Unroll con factor 2, dos ciclos for. Como vemos en el c´odigo de la figura 3.6, se puede codificar de distintas formas un mismo problema. En las implementaciones anteriores s´olo utilizamos una variable para almacenar el resul- tado, de la operaci´on en cuesti´on, en las pr´oximas codificaciones se har´a uso de dos o m´as variables para acumular el resultado mientras se realizan las operaciones. La siguiente fracci´on de programa corresponde al mismo c´odigo anterior pero ahora haciendo uso de dos variables. C´odigo Opci´on 3 for(j = 0; j < n; j +=2){ s1 += (x[j]*y[j]);} for(j = 1; j < n; j +=2){ s2 += (x[j]*y[j]);} suma = s1 + s2; Figura 3.6: T´ecnica Loop Unroll con factor 2, dos variables. La cuarta opci´on (figura 3.7) representa una forma m´as sofisticada para llevar a cabo la soluci´on del problema ya que partimos la operaci´on principal en dos sub-operaciones, las cuales a su vez presentan un incremento en j de dos (∆j = 2) lo cual reduce el n´umero de iteraciones a la mitad e implementa dos variables, temporales, para llevar a cabo las operaciones. Ello ante los ojos del unroll, corresponde al Unroll-2 dividido en dos mitades.
  • 59. 3.5. Incremento del desempe˜no 43 C´odigo Opci´on 4 for(j = 0; j < n/2; j += 2){ s1 += x[j]*y[j] + x[j+1]*y[j+1];} for(j = n/2; j < n; j += 2){ s2 += x[j]*y[j] + x[j+1]*y[j+1];} suma = s1 + s2; Figura 3.7: T´ecnica Loop Unroll con factor 2, dos ciclos for y dos variables. La siguiente implementaci´on (figura 3.8), de la quinta opci´on, sigue la nomenclatura a la anterior y solamente difiere en la cantidad de partes, que para este caso son cuatro, y por ende el n´umero de variables temporales aumenta a igual n´umero, a continuaci´on se muestra lo que con anterioridad se ha mencionado. C´odigo Opci´on 5 for(j = 0; j < n/4; j+=2) { s1 += x[j]*y[j] + x[j+1]*y[j+1];} for(j = n/4; j > n/2; j+=2) { s2 += x[j]*y[j] + x[j+1]*y[j+1];} for(j = n/2; j > 3*n/4; j+=2){ s3 += x[j]*y[j] + x[j+1]*y[j+1];} for(j = 3*n/4; j > n; j+=2) { s4 += x[j]*y[j] + x[j+1]*y[j+1];} suma = s1 + s2 + s3 + s4; Figura 3.8: T´ecnica Loop Unroll con factor 2, cuatros ciclos for cuatro variables. Todas la implementaciones anteriores tienen el fin de encontrar las ventajas y desventajas que resulta despu´es de desglosar el problema de distintas formas. Para cada una de las codificaciones los resultados arrojados son distintos, aunque en teor´ıa el resultado es una constante; en la pr´actica el resultado difiere en cada una de las aplicaciones. Para hacer m´as evidente los resultados es necesario que los vectores x y y sean de tipo float y llenados con n´umero reales con signo, intercalados de preferencia. En muchos lugares escuchamos que los nuevos dise˜nos se deben adaptar a la necesidades, es por ello que en todo momento nos referimos como opciones a todas las implementaciones; en esta ocasi´on ´unicamente se someter´an a pruebas de exactitud y de velocidad de ejecuci´on. En la tabla 3.1 podemos observar los resultados de exactitud de las funciones cuando se someten con vectores de longitud n y con diez mil iteraciones para cada valor de n. Los resultados son muy congruentes; para valores reducidos de n es m´as provechoso realizarlo con la versi´on can´onica,
  • 60. 44 Cap´ıtulo 3. Producto matriz-vector Ax en caso contrario cuando n es grande dividir el ciclo en varias partes ser´a mejor; en t´erminos de exactitud. Tabla 3.1: Producto de dos vectores: resultados de prueba de exactitud, observamos las veces que es m´as exacta, mostrada en porcentaje ( %), cada funci´on durante las iteraciones para cada valor de n. Resultados de Prueba de Exactitud Funci´on y Exactitud ( %) N Can´onica 1 1a 2 3 4 5 16 49.90 26.26 10.63 1.27 7.10 3.50 1.34 32 39.38 29.04 11.50 1.86 10.74 5.59 1.89 64 29.20 28.17 12.00 2.99 15.35 8.52 3.77 128 22.01 23.80 12.70 4.45 18.06 12.84 6.14 256 17.42 28.17 10.73 6.01 19.26 16.10 9.76 512 13.44 20.72 10.01 7.46 18.62 19.22 13.52 1024 11.26 17.73 8.63 9.60 18.36 19.28 17.83 2048 9.68 15.04 9.08 10.18 17.30 20.76 19.53 4096 9.07 13.47 8.26 11.50 17.16 19.33 22.30 8192 8.30 12.38 7.95 12.45 16.40 20.56 22.78 16384 8.50 11.56 7.79 12.91 15.50 19.93 24.22 32768 7.67 10.55 7.98 13.57 15.06 19.62 25.55 Con base a lo que observamos en la tabla 3.1 decimos que si queremos cuidar la exactitud de la operaci´on, necesitamos desdoblar las operaciones en k-partes utilizando una variable distinta para cada parte, donde k depender´a del orden de los vectores (x, y). Ello por motivo que en valores de n peque˜no es contraproducente, pero donde n tenga un valor suficientemente grande, la exactitud mejorar´a conforme se implementen m´as desdobles. Con base a estos resultados podemos inferir que es de vital importancia definir el grado de exactitud que buscamos; lo cual se obtiene al aumentar la cantidad de desdobles. Por consecuencia conforme aumentemos la cantidad de partes, el c´odigo fuente crecer´a y se convertir´a en tosco y dificultar´a el entendimiento del mismo. Una buena pregunta que surge con los resultados obtenidos es la siguiente: ¿Por qu´e los resulta- dos son distintos para cada funci´on?, la respuesta es muy simple, por problemas de redondeo, como menciona Chapra et al.[12], estas diferencias son originadas porque las computadoras utilizan un determinado n´umero de cifras significativas para los c´alculos. Es por ello que algunas operaciones