relacion ejercicios 1

13
Capítulo 1. INTRODUCCIÓN AL PROCESAMIENTO PARALELO. 1. Considerar la ejecución de un código objeto con 200.000 instrucciones en un procesador a 40 MHz. Las mezcla de instrucciones y el número de ciclos (CPI) necesarios para cada tipo de instrucción se dan en la tabla, basados en los resultados de un programa traza. Tipo de Instrucciones CPI Mezcla de Instrucciones Aritmñético-Lógicas 1 60% Load/Store 2 18% Salto 4 12% Referencia de memoria con fallo de caché 8 10% Considerar la ejecución paralela del programa en un sistema de 4 procesadores con memoria compartida. El programa se puede dividir en cuatro partes iguales (50.000 cada una) para una ejecución balanceada por los cuatro procesadores. Debido a la necesidad de sincronización entre las cuatro partes paralelas, se tienen que añadir 5000 instrucciones extras a cada parte. Asumir la misma mezcla de instrucciones para cada parte del programa dividido. El CPI para las instrucciones de referencia a memoria (con fallo de cache) se ha incrementado de 8 a 12 ciclos debido a las contenciones. El CPI para los restantes tipos de instrucciones no cambia. a) Calcular el CPI medio cuando el programa se ejecuta en el sistema de 4 procesadores. Para calcular el CPI podemos hacerlo de dos formas: 1. Forma 1: Podemos saber los ciclos totales del programa calculándolo así: 1. 2. 3. 4. Por tanto: Pero este sería el CPI si la ejecución fuera con un único procesador, y se nos pregunta el CPI para una ejecución paralela con 4 procesadores, cuando ejecutamos el programa en paralelo se añaden 5.000 a cada parte (ya que el programa se divide en 4 partes cada una se ejecutará en un procesador) instrucciones debidos al overhead creado por la sincronización, por tanto tendremos un total de Además el CPI de las instrucciones de fallo a memoria ha aumentado de 8 a 12 Para saber el CPI hacemos el mismo proceso que antes: 1.

Upload: kuma-sanchez

Post on 26-Jul-2015

188 views

Category:

Engineering


1 download

TRANSCRIPT

Page 1: Relacion Ejercicios 1

Capítulo 1. INTRODUCCIÓN AL PROCESAMIENTO PARALELO.

1. Considerar la ejecución de un código objeto con 200.000 instrucciones en un procesador a 40 MHz. Las mezcla de instrucciones y el número de ciclos (CPI) necesarios para cada tipo de instrucción se dan en la tabla, basados en los resultados de un programa traza.

Tipo de Instrucciones CPI Mezcla de Instrucciones Aritmñético-Lógicas 1 60%

Load/Store 2 18% Salto 4 12%

Referencia de memoria con fallo de caché

8 10%

Considerar la ejecución paralela del programa en un sistema de 4 procesadores con memoria compartida. El programa se puede dividir en cuatro partes iguales (50.000 cada una) para una ejecución balanceada por los cuatro procesadores. Debido a la necesidad de sincronización entre las cuatro partes paralelas, se tienen que añadir 5000 instrucciones extras a cada parte. Asumir la misma mezcla de instrucciones para cada parte del programa dividido. El CPI para las instrucciones de referencia a memoria (con fallo de cache) se ha incrementado de 8 a 12 ciclos debido a las contenciones. El CPI para los restantes tipos de instrucciones no cambia. a) Calcular el CPI medio cuando el programa se ejecuta en el sistema de 4 procesadores.

Para calcular el CPI podemos hacerlo de dos formas: 1. Forma 1:

Podemos saber los ciclos totales del programa calculándolo así: 1.

2.

3.

4.

Por tanto:

Pero este sería el CPI si la ejecución fuera con un único procesador, y se nos pregunta el CPI para una ejecución paralela con 4 procesadores, cuando ejecutamos el programa en paralelo se añaden 5.000 a cada parte (ya que el programa se divide en 4 partes cada una se ejecutará en un procesador) instrucciones debidos al overhead creado por la sincronización, por tanto tendremos un total de

Además el CPI de las instrucciones de fallo a memoria ha aumentado de 8 a 12 Para saber el CPI hacemos el mismo proceso que antes:

1.

Page 2: Relacion Ejercicios 1

2.

3.

4.

Por tanto:

Ya tenemos el CPI medio, para saber el CPI de un solo procesador:

2. Forma 2: También podemos calcular el CPI de una forma más rápida y sencilla:

b) Calcular la correspondiente velocidad en MIPS cuando el programa se ejecuta en el sistema de 4

procesadores. Para calcular la velocidad la podemos calcular como la frecuencia del procesador divido entre el CPI

Entonces hay una velocidad 15’15MIPS por procesador, como tenemos 4 procesadores entonces habrá una velocidad total de:

c) Calcular el speedup (o ganancia de velocidad) del sistema de 4 procesadores sobre el sistema

uniprocesador.

( ) ( )

Para el tiempo paralelo como terminan los procesadores a la vez el tiempo que termina en paralelo es el tiempo que termina un procesador

Page 3: Relacion Ejercicios 1

d) Calcular la eficiencia del sistema de 4 procesadores comparando el speedup obtenido en el apartado (c) con el caso ideal.

N = 4

En un caso ideal, la eficiencia obtenida sería máxima, del 100%, es decir, G = Nº procesadores

Podemos concluir que la eficiencia real quedará por debajo de la eficiencia ideal, es comprensible que tengamos una eficiencia menor porque al introducir el sistema de 4 procesadores, hay un overhead debido a la sincronización y el CPI también aumenta.

2. El siguiente segmento de código, formado por seis instrucciones, necesita ejecutarse 64

veces para la evaluación de la expresión aritmética vectorial: D(I) = A(I) + B(I)·C(I):

Load R1, B(I) /R1<-- Memoria(+I)

Load R2, C(I) /R2 Memoria(+I)

Multiply R1,R2 /R1<-- (R1) x (R2)

Load R3, A(I) /R3<-- Memoria(+I)

Add R3,R1 /R3<-- (R3)+(R1)

Store D(I),R3 /Memoria(+I)<-- (R3)

donde R1, R2, y R3 son registros de la CPU, (R1) es el contenido de R1, y son las direcciones de comienzo de memoria de los arrays B(I), C(I), A(I) y D(I) respectivamente. Asume cuatro

ciclos de reloj para cada Load o Store, dos ciclos para el Add, y ocho ciclos para la

multiplicación en un uniprocesador o en un sólo PE en una máquina SIMD.

a) Calcula el número total de ciclos de CPU necesarios para ejecutar repetidamente

durante 64 veces el código anterior en un computador SISD, ignorando todos los otros

retardos de tiempo.

Tipo CPI NI Ciclo/inst

Load/store 4 4 16

Add 2 1 2

Multiply 8 1 8

En cada iteración se necesitan estos ciclos:

Tipo CPI

Load 4

Load 4

Multiply 8

Load 4

Add 2

Store 4

26

Por tanto son 26 ciclos en una sola iteración, como se dan 64 iteraciones entonces son:

Page 4: Relacion Ejercicios 1

b) Considerar el uso de un computador SIMD con 64 PEs para ejecutar el código anterior

en seis instrucciones vectoriales sincronizadas sobre vectores de datos de 64

componentes, dirigidos por la misma velocidad del reloj. Calcula el tiempo total de

ejecución en la máquina SIMD, ignorando el resto de retardos.

c) ¿Cuál es el speedup del computador SIMD sobre el computador SISD?.

3. Sea α el porcentaje de código de un programa que se puede ejecutar simultáneamente por n

procesadores. Asume que el código restante se debe ejecutar secuencialmente por un sólo

procesador. Cada procesador tiene una velocidad de ejecución de x MIPS, y se asume que

todos los procesadores tienen la misma capacidad.

a) Obtener una expresión para la velocidad efectiva en MIPS cuando se usa el sistema para

la ejecución exclusiva de este programa, en términos de los parámetros n, α y x.

α=parte paralelizable.

1-α=parte secuencial.

n=nº de procesadores.

Además, sabemos que:

(cuando queremos calcular la ganancia, podemos usar tanto el tiempo , como los MIPS, es

decir, si usamos el tiempo pues el tiempo secuencial se pone arriba y el tiempo paralelo se

pone abajo, ya que el tiempo secuencial será mucho mayor ya que se tarda mucho más cuando

se ejecuta en un procesador que cuando se ejecuta en paralelo con muchos procesadores, por

tanto imagínate que en secuencial tarda 100 segundos , y en paralelo se tarda 10 segundos,

entonces la ganancia calculándola con el tiempo será 100/10= 10 , una ganancia

Con la fórmula anterior podemos igualarla con la fórmula de la ganancia de la ley de Amdahl,

como 𝜶 es la parte paralelizable:

𝜶 ( 𝜶)

𝜶 ( 𝜶)

𝜶 ( 𝜶)

𝜶 𝜶

𝜶 𝜶

𝜶 𝜶

𝜶 𝜶

( 𝜶) 𝜶

Por tanto tenemos dos fórmulas de la ganancia, e igualando las 2 fórmulas podemos despejar

el valor de:

Page 5: Relacion Ejercicios 1

{

( 𝜶) 𝜶

Entonces conseguimos la expresión

( 𝜶) 𝜶

b) Si n=16 y x=4 MIPS, determinar el valor de α que nos lleva a un rendimiento del sistema

de 40MIPS.

Un rendimiento de 40MIPS es el rendimiento de los MIPS en paralelo, el rendimiento de los

MIPS en secuencial sería la velocidad de un procesador es decir 4MIPS

( 𝜶) 𝜶

( 𝜶) 𝜶

( 𝜶) 𝜶

𝜶 𝜶

𝜶

𝜶 ( 𝜶) 𝜶 𝜶

𝜶

𝜶

Es decir se necesita que un 96% del código sea paralelizable para conseguir una velocidad de

40MIPS en paralelo

4. El siguiente programa Fortran se ejecuta en un uniprocesador, y la versión paralela se va a ejecutar en un multiprocesador de memoria compartida.

L1: Do 10 I=1,1024 L2: SUM(I)=0

L3: Do 20 J=1,I L4: 20 SUM(I)=SUM(I)+I

L5: 10 Continue

Supón que las sentencias L2 y L4 necesitan dos ciclos máquina, incluyendo todas las actividades de la CPU y acceso a memoria. Ignorar el gasto extra causado por el control software del lazo (sentencias L1, L3 y L5) y todos las demás penalizaciones del sistema (overhead). a) ¿Cuál es el tiempo total de ejecución del programa en un uniprocesador?

El bucle externo se repite 1024 veces, por tanto el bucle externo necesita:

El bucle interno se repite:

Page 6: Relacion Ejercicios 1

Entre el bucle interno y el bucle externo suman un total de:

Por tanto podemos calcular los ciclos que tarda el algoritmo en secuencial (por un solo procesador):

El tiempo que tarde (el tiempo de ejecución) dependerá de la frecuencia del procesador que no nos la dio el ejercicio, entonces dejamos el tiempo dependiente de la frecuencia:

b) Divide las iteraciones del lazo I entre 32 procesadores con la siguiente asignación: El

procesador 1 ejecuta las primeras 32 iteraciones (I=1 a 32), el procesador 2 ejecuta las siguientes 32 iteraciones (I=33 a 64) y así. ¿Cuál es el tiempo de ejecución y el speedup comparado con el apartado (a). (Tener en cuenta que la carga de trabajo dada por el lazo J no está balanceada entre los procesadores)

Aquí no hacemos una división de carga balanceada, ya que el primer procesador tendrá menos iteraciones y el último procesador tendrá que hacer más iteraciones ya que por ejemplo, en este caso: Iteraciones procesador 1: El procesador dará de la iteración 1 a la iteración 32, por tanto:

{

Iteraciones procesador 32: El procesador 32 dará las 32 últimas iteraciones, por tanto:

{

∑ ∑

Ahora podemos resolverlo

∑ ∑

Page 7: Relacion Ejercicios 1

Por tanto el procesador 32 dará las siguientes iteraciones:

{

Por tanto podemos comprobar que no es una ejecución balanceada ya que

Procesador Nº Iteraciones

Procesador 1 560

Procesador 32 32.304

Debido a esto el algoritmo tardará lo que tarde el último procesador:

Como conocemos el tiempo de ejecución en secuencial (con un solo procesador) y conocemos el tiempo de ejecución en paralelo entonces podemos calcular la ganancia:

c) Modificar el programa para facilitar una ejecución paralela balanceada de toda la carga de

trabajo en los 32 procesadores. Es decir, igual número de sumas asignadas a cada procesador con respecto a ambos lazos.

Doall l=1,32

Do 10 I=(l-1)*16+1, l*16 SUM(I)=0 Do 20 J=1,I

20 SUM(I)=SUM(I)+J 10 Continue Do 30 I=(64-l)*16+1, [(64-l)*16 ]+16

SUM(I)=0 Do 40 J=1,I 40 SUM(I)=SUM(I)+J

30 Continue Endall Para ejecutar este algoritmo partimos el programa en 64 trozos, el primer procesador ejecutará las 16 primeras iteraciones (las menos pesadas) y ejecutará también las 16 últimas iteraciones (las más pesadas), de esta forma iremos balanceando la carga de tal forma que:

Procesador Nº Iteraciones

Procesador 1 Desde i=1 hasta i=16 y Desde i=1009 hasta i=1024

Procesador 2 Desde i=17 hasta i=32 y Desde i=993 hasta i=1008

Y así sucesivamente

Page 8: Relacion Ejercicios 1

d) ¿Cuál es el tiempo de ejecución mínimo resultante de la ejecución paralela balanceada en los 32 procesadores?. ¿Cuál es el nuevo speedup sobre el uniprocesador?.

De esta forma todos los procesadores tendrían que realizar el mismo número de iteraciones, es decir se reparter igualmente entre los 32 procesadores, como sabemos que en secuencial (un solo procesador) tiene que hacer 1.051.648 ciclos para terminar el algoritmo entonces con esta nueva forma de balanceo cada procesador tendría que hacer solamente:

Por tanto el tiempo de ejecución del algoritmo sería lo que tarde uno de los procesadores , ya que terminarían a la vez:

El speed up que conseguimos es el siguiente:

Por tanto hemos conseguido una eficiencia perfecta.

5. Dados dos esquemas A y B de multiplicación de matrices, ambos tienen el mismo número de procesadores. Los tiempos de ejecución paralelos y las eficiencias de estos sistemas se muestran en la tabla. Tened en cuenta que el tiempo secuencial para multiplicar dos matrices es

aproximadamente T1= cN3 y la eficiencia viene definida por

Esquemas Tiempo de ejecución paralelo Tn Eficiencia E

A

√ ( )

B

√ ( )

En cada una de las expresiones de tiempo paralelas, el primer término denota el tiempo de cálculo y el segundo el overhead de comunicación. La diferencia es que B tiene la mitad de overhead que A pero a expensas de doblar el tiempo de cálculo. ¿Qúe sistema es más escalable asumiendo que queremos mantener (1) E=1/3 y (2) E=1/4? (La carga para un problema de multiplicación de matrices NxN es aproximadamente W = N3). Decimos que un sistema es escalable cuando hay que aumentar poco la carga para mantener la eficiencia constante. Para poder comprobar cuál de las opciones es la más escalable debemos de obtener la expresión de la carga de cada una de las opciones, y una vez que las tengamos podemos comparar dichas expresiones, la expresión que tenga que aumentar menos la carga para mantener la eficiencia será la opción más escalable.

Page 9: Relacion Ejercicios 1

a) ¿Qué sistema es el más escalable si mantenemos una eficiencia de E=1/3?. En este apartado nos dicen que sistema es el más escalable si queremos tener una eficiencia constante de ⅓, por tanto nos dan los siguientes datos:

- Eficiencia=1/3

- ( )

- ( )

- La carga que implica la multiplicación de matrices es aproximadamente W=N3 Los que vamos hacer ahora es igualar las expresiones con el valor de la eficiencia el cual nos lo ha dado el ejercicio:

{

( )

Una vez que tenemos el valor de N, podemos sustituir este valor en la expresión de la carga:

{

( )

( ) ( √

)

(

)

√ (

)

( ) (

)

Ya tenemos la expresión de carga para la opción A, ahora tenemos que repetir el proceso para calcular la expresión de carga de B. Los que vamos hacer ahora es igualar las expresiones con el valor de la eficiencia el cual nos lo ha dado el ejercicio:

( )

Una vez que tenemos el valor de N, podemos sustituir este valor en la expresión de la carga:

{

( )

( ) ( √

)

(

)

√ (

)

( ) (

)

Page 10: Relacion Ejercicios 1

Una vez que tenemos las expresiones de la carga para la opción A y para la opción B, ahora si podemos compararlas:

( ) ( √

)

(

)

( ) ( √

)

(

)

Podemos observar que la expresión de la carga es la misma, es decir W(A) = W(B) por tanto cualquiera de las opciones son igual de escalables si queremos mantener una eficiencia constante de ⅓.

( ) ( )

b) En el apartado b seguimos el mismo procedimiento, solo que cambia el dato de la eficiencia. En este apartado nos dicen que sistema es el más escalable si queremos tener una eficiencia constante de ¼, por tanto nos dan los siguientes datos:

- Eficiencia=1/4

- ( )

- ( )

- La carga de la multiplicación de matrices se puede calcular mediante la siguiente función: W=N3

Lo que vamos hacer ahora es igualar las expresiones con el valor de la eficiencia el cual nos lo ha

dado el ejercicio:

( )

Una vez que tenemos el valor de N, podemos sustituir este valor en la expresión de la carga:

{

( )

( ) ( ) ( √

)

(

)

( ) (

)

Ya tenemos la expresión de carga para la opción A, ahora tenemos que repetir el proceso para calcular la expresión de carga de B. Los que vamos hacer ahora es igualar las expresiones con el valor de la eficiencia el cual nos lo ha dado el ejercicio:

( )

Page 11: Relacion Ejercicios 1

Una vez que tenemos el valor de N, podemos sustituir este valor en la expresión de la carga:

{

( )

( ) ( ) ( √

)

(

)

( ) (

)

Una vez que tenemos las expresiones de la carga para la opción A y para la opción B, ahora si podemos compararlas:

( ) ( √

)

(

)

( ) ( √

)

(

)

En este caso vemos que las expresiones que describen la carga son prácticamente iguales pero difieren en el denominador, vemos que el que aumenta menos la carga es la opción B por tanto en este caso la opción más escalable es la opción b.

( ) (

)

( ) (

)

6. Considerar un programa con una carga de trabajo de una unidad W=1 y un cuello de botella secuencial de cero (α = 0): Estimar el speedup de tiempo fijo, S’n para cada una de las siguientes asunciones: a) ¿Cuál es la expresión (big-O) del speedup escalado para un overhead T0 = O(n-0,5)? ¿Podrías

conseguir un speedup lineal? Para calcular el speed up escalado se utiliza la ley de Gustafson, y sustituimos las incógnitas de la fórmula con los siguientes datos:

W=1 α=0 To=O(n-0.5)

( )

( )

( )

( )

Por tanto la expresión de la ganancia escalada es:

Ahora nos piden la expresión big-O, esta es la cota superior, para calcular esto tenemos que hacer el limite cuando n(el número de procesadores) tiende a infinito, para ver qué ocurre según la ley de gustafson conforme vamos añadiendo procesadores

Conseguimos un speedup lineal (superspeed up)

Page 12: Relacion Ejercicios 1

b) ¿Cuáles son las posibles razones para tener un speedup superlineal en aplicaciones de

computación paralela reales? Siempre que el overhead sea constante conseguiremos un superspeedup lineal. Posibles razones para conseguir un speed up superlineal: 1. Aumento de la memoria caché: cuando aumentamos el número de nodos también se aumenta la

memoria caché disposible, ya que cada procesador además de poder procesar tiene una memoria caché asociada, por tanto se pueden tener más datos en memoria caché y el tiempo de acceso a los datos disminuirá.

2. Aumento de la memoria RAM: lo mismo que ocurre con la memoria caché, al tener más procesadores también tendremos más memoria RAM y por tanto podremos tener más datos en memoria principal que el memoria secundaría y esto hará que el acceso a los datos sea mas rápido.

3. El tipo de algoritmo que se ejecute: hay algoritmo como por ejemplo los algoritmos de backtracking que permiten podar ramas, cuando un hilo poda una rama evita que otro hilo entre a buscar en esa rama.

c) Repetir el apartado (a) para un overhead T0 = O(1) y comentar los resultados.

W=1 α=0 To=O(n-0.5)

( )

(

)

Por tanto:

Por lo que, como tenemos un overhead constante, entonces tendremos un speed up lineal

d) Repetir el apartado (a) para un overhead T0 = O(logn) e interpretar el resultado. ¿Es posible conseguir un speedup lineal si el speedup es más que una constante?.

W=1 α=0 To=O(logn)

( )

( )

( )

Por tanto:

Por lo que, tenemos un crecimiento lineal, aunque tendría un crecimiento levemente menor al caso anterior. Si el overhead es mayor que n, entonces tendríamos un crecimiento inferior al lineal mientras que si es menor que n, entonces si podríamos disponer de un crecimiento lineal.

Page 13: Relacion Ejercicios 1

7. Un programa tarda 40 s en ejecutarse en un multiprocesador. Durante un 20% de ese tiempo se ha ejecutado en 4 procesadores, durante un 60% en tres; y durante el 20% restante, en un procesador (consideramos que se ha distribuido la carga de trabajo por igual entre los procesadores que colaboran en la ejecución en cada momento, y despreciamos la sobrecarga). ¿Cuánto tiempo tardaría en ejecutarse el programa en un único procesador? ¿Cuál es la ganancia en velocidad obtenida con respecto al tiempo de ejecución secuencial? ¿Y la eficiencia? a) ¿Cuánto tiempo tardaría en ejecutarse el programa en un único procesador? Separamos cada parte para ver cuánto tarda cada una y cuanto procesadores necesita cada parte:

El 20% se ejecutó en 4 procesadores:

El 60% se ejecutó en 3 procesadores

El 20% que queda se ejecutó en 4 procesadores:

En el caso de que quisiésemos ejecutar el programa en un solo procesador, entonces el tiempo que tardará sería el siguiente:

b) ¿Cuál es la ganancia en velocidad obtenida con respecto al tiempo de ejecución secuencial? Para determinar la ganancia dividimos lo que se tarda en secuencial (con un solo procesador) entre lo que se tarda con varios procesadores (tiempo en paralelo)

c) ¿Y la eficiencia?