Está en la página 1de 6

Facultad de Ingeniería

Área de Ciencias de la Computación

Materia: Redes B

Grupo: 2821-1

Examen: Tecnologías para cómputo en paralelo

Miguel Ángel Méndez Orta - 262698 - 201601500203

Profesor ING. GONZALEZ GRIMALDO RAYMUNDO ANTONIO

San Luis Potosí, SLP a 15 de diciembre del 2020.


Tecnologías para cómputo paralelo
Programación con hilos

Consiste en crear tareas/procesos ligeros que van a realizar determinadas acciones


que nosotros les asignemos en nuestro programa.

Ventajas
- Son fáciles de crear (depende del lenguaje).

- Pueden compartir otros recursos de memoria con uno o más hilos en un


programa.

- Pueden aprovechar mucho más el procesador.

- No existe restricción para manejar algún tipo de dato en específico.

Desventajas
- El tiempo para crear un hilo en general es tardado, ya que al ser un proceso
ligero, se le debe asignar recursos en un programa, lo cual puede llegar a tardar
bastante.

- Al poder compartir recursos, pueden llegar a presentarse condiciones de carrera.


- Al aprovechar más el CPU, también pueden llegar a producir una sobrecarga, lo
cual en el peor de los casos haría más lenta la ejecución de nuestro programa.

- Una vez que se usa un hilo, no se puede volver a utilizar, lo cual hace que
tengamos que volver a instanciar y asignar recursos a un hilo nuevo.

Cómo usé esta tecnología

En software que lleve a cabo tareas de forma asíncrona, sin depender del hilo principal
de ese programa. Yo de forma personal utilicé hilos para mi editor de grafos al obtener
diferente información de dicho grafo. Por ejemplo: Un hilo obtenía si un grafo era
dirigido, otro si era bipartita y otro si tenía orejas. Eso me permitió no tener que realizar
todo desde el hilo principal del programa, ya que cada una de esas acciones aunque
dependen del grafo, eran tareas independientes, por lo que cada una se pudo llevar a
cabo de forma concurrente.
Clúster (MPI)

Consiste en desarrollar programas y asignar al inicio de la ejecución un número de


procesos, en donde el propósito es que cada proceso se encargue de resolver una
parte de una o varias tareas.

Ventajas
- El número de procesos se indica al inicio del programa, lo cual permite no
sobrecargar el código con instrucciones de creación / bifurcación de procesos
hijos.

- Existe intercomunicación entre los procesos, lo cual permite que los procesos
envíen / reciban información de otros procesos.

- Cada proceso contiene un identificador / número, lo cual nos permite determinar


qué proceso gestionará / controlará lo que hará el resto.

- Cada procesador tiene su propio espacio de recursos, lo cual evita problemas de


sincronización que podrían existir por ejemplo con hilos.

- Permite distribuir / organizar de diferentes modos las tareas que cada proceso
debe llevar a cabo, de forma que la distribución y carga de trabajo en el
programa sea más equitativa. Esto se lleva a cabo mediante el uso de diferentes
funciones incluidas en MPI.

- Las funciones incluidas permiten reducir la cantidad de código de nuestros


programas.

Desventajas
- Al igual que un hilo, el generar los procesos puede llegar a ser tardado.

- Cuando se indica un número de procesos, esta cantidad ya no se puede


cambiar.

- Al no compartir espacio de memoria, un proceso no conocerá los valores de


otro, lo cual en ciertos casos llega a ser necesario.

- La intercomunicación entre procesos puede llegar a ser tardada.

- La cantidad de procesos que se pueden ejecutar está limitada a los recursos de


nuestra computadora (más que nada al procesador).
- Un proceso en general puede llegar a ocupar mucha memoria, si esto mismo
ocurre en otros procesos de MPI, el consumo de recursos podría llegar a ser
catastrófico.

- Se deben liberar los recursos que ocupa cada proceso al finalizar su ejecución.

- Casi siempre al último proceso le toca una carga de trabajo mayor a los otros.

- Para enviar una estructura de datos a otro proceso, esta debe de ser traducida
por determinadas funciones en MPI, lo cual implica que nuestro código en
determinado punto pueda llegar a ser muy extenso.

- Una limitante muy importante es que no se pueden enviar datos


multidimensionales a otros procesos, por ejemplo: un apuntador bidimensional
(​tipo_dato**​). Se deben manejar de forma secuencial y trabajar de forma
indexada (​tipo_dato*​).

Cómo usaría esta tecnología

Personalmente me gustaría usarla para problemas de inteligencia artificial o de minería


de datos, en donde cada proceso podría manejar / entrenar ciertos segmentos /
pedazos de datos.

También me gustaría investigar más su uso para el análisis de algoritmos de orden


exponencial (como el problema del viajero o de la resolución de sudokus), de modo que
puedan investigarse y/o implementarse versiones de esos algoritmos tipo NP con un
orden de complejidad más reducido, en donde cada proceso pueda llevar a cabo
determinado conjunto de tareas y de ese modo, se puedan proponer versiones
paralelas que disminuyan los tiempos de resolución.

Otro uso por ejemplo sería el crear una red interna de tres computadoras en la cual,
mediante esa red se le asigna a cada una cierta cantidad de trabajo, lo cual permite no
solo emplear los recursos de un solo computador, sino crear un GRID.
Cuda / OpenGL

Tecnología que permite emplear GPUs (unidades gráficas de procesamiento) como


dispositivos de procesamiento en paralelo.

Ventajas
- El código de nuestro programa puede distribuirse de modo que haya trabajo por
parte del cpu, cpu y gpu o solo la gpu. Esto mediante el uso de kernels.

- La diferencia de núcleos a comparación de la de un procesador es bastante alta


(por no decir abismal).

- Permite ejecutar un número alto de hilos.

- Los hilos tienen un identificador, lo cual nos permite identificarlos o asignarlos de


forma más directa en nuestros programas.

- Los hilos están distribuidos de forma jerárquica (vectores, matrices o


volúmenes), lo cual permite manejar arreglos de diferentes dimensiones con
mayor naturalidad.

Desventajas
- Se debe de asignar memoria a nuestras variables al momento de emplear
CUDA.

- Igualmente, también se deben liberar los recursos empleados en la GPU al


momento de ya no utilizarlos.

- Al igual que cualquier otro recurso computacional, el número de hilos por bloque
es finito.

- Si se tiene una cantidad de hilos muy grande, puede existir la posibilidad de


obtener resultados raros, lo cual no es bueno.

- Técnicas como la recursión, pueden llegar a ser limitadas en CUDA, ya que la


memoria además de ser computadora entre otros hilos, puede en ciertos casos
no ser lo suficientemente grande para tolerar el tamaño de la pila de llamadas en
algoritmos muy complejos.
- Contiene una sintaxis específica, la cual puede llegar a ser complicada de
entender.

- Se debe de diferenciar apropiadamente las tareas que llevará a cabo el CPU, la


GPU o lo que ambos pueden llegar a hacer.
Cómo usaría esta tecnología

Me gustaría aplicarla al procesamiento digital de imágenes o al procesamiento de


señales y/o algoritmos científicos / matemáticos. En el caso del procesamiento de
imágenes, no solo procesar fotos, sino también trabajar con algoritmos que se
encargan de filtrar/manejar señales y/o realizar transformaciones, como el caso de la
transformada de fourier.

También me interesaría aplicar fórmulas de fenómenos científicos, ya que algunas de


ellas, requieren llevar a cabo un número de operaciones muy alto.

Conclusiones personales
A lo largo de este curso no solo aprendí a emplear tecnologías de cómputo paralelo,
también aprendí cómo resolver un problema aplicando esta metodología, lo cual nos
permite como programadores proponer soluciones que pueden proveernos mejores
resultados (cuando aplique).

También aprendí a determinar en qué momento se vuelve una buena opción


implementar / desarrollar un algoritmo paralelo y en qué momento no, ya que hay
situaciones en las que paralelizar un algoritmo significa que obtendremos mejores
resultados. Puede que un algoritmo de forma secuencial sea mucho más rápido que
uno paralelo y esto tenemos que aprender a determinarlo y reconocerlo. Incluso
podrían existir problemas que no puedan resolverse de este modo. Por ejemplo:
Existen problemas de Backtracking que son bastante complejos y esto mismo complica
el poder plantear una solución paralela.

Bibliografía
https://developer.nvidia.com/cuda-zone
https://www.open-mpi.org/doc/
http://www.rocksclusters.org/
https://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html
https://docs.oracle.com/javase/7/docs/api/javax/swing/SwingWorker.html
https://docs.microsoft.com/en-us/dotnet/api/system.threading.thread?view=net-5.0
https://docs.microsoft.com/en-us/dotnet/api/system.componentmodel.backgroundworker
?view=net-5.0
Presentaciones del profesor

También podría gustarte