Vous êtes sur la page 1sur 6

LECTURA 1

Este tutorial enseña algoritmos multihilo dinámicos utilizando el modelo Cilk-like [11, 8,
10]-. El material se ha enseñado en la clase de pregrado del MIT 6.046 Introducción a los
algoritmos, en dos conferencias de 80 minutos. El estilo de las notas de la conferencia
siguen el estilo del libro de texto de Cormen, Leiserson, Rivest, y Stein [7], pero el
pseudocódigo ha sido tomado de "Cilkified" para describir algoritmos multihilo o
multiproceso. La primera conferencia enseña los fundamentos detrás del
multiprocesamiento, incluyendo la definición de las medidas de trabajo y la duración de la
ruta crítica. Culmina en el teorema de programación codicioso de a Graham y Brent [9, 6].
La segunda conferencia muestra cómo las aplicaciones paralelas, incluyendo la
multiplicación de matrices y los algoritmos de ordenamiento, puede ser analizado usando
las recurrencias de divide y vencerás.

1. Programación multiproceso dinámico


Como los sistemas de multiprocesamiento se han vuelto cada vez más disponibles, ha
aumentado el interés en la programación paralela. Es un paradigma de programación en los
que un programa se divide en múltiples hilos de control que interactúan para resolver un
solo problema. Estas notas proporcionan una introducción al análisis de algoritmos
multihilo "dinámicas", donde las discusiones pueden ser creadas y destruidas tan fácilmente
como una subrutina ordinaria de llamar y retornar.

1.1. MODELO
Nuestro modelo de computación multihilo dinámico se basa en la abstracción del
procedimiento que se encuentra en prácticamente cualquier lenguaje de programación.
Como ejemplo, el procedimiento FIB da un algoritmo de multiproceso para el cálculo de
los números de Fibonacci: 1
1. Este algoritmo es una terrible manera de calcular los números de Fibonacci, ya que se
ejecuta en tiempo exponencial cuando se conocen otros métodos logarítmicas [7, pp. 902–
903], pero sirve como un buen ejemplo didáctico.

Un spawn es el análogo de una llamada de subrutina ordinaria. La palabra clave spawn


antes de la llamada de subrutina en la línea 3 indica que es un sub procedimiento FIB (n- 1)
puede ser ejecutado en paralelo con el procedimiento FIB (n) en sí. A diferencia de una
llamada a una función ordinaria, sin embargo, el padre no se reanuda hasta después de sus
declaraciones de los hijos, en el caso de un spawn, el padre puede continuar con la
ejecución en paralelo con el hijo. En este caso, el padre pasa a extraer FIB (n- 2). En
general, el padre puede continuar para extraer fuera de los hijos, produciendo un alto grado
de paralelismo.
En el procedimiento no se puede utilizar con seguridad, dado que los valores de retorno de
los hijos que se ha producido se ejecutan en una sentencia de sincronización. Si alguno de
sus hijos no se ha completado cuando ejecuta una sincronización, el procedimiento se
suspende y no se reanuda hasta que todos sus hijos lo han completado. Cuando todos sus
hijos regresan, la ejecución del procedimiento se reanuda en el punto inmediatamente
después de la declaración de sincronización. En el ejemplo de Fibonacci, se requiere la
declaración de sincronización en la línea 5 antes de la sentencia de retorno en la línea 6
para evitar la anomalía que se produciría si x y y que se sumaron antes de que cada uno
había sido computada.
La palabra clave spawn y sincronización especifican paralelismo lógico, no paralelismo
"real". Es decir, estas palabras clave indican que el código puede posiblemente ejecutar en
paralelo, pero lo que realmente se ejecuta en paralelo se determina por un programador, que
mapea el cálculo despliegue dinámicamente sobre los procesadores disponibles.

Podemos ver un cálculo multiproceso en términos teórico-gráfico como un despliegue


dinámico dag G = (V, E), como se muestra en la Figura 1 de la FIB. Definimos un hilo para
ser la secuencia máxima de instrucciones que no contienen el control paralelo de las
declaraciones spawn, sincronización, y el retorno. Los Hilos conforman el conjunto V de
vértices del cálculo multihilo dag G. Cada ejecución del procedimiento es una cadena lineal
de hilos, cada uno de los cuales está conectado a su sucesor en la cadena por un borde de
continuación. Cuando un hilo genera un subproceso V, el DAG contiene un borde de
spawn(u, v) E, así es como un borde de continuación de u al sucesor de u en el
procedimiento. Cuando un hilo u se devuelve, el DAG contiene un borde (u, v), donde V es
el hilo que sigue inmediatamente a la siguiente sincronización en el procedimiento
principal. Cada cálculo comienza con un solo hilo de denominado hilo inicial y
(suponiendo que el cálculo termina), termina con un solo hilo final. Dado que los
procedimientos se organizan en una jerarquía de árbol, podemos ver el cálculo como un
DAG de hilos embebidos en el árbol de los procedimientos.

1.2. Medidas de Rendimiento:


Dos medidas de desempeño son suficientes para medir la eficiencia teórica de los
algoritmos de multiproceso. Definimos el trabajo de un cálculo multiproceso para ser el
tiempo total a ejecutar todas las operaciones en el cálculo de un procesador. Definimos la
longitud de la ruta crítica de un cálculo, que sería el tiempo más largo para ejecutar los
hilos a lo largo de cualquier camino de dependencias en el GDA. Consideremos, por
Figura 1: Un dag representa el cálculo multiproceso de FIB (4). Los hilos se muestran como
círculos, y cada grupo de hilos que pertenecen al mismo procedimiento están rodeados por
rectángulo debajo de los bordes son de dependencias spawn, bordes horizontales
representan dependencias de continuación dentro de un procedimiento, y los bordes
ascendentes son dependencias de retorno.

Ejemplo, el cálculo en Figura1. Supongamos que cada hilo puede ejecutarse en una unidad
de tiempo. Luego, el trabajo de cálculo llevaría 17 años, y la longitud del camino crítico es
8.
Cuando un cálculo multiproceso se ejecuta en un determinado número P de procesadores,
su tiempo de funcionamiento depende de la eficiencia del planificador subyacente que
puede ejecutarlo. Denotemos por TP el funcionamiento del tiempo de un cálculo dado en
procesadores P. Luego, el trabajo de cálculo se puede ver como T1, y la longitud del
camino crítico se puede ver como T∞.
El trabajo y la longitud del camino crítico se pueden utilizar para proporcionar límites
inferiores en el tiempo de ejecución en P procesadores. Tenemos

TP ≥ T1/P,

Ya que en un solo paso, un ordenador P-procesador puede hacer en la mayoría del trabajo P.
También tenemos

TP ≥ T∞ ,

ya que un equipo con procesador P no puede hacer más trabajo en un solo paso de un
equipo con procesador infinito. La velocidad de un cálculo en procesadores P es la relación
T1 / TP, que indica cuántos veces más rápido la ejecución P-procesador es que una
ejecución de un procesador. Si T1 / TP =? (P), entonces decimos que la ejecución por P-
procesador exhibe un crecimiento lineal. La máxima velocidad posible hasta es T1 / T∞,
que también se llama paralelismo del cálculo, porque representa la media de la cantidad de
trabajo que se puede hacer en paralelo para cada paso a lo largo de la ruta crítica.
Denotamos el paralelismo de un cálculo por P.

1.3 Programación Greedy:


El programador de una aplicación multiproceso tiene la capacidad de controlar el trabajo y
la longitud del camino crítico de su aplicación, pero no tiene control directo sobre la
programación de su aplicación en un determinado número de procesadores. Es hasta el
planificador de tiempo de ejecución para mapear el cálculo despliegue dinámico sobre los
procesadores disponibles de manera que el cálculo se ejecuta de manera eficiente. Los
buenos programadores en línea son conocidos [3, 4, 5], pero su análisis es complicado. Para
simplificar, vamos a ilustrar los principios detrás de estos programadores utilizando un
programador "greedy" off-line.

A greedy horarios tanto como se pueda en cada paso de tiempo del planificador. En un
equipo P-procesador, los pasos de tiempo se pueden clasificar en dos tipos. Si hay P o más
hilos listos para ejecutar, el paso es un paso completo, y el planificador ejecuta cualquier
hilo de P de los que están dispuestos a ejecutar. Si hay menos de P subprocesos listos para
ejecutar, el paso es un paso incompleto, y el planificador ejecuta todos ellos. Esta
estrategia greedy es demostrablemente buena.

Teorema 1 (Graham [9], Brent [6]) Un planificador greedy ejecuta cualquier cálculo G
multiproceso con T1 trabajo y la duración de la ruta crítica T∞ en el tiempo

TP ≤ T1/P + T∞

en un equipo con P procesadores.

Prueba. Para cada paso completo, P trabajo es realizado por los P procesadores. Por lo
tanto, el número de pasos completos es como máximo de T1 / P, porque después de tales
pasos T1 / P, todo el trabajo en el cálculo se ha realizado. Ahora, considere un paso
incompleto, y considere el sub dag G' de G que queda por ejecutar. Sin pérdida de
generalidad, podemos ver cada uno de los hilos es ejecutado en cada unidad de tiempo, ya
que puede sustituir al hilo más largo con una cadena de hilos en cada unidad de tiempo.
Cada hilo con grado 0 está listo para ser ejecutado, ya que todos sus predecesores ya se han
ejecutado. Por la política de planificación greedy, todos esos hilos han sido ejecutados, ya
que no tales hilos son estrictamente menos que P. Así, la longitud de la ruta crítica de G' se
reduce en 1. Puesto que la longitud de la ruta crítica de la sub dag restante al ser ejecutado
disminuye en 1 en cada uno de los pasos incompletos, el número de pasos incompletos es a
lo sumo T∞. Cada paso es completo o incompleto, y por lo tanto la desigualdad (3)
siguiente.
_
Corolario 2 Un planificador greedy alcanza aceleración lineal cuando P = O(P).
_
Prueba. Desde P = T1/T∞, tenemos P = O(T1/T∞), o equivalente, que T∞ = O(T1/P). Así,
tenemos TP ≤ T1/P + T∞ = O(T1/P).

1.4 Cilk y ⋆Socrates

Cilk [4, 11, 10] es un paralelo, al lenguaje multiproceso basado en el lenguaje de


programación C. La instrumentación de series en el programador Cilk proporciona una
medida exacta de trabajo y la ruta crítica. Planificador aleatorizado de Cilk ejecuta
demostrablemente un cálculo multiproceso en un ordenador de P-procesadores en TP = T1 /
P + O (T∞) espera tiempo. Empíricamente, el planificador logra TP ≈ T1 / P + T∞ tiempo,
produciendo aceleración lineal casi perfecta si P «P.

Entre las aplicaciones que se han programado en Cilk son los programas que juegan al
ajedrez ⋆Socrates y Cilkchess. Estos programas han ganado numerosos premios en la
competencia internacional y se consideran entre las más fuertes del mundo. Se produjo una
interesante anomalía durante el desarrollo de ⋆Socrates que se resolvió mediante la
comprensión de las medidas de trabajo y la duración de la ruta crítica. El programa
⋆Socrates fue desarrollado inicialmente en un equipo de 32 procesadores en el MIT, pero se
pretendía ejecutar en un equipo con procesador 512 en el Centro Nacional para
Aplicaciones de Supercomputación (NCSA) de la Universidad de Illinois. Una
optimización inteligente se propuso que, durante las pruebas en el MIT, hizo que el
programa se ejecute mucho más rápido que el programa original. Sin embargo, la
optimización se abandonó, porque un análisis del trabajo y la duración de la ruta crítica
indicaron que el programa en realidad sería más lento en la máquina NCSA.

Examinemos esta anomalía con más detalle. Para simplificar, los números de temporización
reales que se han simplificado. El programa original corrió en T32 = 65 segundos en el MIT
en 32 procesadores. El Programa "optimizado" corrió en T´32 = 40 segundos también en 32
procesadores. El programa original tenía 32 procesadores para trabajar T1 = 2,048
segundos y la duración de la ruta crítica T∞ = 1 segundo. Utilizando la fórmula TP = T1 / P
+ T∞ como una buena aproximación del tiempo de ejecución, descubrimos que,
efectivamente, T32 = 65 = 2048/32 + 1. El programa "optimizado" tenía trabajo T1 = 1,024
segundos y la longitud de la ruta crítica T∞ = 8 segundos, produciendo T '= 40 = 1024/32 +
8. Pero, ahora vamos a determinar los tiempos de ejecución de 512 procesadores. 32
Tenemos T512 = 2048/512 + 1 = 5 y T512 = 1024/512 + 8 = 10, que es el doble de lento!
Por lo tanto, mediante el uso de trabajo y la longitud de la ruta crítica, podemos predecir el
rendimiento de un cálculo multiproceso.

1.1 Ejercicio. Dibuje el cálculo multihilo que resulta de la ejecución de la FIB (5). Suponga
que todos los hilos en el cálculo se ejecutan en la unidad de tiempo. ¿Cuál es el trabajo del
cálculo? ¿Cuál es la longitud del camino crítico? Mostrar cómo programar el GDA en 2
procesadores de una manera greedy etiquetando cada hilo con el paso de tiempo en el que
se ejecuta.
2.1 Ejercicio. Considere lo siguiente, SUM procedimiento multiproceso para parejas
añadiendo los elementos de las matrices A [1..n] y B [1..n] y almacenar las sumas en C
[1..n]:
Determine un asintótica atado en el trabajo, la longitud de la ruta crítica, y el paralelismo
del cálculo en términos de n. Dar un algoritmo divide y vencerás para el problema de que es
lo más paralelo posible. Analice su algoritmo.

1.3 Ejercicio. Demostrar que un programador greedy alcanza la cota más fuerte

TP ≤ (T1 − T∞)/P+ T∞ . (4)

1-4 Ejercicio. Demostrar que el tiempo de un planificador greedy para ejecutar cualquier
cálculo multiproceso está dentro de un factor de 2 parte del tiempo requerido por un
planificador óptimo.

1.5 Ejercicio. Por lo que el número P de la industria transformadora de los dos programas
de ajedrez que se describen en esta sección funcionan igual de rápido? T ejercicio 1-6.
Profesor Tweed toma algunas medidas de su (determinista) programa multiproceso, que
está previsto el uso de un planificador greedy, y encuentra que T4 = 80 segundos y 64 = 10
segundos. ¿Cuál es el más rápido? ¿el cálculo del profesor podría funcionar con 10
procesadores? Utilice la Desigualdad (4) y los dos límites inferiores de las desigualdades
(1) y (2) que se derivan de su respuesta.

2 Análisis de algoritmos multihilo

Pasamos ahora al diseño y análisis de algoritmos multihilo. Debido a la naturaleza de


divide y vencerás del modelo multiproceso, las recidivas son una forma natural de expresar
el trabajo y la duración de la ruta crítica de un algoritmo de multiproceso. Vamos a
investigar algoritmos para la multiplicación de matrices y clasificar y analizar su
rendimiento.

Vous aimerez peut-être aussi