sábado, 21 de mayo de 2011

High Performance Computing

Hola nuevamente a toda la comunidad, estaba un poco retirado de blog, la razón es por que he tenido muchisimos compromisos este semestre y no he tenido tiempo de editarlo, sin embargo aqui tienen una nueva entrada, espero que les guste... se trata de High Performance Computing. Iniciemos este post hablando un poco sobre la computación paralela. Una idea bastante general de la computación paralela es producir el mismo resultado de un programa secuencial, pero usando multiples procesadores de tal forma que las instrucciones se puedan repartir entre estos procesadores y asi obtener el mismo resultado, pero esto con un solo objetivo reducir el tiempo de ejecución. Niveles de Paralelismo.
  1. Nivel de aplicación dentro de un Computador.
  2. Nivel de programa o tarea dentro de una aplicación.
  3. Nivel de procedimiento dentro de un programa.
  4. Nivel de lazo dentro de un programa.
Para el primer nivel se produce entre aplicaciones independientes es decir queremos ejecutar varios programas a la vez, entonces podriamos asignar una aplicación a cada procesador, esto seria algo de paralelismo. Para el segundo trata de paralelismo entre tareas distintas que cooperan. Para el tercero son fragmentos de codigo o subrutinas, por ejemplo: Calculo de notas de estudiantes, la media, desviación  etc. Y finalmente para el cuarto corresponde a las iteraciones dentro de un lazo, por ejmplo: dividir las iteraciones entre dos procesadores, un procesador hace las sumas con números pares y otro hace la suma con números impares, se acumulan las sumas en variables como suma1 y suma2 y luego un procesador suma ambas. Con esto el tiempo se reduciria a la mitad, comparandolo con el tiempo que le llevaria hacer esto al secuencial.

MEDIDAS DE RENDIMIENTO DE UN PROGRAMA.

ACELERACION: (Speed up) \[S(p) = \frac{T(1)}{T(p)}\] donde \[T(1)\] es el tiempo secuencial del programa y \[T(p)\] el tiempo que demora con \[p\] procesadores.
EFICIENCIA: \[E(p)=(\frac{S(p)}{p})100\%\].

Ejemplo:
  • Tiempo en 1 cpu = \[100_{seg} = T(1)\].
  • Tiempo en 15 cpu = \[12_{seg} = T(15)\].
Entonces la aceleración será de \[\frac{100}{12} = 8.3_{seg}\] y la eficiencia de \[(\frac{8.3}{15})100\% = 55.3\%\].

Podemos definir a la aceleración como la cantidad de veces mas rápido de un  programa en paralelo al secuencial. El caso ideal: \[S(p)=p\]. Y podemos definir a la eficiencia como aquella que mide que tan bien esta paralelizado nuestro programa, el caso ideal seria \[100\%\]. 

LEY DE AMDAL
"La eficiencia obtenida en una implementación paralela viene limitada por la parte secuencial, la cual es aquella parte del programa que no es paralelizable."

Siempre hay una fracción del programa que no es paralelizable
  1. Ejemplo: Podemos hacer sumas parciales en varios procesadores pero al final, hay un solo procesador el cual hae la suma global. Esta parte seria no paralelizable.
  2. Ejemplo: Suponga que el \[20\%\] de un código es secuencial, entonces \[T(1) = T(paralelo)+T(secuencial) = 80+20 \]. Usando \[p\] procesadores si \[p\rightarrow{}\infty\] entonces como: \[T(p)=\frac{S(p)}{p}+20\ge20\] es decir no pasa de 20. Y como \[S(p)=\frac{T(1)}{T(p)}=\frac{100}{\frac{80}{p} + 20}\leq5\] no pasaria de 5. Y luego \[E(p)=\frac{S(p)}{p}\leq S(p)\] tenderia a 0.

Si queremos obtener ganancias para el paralelismo dado un programa secuencial, hay que disminuir lo mas posible la parte secuencial.





Bueno muchachos los dejo hasta aquí, hasta mi nuevo post que tratara sobre Tipos de Arquitecturas paralelas.



0 comentarios:

Publicar un comentario