jueves, 27 de agosto de 2015

Ley de Gustafson



Hay dos pilares distintos de la ley de Gustafson .

Lema 1 :
Existe cargas de trabajo que se comportan como los gases en la naturaleza: Cuando se proporciona con más poder de cómputo , se expanden para consumir el poder recién proporcionado .

Estos programas son más comunes de lo que se piensa .Algunos ejemplo de la vida real:
1. Gráficos . Con más poder de cómputo , solo de ejecutaran los cuadros a una resolución mayor o con más detalles.
2. El análisis numérico, como computar el numero pi. Con mas poder de computo , solo se calculan más dígitos de pi.
3. Predicción del tiempo . Con mas poder de computo, solo se ejecuta el software más tiempo para obtener predicciones más precisas.
Lema 2 :
Cuando Se Aumenta el Tamaño del Problema , la porción paralela se EXPANDE Más rapidamente que porción de serie .

EJEMPLO Multiplicar una matriz por una matriz ( MMM ) . La Configuración de MMM , por ejemplo .. inicializar las matrices aumenta linealmente con el tamaño de la matriz .sin embargo, el cálculo real es O (n ^ 3 ) .



¿ Qué implicaciones tiene la ley de Guftafson?

La ley de Guftafson solo se aplica para cargas de Trabajo en donde se cumplen las dos condiciones anteriores . Si una carga de trabajo sigue la ley de Gustafson , es un problema.


¿Que no implica la ley de Guftafson?

Esto no implica que la ley de Amdahl este muerta . Simplemente implica que la ley de Amdahl es menos Importante en algunas cargas de trabajo. Menos porque se debe seguir considerando la parte en serie que afecta al rendimiento ,pero en un menor grado.

Hay muchas cargas de trabajo que no siguen este comportamiento expansivo . Por ejemplo , al ordenar una lista de números en Excel , no voy se aumentara el tamaño de la hoja de calculo si el equipo se hace más rápido . Del mismo modo, cuando con un corrector ortográfico , no se tienen que escribir documentos más largos si la computadora se hace mas rápida.

Referencias:
http://www.futurechips.org/thoughts-for-researchers/parallel-programming-amdahls-law-gustafsons-law.html


La ley de Amdahl


La ley de Amdahl se puede utilizar para determinar la cantidad de computo que puede ser acelerado mediante la ejecución en paralelo. La ley de Amdahl debe su nombre a Gene Amdahl quien presentó la ley en 1967.

Un programa ( o algoritmo ) se puede dividir en dos partes :
Una parte que no se puede implementar en paralelo
Una parte que puede ser implementada en paralelo
Imagine un programa que procesa los archivos desde el disco. Una pequeña parte de ese programa puede escanear el directorio y crear una lista de archivos en la memoria interna . Después de eso, cada archivo se pasa a un hilo separado para su procesamiento. La parte que analiza el directorio y crea la lista de archivos no puede ejecutarse en paralelo , pero el procesamiento de los archivos si.

El tiempo total necesario para ejecutar el programa en serie ( no en paralelo) se llama T. El tiempo T incluye el tiempo de ambas partes no paralelizables y paralelizables . La parte no paralelizable se llama B. La parte paralelizable se conoce como T - B. La siguiente lista resume estas definiciones :

T = Tiempo total de ejecución en serie
B = tiempo total de parte no paralelizable
T - B = tiempo total de parte paralelizable ( cuando se ejecuta en serie , no en paralelo)
A partir de este se desprende que :

T = B + (T-B)                                                               
Puede parecer un poco extraño al principio que la partes que se pueden ejecutar en paralelo del programa no tengan su propio símbolo en la ecuación. Sin embargo, dado que la parte paralelizable de la ecuación se puede expresar utilizando total T Tiempo y B , la ecuación se ha reducido conceptualmente, lo que significa que contiene menos variables  diferentes de este forma.
Es la parte T - B , que puede ser acelerada mediante la ejecución en paralelo. 
Cuánto se puede acelerar depende del número de hilos o CPUs que se usen para ejecutarlo. El número de hilos o CPUs se llama N. La razon de velocidad con la que puede ejecutarse se representa asi:

(T - B) / N

Según la ley de Amdahl , el tiempo de ejecución total del programa cuando se ejecuta en paralelo utilizando N hilos o CPUs es:

T(N) = B + (T - B) / N


T ( N ) significa la ejecución total, con un factor de paralelización N. Por lo tanto , T se podría escribir 
T ( 1 ) , es decir, el tiempo de ejecución total, con un factor de paralelización de 1. Utilizando T ( 1 ) en lugar de T , Ley de Amdahl se ve asi:

T(N) = B + ( T(1) - B ) / N
Significa lo mismo.


Un Ejemplo de cálculo

Para entender mejor la ley de Amdahl , vamos a hacer un ejemplo de cálculo . El tiempo total para ejecutar un programa se establece en 1. La parte no paralelizable de los programas es 40 %, que a cabo de un tiempo total de 1 es igual a 0,4 . La parte paralelizable es por lo tanto igual a 1 - 0,4 = 0,6 .

El tiempo de ejecución del programa, con un factor de paralelización de 2 ( 2 hilos o CPUs que ejecutran la parte paralelizable , así que N es 2 ) sería:
T(2) = 0.4 + ( 1 - 0.4 ) / 2
     = 0.4 + 0.6 / 2
     = 0.4 + 0.3
     = 0.7
Haciendo el mismo cálculo con un factor de paralelización de 5 en lugar de 2 se vería así :
T(5) = 0.4 + ( 1 - 0.4 ) / 5
     = 0.4 + 0.6 / 5
     = 0.4 + 0.12
     = 0.52


Referencias:
http://tutorials.jenkov.com/java-concurrency/amdahls-law.html

PIPELINE


PIPELINE


PIPELINE
   Pipeline (Tuberias ) es un término que pertenece a la ingeniería de software  y consiste en una cadena de elementos de procesamiento
ordenados de tal manera que la salida de cada elemento es la entrada del siguiente elemento  con almacenamiento temporal
de datos o buffering entre todos  los procesos.
Sin título
Aplicaciones de pipelines en informática
– Pipelines graficos  se encuentran en la mayoría de las tarjetas graficadoras y consiste en múltiples unidades aritméticas o
CPUs completas  que implementan variados escenarios de operaciones típicas, por ejemplo calculos de luz y colores  renderizado
proyección de perspectiva entre otros.
– En software o tuberías  consiste en varios  procesos ordenados de tal forma que el flujo de salida de un proceso alimenta la entrada
del siguiente proceso. Como por ejemplo, los pipelines de Unix.
Consumo en la Aquitectura  Pipeline
A fin de reducir consumo  se investiga una solución de compromiso entre la
resolución por etapa y la cantidad de etapas.
El  método de escalamiento de capacitores está descrito para reducir la potencia  con el cual se ha sobredimensionado en las últimas etapas del caso de una arquitectura Pipeline convencional.
También   el uso de la corrección digital  permite eliminar los efectos no deseados
causados por imperfecciones en los comparadores  utilizando circuitos digitales de
bajo consumo y no muy alto costo.
Características de pipeline
Se puede hablar de niveles de paralelismo caracterizados de la siguiente manera:
–       Multiprogramación y Multiprocesamiento.- Estas acciones se toman a nivel de Programa o Trabajo.
–       Tarea o Procedimientos.- Acciones que se toman dentro de un mismo programa ejecutándose procesos independientes en forma simultánea.
–       Interinstrucciones.- Acciones a nivel de instrucción o sea  dentro de mismo proceso o tarea se pueden ejecutar instrucciones independientes en forma simultánea.
Referencias

martes, 25 de agosto de 2015

Programacion android con python

Hay un número creciente de recursos para ejecutar Python en Android. Kivy (y sus subproyectos ) se mencionan comúnmente , como una de las formas más maduras y populares para hacerlo, pero una cosa a la que se pone menos atención es los detalles de lo que puede hacer con el propio Python una vez que se ejecuta en el dispositivo - ¿Cuales son las limitaciones de esto ? ¿Podemos utilizar cualquier módulo de Python ? ¿Qué hay de llamar las API de Android, podemos usar todas las funciones de una aplicación Java ? Todas estas son preguntas un tanto principales , que son cosas que aborda Kivy o sus proyectos asociados.

python-para-android

Antes que nada, echemos un vistazo rápido a la herramienta Kivy que sirve para usar Python en Android. La funcionalidad básica de esta herramienta es construir primero una distribución, un directorio del proyecto Android que incluye todos los componentes que Kivy necesita para funcionar, compilados para Android por su NDK. Esto incluye, en particular, el propio intérprete de Python. La distribución también incluye un arranque de Java, una estructura de aplicación normal, cuyo trabajo consiste en mostrar la superficie OpenGL de Kivy y mediar entre Kivy y Android. Todos estos componentes pueden ser agrupados en un APK con la escritura del usuario Python y diferentes ajustes (icono, nombre, orientación, etc.) al gusto.

Esto es sólo el procedimiento básico, el APK puede (y lo hace) incluir mucho más que sólo estos elementos esenciales. Entre otras cosas, la mayor parte de la biblioteca estándar de Python está construida en forma predeterminada y módulos de Python puros se pueden incluir fácilmente asi que en general se pueden realizar tareas utilizando las mismas bibliotecas que se usarían en el escritorio.
Bibliotecas con componentes compilados son más complejas, pero se pueden construir e incluir siempre y cuando python para android tenga una receta de compilación para ellos (o usted proporcione una) - estos es a menudo bastante sencillo, basta con establecer algunas banderas de compilación y ejecutar el procedimiento de construcción normal, aunque algunos módulos necesitan parches adicionales. Python-para-Android incluye un buen número de recetas por defecto, incluyendo módulos muy populares como numpy, sqlite3, retorcida e incluso django!

Lo anterior es lo básico de cómo funciona androide-python pero está lejos de ser toda la historia, y puedes leer la documentación para obtener más información sobre la construcción de tus propios archivos APK - en particular, se recomienda utilizar Buildozer, que da a python android una interfaz más conveniente y puede gestionar algunas dependencias (en particular, el SDK y NDK de Android) automáticamente.

Llamar a las API de Android con PyJNIus

En el desarrollo de aplicaciones Android normales , la interacción con la API de Android es una parte importante que tiene efecto en cómo se comporta tu aplicación - la obtención de datos de los sensores , la creación de notificaciones , vibracion , pausar y reiniciar, o casi cualquier otra cosa . Kivy se ocupa de lo esencial por ti , pero hay muchas cosas que todavía querras administrar por ti mismo con Python. Por esta razón existe el proyecto PyJNIus , también desarrollado bajo la organización Kivy , que ajusta automáticamente el código Java en una interfaz de Python.

Como un simple ejemplo , aquí está el código Python para tener una vibración en un dispositivo Android por 10s :



   

  Si estás familiarizado con la API de Android, te darás cuenta de que esto es muy similar al código de Java que tendría que utilizar para la misma tarea ; PyJNIus solo nos permite llamar la misma API directamente desde Python. La mayor parte de la API de Android se puede llamar desde Python de la misma manera , lo que le permite alcanzar las mismas cosas como una aplicación normal de Java .

Los principales inconvenientes de utilizar directamente PyJNIus son que requiere una cierta comprensión de cómo se estructura la API de Android, y que es muy detallado - aunque este último solo refleja la naturaleza del código Java equivalente.




  
  

Google App Engine - Python

Google App Engine - Python

En este artículo se describe la creación de una aplicación web con Python en Google App Engine .

El ejemplo en este artículo es una lista de tareas simples.
.

1. Información general

Google ofrece con Google App Engine (GAE ) una infraestructura de computación en nube para la creación y ejecución de aplicaciones web en la infraestructura de Google .

El GAE es una plataforma para crear aplicaciones web. Google admite actualmente Python , Java y varios idiomas basados ​​en Java como lenguajes de programación para Google App Engine . Este artículo se centrará en el desarrollo con Python.

La computación en nube permite que los recursos del sistema se puedan asignar de forma dinámica para la aplicación bajo demanda. Actualmente el modelo de precios para el Google App Engine no está definida , pero Google ofrece una oferta inicial gratuita para el GAE .

Actualmente un usuario puede crear un máximo de 10 aplicaciones en la App Engine Google .


2. Instalación

Descargar e instalar Python 2.5.2 . Esta es la versión que se ejecuta en el Google App Engine y por lo tanto se debe utilizar . http://www.python.org/download/releases/2.5.2/

Descargue la versión de Python de la App Engine Google del sitio de descarga para el GAE . La página principal del GAE es http://code.google.com/intl/en/appengine/

En la página principal que hay que crear una cuenta si aún no lo ha hecho .

3. El desarrollo de su primera aplicación

En esta parte vamos a desarrollar una pequeña lista de tareas . Esta lista le permitirá almacenar todos, envía recordatorios por correo electrónico a ti mismo y eliminar todos. También puede almacenar una dirección URL y una descripción a cada TODO .

Se sugiere utilizar Eclipse IDE con Pydevas.
.1 . directorio

Crear un nuevo directorio " googleappengine01 " , por ejemplo, c: \ temp \ googleappengine01 . Todos los siguientes archivos deben crearse dentro de este directorio.

3.2 . archivo de configuración

Cree el siguiente archivo de configuración para su aplicación. Se define el nombre de la aplicación , el tiempo de ejecución y define el handler script que debería invocarse para una URL específica .
El script define que toda solicitud de URL será manejada por el script " todo.py ". También define dos directorios estáticos en los que el contenido estático se almacena. Sin esta definición, el motor de la aplicación Google no entregará al navegador web este contenido .

3.3 . Creación de la aplicación

Python permite definir varias clases en un archivo de origen. Vamos a crear las siguientes clases :

TodoModel : define el modelo de datos para la aplicación.

MainPage : Sirve como punto de entrada principal , la validación del usuario se comprueba aquí

Nuevo: Esta clase va a crear el nuevo Todo en la base de datos

Hecho : Marca el TODO lo más completo y lo elimina de la base de datos

Email: Envía el TODO seleccionado a ti mismo a través de correo electrónico como recordatorio

Cree el archivo " todo.py " con el siguiente contenido.


Esta clase MainPage utiliza una plantilla HTML " index.html" para la prestación . Cree el siguiente archivo .

 
También cree el directorio css y poner en este archivo " main.css " . Esta es la hoja de estilos se utiliza para hacer index.html "bonita" . 


    
3.4 . Ejecute la aplicación

Cambie a una línea de comandos . Cambie al directorio que contiene el directorio de la aplicación . Inicie la aplicación a nivel local con el siguiente comando . 

   

Cambie a un navegador y acceda a su ordenador local a través de : http : // localhost: 8080 /
                                                                                
  

lunes, 17 de agosto de 2015

Programación GUI con python

Existen varias librerias que implementan interfaces gráficas de usuario (GUI) en python, las principales son:
  • Tkinter: Basada en las librerías gráficas TCL/TK, interface "de-facto" (#1) preinstalada con python, es la generalmente recomendada para proyectos triviales y/o de aprendizaje.
  • WxPython: Basada en WxWidgets (una libreria multiplataforma C/C++).Sería la interface por defecto si no hubiese existido TK en primer lugar.
  • PyQT: basado en la libreria C++ QT (KDE)
  • PyGTK: basado en la libreria C GTK (GNOME)

Tkinter

  • Ventajas:
    • Preinstalado con python en casi todas las plataformas
    • Relativamente simple y fácil de aprender
    • Documentación completa
  • Desventajas:
    • Pocos elementos gráficos (sin listados, arboles, etc.)
    • Limitado control del comportamiento de la interface (recomendado para proyectos "triviales")
    • Lento (dibuja cada botón, etiqueta, menú, etc.) **
Nota **: cabe aclarar que las ultimas versiones de TCL/TK mejoran varios de estos puntos, dibujando con las funciones nativas de la plataforma, lo que acelera y mejora la apariencia.

WxPython

  • Ventajas:
    • Completo conjunto de elementos gráficos (listados, árboles, grillas, etc.)
    • Flexible control del comportamiento de la interface
    • Rápido y de Apariencia nativa (diseñado para utilizar funciones nativas de cada plataforma)
    • Más de 12 librerías y utilitarios complementarios (ver comparación)
    • Soporta las características comunes de Windows, y las emula en Linux/Mac OS cuando no se pueden hacer nativamente (y viceversa).
    • Permite separar completamente el diseño de la interface en XML del código python (XRC)
    • Es fácil armar componentes personalizados, tanto que incorpora widgets que no están en wxWidgets mismo, ya que están escritos en Python (AGW).
    • Documentación completa y ejemplos extensivos.
  • Desventajas:
    • No viene preinstalado con python, se debe instalar un paquete (wxPython en Windows y Mac OS, wxWidgets+wxPython en Linux, aunque en este último caso está generalmente está fácilmente disponible en los repositorios).
    • Relativamente mas complejo de aprender
    • Al tener un desarrollo bastante rápido y sostenido, se liberan versiones frecuentemente, lo que en la práctica le confiere cierto nivel de "volatilidad" y problemas de compatibilidad si se deben mantener varias versiones de wx para el mismo código.
    • Hacer interfaces multiplataformas que se vean bien requiere conocimiento del toolkit subyacente (win32, gtk).

Ejemplo en WxPython

wxPython permite crear programas robustos, e interfaces de usuario altamente funcionales.

Nuestro primer script sólo mostrará una pequeña ventana.
Vamos a analizar el script línea por línea
Este es nuestro primer ejemplo en wxPython .
.
La primera línea es la ruta a un intérprete de Python . La segunda línea es un comentario. Proporciona un nombre para el script.
Esta línea importa los módulos básicos wxPython . Los controles, gdi , misceláneos , y ventanas. Técnicamente , wx es un espacio de nombres . Todas las funciones y objetos de los módulos básicos se iniciarán con un prefijo wx. La siguiente línea de código crea un objeto de aplicación.
Todos los programas wxPython deben tener un objeto de solicitud.
Aquí creamos un objeto wx.Frame. Un widget wx.Frame es un widget importante de contenedor. Vamos a analizar este widget en detalle más adelante . El widget de wx.Frame es un widget padre para otros widgets.Si especificamos ninguno como parámetro padre esto indica que el widget no tiene padres . Se trata de un widget de la parte superior en la jerarquía de widgets. Después creamos el widget wx.Frame , debemos llamar al método Show ( ) para mostrarlo en la pantalla.
La última línea entra en el Mainloop . El Mainloop es un ciclo sin fin . Atrapa y envía todos los eventos que existen en la vida de la aplicación.
Este fue un ejemplo simple. Sin embargo podemos hacer mucho con esta ventana. Podemos cambiar el tamaño de la ventana , maximizarla , minimizarla . Esta funcionalidad requiere una gran cantidad de codificación. Todo esto se oculta y es proporcionado por el conjunto de herramientas wxPython .