miércoles, 26 de agosto de 2015

Programación Paralela y Distribuida

Maricela Ocaña

Procesamiento Pipeline, Ley de Amdahl y Ley de 
Gustafson

Procesamiento Pipeline

En computación, se le llama pipeline a una serie de elementos de procesamiento de datos ordenados de tal modo que la salida de cada uno es la entrada del siguiente, como quien dice una cadena de montaje pero en vez de orientada a la manufactura, orientada al procesamiento de datos e instrucciones.

Ciclo de vida de una instrucción

La acción básica de cualquier microprocesador, en tanto se mueve a través de la corriente de instrucciones, se puede descomponer en una serie de cuatro pasos simples, que cada instrucción en la corriente de código debe atravesar para ser ejecutada:
         1. Fetch: "traer" la instrucción que se va a ejecutar, de la dirección almacenada en el contador de programa.
         2. Store: "almacenar" la instrucción en el registro de instrucciones y "descifrarla", incrementando la dirección en el contador de programa.
         3. Execute: "Ejecutar" la instrucción almacenada en el registro de instrucciones. Si la instrucción no es una instrucción de rama sino una instrucción aritmética, este proceso la envía a la ALU apropiada (ALU: Arithmetic Logic Unit en español: Unidad Aritmético-Lógica), donde el microprocesador: a. "Lee" el contenido de los registros de entrada. b. "Agrega" el contenido de los registros de entrada.
         4. Write: "Escribir" los resultados de esa instrucción de la ALU nuevamente dentro del registro de destinación.

    En un procesador moderno, los cuatro pasos arriba descritos son repetidos una y otra vez hasta que el programa termine de ejecutarse. Éstas son, en hecho, las cuatro etapas en un "pipe" clásico del RISC.
    El pipelining hace su truco con la optimización total de los recursos existentes.
    Los diseñadores de microprocesadores siempre están buscando formas de incrementar el número de instrucciones que un CPU puede completar en un período de tiempo dado. Cuando recordamos que un programa es una secuencia ordenada de instrucciones, se hace claro que incrementar el número de instrucciones ejecutadas por unidad de tiempo es una forma de disminuir el tiempo total de ejecución de un programa. Incrementar la tasa de proceso de instrucciones de nuestro procesador (esto es, el numero de instrucciones completadas por unidad de tiempo) nos permite correr programas más rápidos.
    Haciendo "pipelining" al procesador, podemos poner a trabajar más de ese hardware en cada nanosegundo, incrementando de esa manera la eficiencia del procesador y su performance en la ejecución de programas.

Ley de Amdahl

    La mejora obtenida en el rendimiento de un sistema debido a la alteración de uno de sus componentes está limitada por la fracción de tiempo que se utiliza dicho componente.

¿Cuál es la aceleración A (speedup) del sistema completo después de acelerar k veces un componente?
Casos particulares de la ley
aSi f = 0 Þ A = 1: no hay ninguna mejora en el sistema.
bSi f = 1 Þ A = k : el sistema mejora igual que el componente.

 Casos particulares de la ley
        Si f = 0 Þ A = 1: no hay ninguna mejora en el sistema.
        Si f = 1 Þ A = k : el sistema mejora igual que el componente.







Ley de Gustafson

    La ley de Gustafson establece que cualquier problema suficientemente grande puede ser eficientemente paralelizado. La ley de Gustafson está muy ligada a la Ley de Amdahl, Gustafson enunció por primera vez la ley que lleva su nombre en 1988.


 donde P es el número de procesadores
 S es el speedup
la parte no paralelizable del proceso.

    La ley de Gustafson propone que los programadores establezcan el tamaño de los problemas para utilizar el equipamiento disponible en su solución en un tiempo práctico. Por consiguiente, si existe equipamiento más rápido disponible, mayores problemas se pondrán resolver en el mismo tiempo.


    La ley redefine la eficiencia como una necesidad para minimizar la parte secuencial de un programa, incluso si esto incrementa la cantidad total de cálculos.

Para más información puedes consultar “Cómo funcionan los pipelines de un CPU”.



martes, 25 de agosto de 2015

Maricela Ocaña
Programación Paralela y Distribuida


Programación Google App Engine con Python

Google App Engine nos permite publicar aplicaciones web en línea sin necesidad de preocuparnos por la parte de la infraestructura y con un enfoque 100% en la construcción de nuestra aplicación y en la posibilidad de correrla directamente sobre la infraestructura de Google, es decir, la que Google usa para sus propios productos esto garantiza un mejor rendimiento de la aplicación.

Para el almacenamiento de datos tendremos dos posibilidades en casi cualquier lenguaje en el que estemos desarrollando: Cloud Datastore y Cloud SQL. 

Cloud Datastore es una base de datos NoSQL ideada como la opción de almacenamiento principal a la hora de que corremos aplicaciones en App Engine.

Cloud SQL es una base de datos MySQL que corre en la nube de Google y tiene todas las características de cualquier base MySQL, entre otras.

Características
GAE soporta de manera oficial los lenguajes de programación Python y Java de manera estable y en modo de beta testing en lenguaje de programación Go creado por ellos mismos. Al soportar Java, es posible además utilizar cualquier lenguaje JVM o lo que es lo mismo, cualquier lenguaje que pueda ejecutarse sobre una máquina virtual de Java, aunque eso sí, con serias limitaciones. Entre dichos lenguajes se encuentran:
  • Groovy
  • JRuby
  • Scala
  • 4PHP
  • Clojure
  • Perl

Pero sin duda Python es el lenguaje mejor soportado y con mayor robustez por parte del App Engine.
Para utilizar Google App Engine como tu propia  red de entrega de contenidos (CDN) personal necesitas instalar algunas cosas en tu computadora y editar unos archivos de configuración. Todo este trabajo se realiza una sola vez y luego lo que necesitas es correr un simple programa para subir los archivos a Google.
Los scripts que tienes que descargar solo están disponibles para Windows únicamente si cuentas con otro sistema operativo deberás crearlos para que realicen las mismas funciones, el scrip que tienes que descargar es el siguiente:
deploy_digitalistic_cdn.bat 
Si ya cuentas con lo anterior sigue los siguientes pasos.
  1. Necesitas descargar e instalar Python en tu computadora. Si estas corriendo Mac o Linux, es muy probable que ya cuentes con Python instalado, así que puedes saltar este paso. Es recomendable descargar la Python 2.5 en adelante debido a que con las versiones 3 presenta algunos problemas.
  2. Descarga el SDK del motor de Google APP desde http://code.google.com/appengine/downloads.html e instalo. Durante la instalación del SDK va a revisar que tengas instalado Python o no, así que si tienes algún problema con la instalación de Python lo sabrás en este paso. El Google App Engine SDK es necesario para escribir y subir aplicaciones a Google. Solo utiliza las opciones ya establecidas cuando instales el SDK.
  3. Regístrate para el Google App Engine en appengine.google.com. Para esto crear una cuenta de Google.
  4. Una vez que hayas ingresado al servicio, crear una aplicación, así que pulsa el botón de “Create an application” y dale a la aplicación un nombre .Este nombre tiene que ser único dentro de todas las aplicaciones de usuarios, así que puedes tardar un rato en encontrar un nombre único. Guarda la nueva aplicación. Luego de que hayas creado esta primera aplicación, necesitas especificar tu número de teléfono. Google te enviará un mensaje de texto SMS con un código para ingresar al sitio. Esto confirma que eres el dueño de la cuenta de Google App Engine.
  5. Descarga el archivo http://nombredeaplicacion.appspot.com/files/digitalisticcdn.zip  (alojado en mi CDN privado!) y descomprímelo en tu disco duro. Si quieres puedes cambiarle el nombre del directorio de “nombre de aplicación” al nombre que quieras, por ejemplo el de tu propia aplicación. No importa realmente y solo te facilita el mantener un registro para el futuro.
  6. Utiliza un editor de texto para editar el archivo app.yaml que se encuentra en el directorio de “nombre de aplicación”. Cambia “application: nombre de aplicación” a “application:el identificador de tu aplicación” y guarda el archivo. Esto le dirá a Google App Engine que aplicación debe utilizar para cargar archivos.
  7. Ahora es tiempo de agregar todas las imágenes, hojas de estilo, archivos, vídeos, etc. que quieras subir a Googleen los folders de “nombre de aplicación”. Incluye las imágenes en el folder /images, etc. Puedes crear cualquier número de subfolders dentro de imágenes, archivos, hojas de estilo, etc. Puedes agregar más archivos en cualquier momento, así que si sólo quieres configurar la aplicación para que funcione puedes saltar este pasó. Ya existe una imagen en el folder de /images para que puedas comprobar que está funcionando como debería.
  8. Descarga http:/nombredeaplicación.appspot.com/files/deploy_digitalistic_cdn.bat y edítalo con un editor de texto. Este archivo debe apuntar a tu instalación de Python, tu instalación de Google App Engine y tu directorio “nombre de aplicación”. Si has instalado Google App Engine SDK en el directorio original y Python en C:/Program Files/ entonces no tienes que preocuparte por esta configuración. Solo cambia la última parte del archivo para apuntarlo a tu directorio de “nombre de aplicación”. Ten en cuenta que todas las rutas que tienen espacios tienen que estar encerradas entre comillas.
  9. Doble click en el archivo recientemente actualizado deploy_digitalist_cdn.bat para subir todos los archivos dentro del directorio “nombre de aplicación” hacia Google. La primera vez que hagas esto deberás especificar tu usuario y password de Google.
  10. Ahora ya tienes tu propio CDN privado! Ve a (“nombre de aplicación”).appspot.com/images/ninja.gif para ver si funciona.

 

lunes, 24 de agosto de 2015

Maricela Ocaña
Programación Paralela y Distribuida


Programación Android con Python

    Aunque Java es el lenguaje estándar para el desarrollo de aplicaciones para Android, se han desarrollado interpretadores que  tengan lenguajes de secuencias de comandos para crear aplicaciones para Android. Tal es el caso de QPython que nos permite programar con Python.

    QPython es un motor de secuencias de comandos que se ejecutan en los dispositivos Android. Permite correr proyectos y scripts python en nuestros dispositivos Android. Contiene un intérprete Python, consola, un editor, y la librería SL4A para Android. Es Python corriendo en Android!
    Ofrece un kit de desarrollo que permite desarrollar fácilmente proyectos y scripts de Python en los dispositivos Android.
Características principales:
  1. Ejecutar Scripts de Python y Proyectos en dispositivos Android.
  2. Soporta programación Python en Android incluyendo aplicaciones web, juegos y programación SL4A.
  3. Se puede ejecutar código Python y archivos de QRCode.
  4. QEdit le permite crear/editar los scripts de Python y Proyectos fácilmente.
  5. Incluye muchas librerías útiles de Python.

Programación de Funciones:
  1. Compatible con la programación Web app, que nos permite desarrollar aplicaciones móviles con un framework de desarrollo web, esto acelera el desarrollo de aplicaciones móviles en gran medida.
  2. Soporta la programación de UI nativas, la cual permite desarrollar juegos con mayor facilidad mediante el uso de secuencias de comandos.
  3. Soporta la programación SL4A para acceder a las funciones de Android: Redes, Bluetooth, GPS y mucho más.

    La aplicación de QPython la puedes descargar gratuitamente desde la Play Store y está basada en Python 2.x, pero también existe la versión para Python 3.x.

Para la instalación de librerías externas consta de dos métodos:
  1. QPypi: librerías ya preparadas por la aplicación. Podemos encontrar androidhelper (acceso a sensores del móvil, cuadros de texto, etc), kivy (nos permite crear aplicaciones rápidas en nuestro android: botones, pantallas con mensajes, etc), numpysqlite3, etc.
  2. pypi: nos da acceso al directorio de librerías Python en la red, permitiendo la descarga de la librería que queramos tan solo introduciendo su nombre.
   Una vez instalada, podemos abrir la aplicación y acceder a un pequeño tutorial “Quick Start”. Aquí ya podemos checar  la apariencia que tiene el código en estas aplicaciones. En cualquiera de ellas podemos hacer click sobre “Copy to editor to run”, y una vez estamos en el editor hacemos click en el botón de “Play” para ejecutar el script. En el segundo podemos ver un ejemplo de una aplicación que cambia de color el fondo de pantalla al hacer click sobre la pantalla.
Si en vez de entrar en el tutorial, deslizamos la pantalla hacia la izquierda, aparecerán el resto de botones de la aplicación, entre los que podemos ver la consola para ejecutar código, el Editor y el Programa con nuestros scripts, el apartado de Librerias para la instalación de librerías externas y el de Community con acceso a la web de qpython.org
    QPytho cuenta lector QR en su web que carga directamente tu código en la app (actualmente no disponible por reforma de la web). Por ahora lo más factible sería cargar tu fichero en el móvil utilizando algún métodos de los comunes para envío de datos, ya sea usando la red o mediante cable de datos.
    Un ejemplo sencillo es el acceso al sensor gps, mostrando por consola sus coordenadas. Aquí faltaría ver con más calma el significado de los datos que nos da, creo que si le pedimos al sensor las coordenadas de tipo “network” son las relacionadas con tu red wifi  pero no están calculadas mediante gps, para ello son las de tipo “gps” que vemos en el script:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#-*-coding:utf8;-*-
#qpy:2
#qpy:console

print "This is console module"

import androidhelper, time
droid = androidhelper.Android()
droid.startLocating()
time.sleep(10)
c = 0
while c<50:

  l = droid.readLocation()
  R =l.result
  try:
    R =R["gps"]
    Lat= R["latitude"]
    Lon=R["longitude"]
    #R1 =R["network"]
    #Lat1=R1["latitude"]
    #Lon1=R1["longitude"]
    outstr = str(Lat) +","+ str(Lon)
    droidfile = '/sdcard/droidtrack_bus1.txt'
    print outstr#, str(Lat1) , str(Lon1)
    fh = open(droidfile,'a')
    res= fh.write(outstr +'\n' )
    res = fh.close()
    time.sleep(30)
    c+=1
    print c
  except:
    time.sleep(10)
    print c
    print R
    c+=1



    Como nos podemos dar cuenta desarrollar nuestras propias aplicaciones en Android resulta sencillo y sin tener que utilizar Java y nos muestra un entorno de desarrollo más sencillo con Python.