Antes de hablar sobre los algoritmos
paralelos, primero debemos entender el
concepto de concurrencia. La concurrencia
es la ejecución simultánea de múltiples
programas que están relacionados.
La concurrencia es utilizada en tareas
donde se deban procesar una gran cantidad
de datos compleja.
¿Qué es un
algoritmo
paralelo?
El problema es dividido en sub-
problemas y son ejecutados en
paralelo para conseguir salidas
individuales, luego, estas salidas se
combinan para conseguir la salida
deseada
No es fácil dividir grandes problemas en
subproblemas, debido a que estos
subproblemas pueden tener dependencias
entre ellos, por lo tanto, los procesadores
deben comunicarse entre sí para poder
resolver el problema.
Se ha encontrado que el tiempo que
necesitan los procesadores para
comunicarse es más grande que el tiempo
necesario para realizar las tareas
asignadas. Por lo que necesitamos una
utilización apropiada del CPU.
¿Qué es un algoritmo paralelo?
Un modelo multiprocesador es una
generalización del modelo secuencial RAM,
en donde hay más de un procesador. Los
modelos multiprocesadores pueden ser
clasificados en tres (3) tipos básicos:
1. Modelo de máquina con memoria local
2. Modelo de máquina con memoria
modular
3. Modelo de máquina con memoria de
acceso aleatorio paralela (PRAM)
Modelos multiprocesadores
Los tres tipos multiprocesadores difieren en la forma en la que acceden a la memoria. En un
modelo de máquina con memoria local, cada procesador puede acceder a su memoria local
directamente, pero solo se puede comunicar con la memoria de otro procesador enviando un
request de memoria a través de la red.
En un modelo modular, el procesador accede a la memoria en un módulo de memoria enviando
un request de memoria a través de la red. Normalmente los procesadores y módulos de
memoria están organizados en una forma que el tiempo de cada procesador en acceder a la
memoria sea equivalente.
El modelo PRAM es controversial debido a que no hay ninguna máquina que viva a su tiempo
ideal para acceder a la memoria.
Modelos multiprocesadores
El análisis de algoritmos paralelos es importante ya que ayuda a comprender los problemas de
escalabilidad. Hablando matemáticamente, si n es el tamaño de las entradas, p el número de
procesadores y Tseq (n) el tiempo de ejecución secuencial, entonces el tiempo de ejecución en
paralelo debería parecerse a O + (Tseq(n/p)) + f(n,p) ) donde f crece más lentamente que Tseq
para n grande. Esto significa que para entradas grandes, el algoritmo es rentable en comparación
con la solución secuencial. Si f crece lentamente, el algoritmo es escalable para valores grandes
de p incluso para valores pequeños de n/p. Para computación paralela masiva, podemos adoptar
el antiguo objetivo de los algoritmos PRAM para lograr una f que sea poli logarítmica en n y p
(es decir, O(logk (np)) para alguna constante k). En máquinas más pequeñas, los requisitos de
escalabilidad menos estrictos pueden conducir a algoritmos más simples o mejores factores
constantes.
A pesar de los enormes esfuerzos en los lenguajes de programación paralelos y en la
paralelización de compiladores, la implementación de algoritmos paralelos sigue siendo uno de los
principales desafíos en el ciclo de ingeniería de algoritmos. Hay varias razones para esto.
Primero, existen enormes brechas semánticas entre la descripción del algoritmo abstracto, las
herramientas de programación utilizadas y el hardware real. En particular, los códigos realmente
eficientes a menudo usan interfaces de programación de nivel bastante bajo, como MPI o
operaciones de memoria atómica para mantener manejables los gastos generales para la
interacción del procesador. Además, la depuración de programas paralelos es notoriamente
difícil. Dado que el rendimiento es la razón principal para usar computadoras paralelas en primer
lugar, y debido a la complejidad del hardware paralelo, el ajuste del rendimiento es una parte
importante de la fase de implementación.