miércoles, 23 de mayo de 2012

Instalación de MongoDB

A continuación veremos como instalar MongoDB en Mac OS X y en Ubuntu.Primero comenzaremos con  Mac OS X.Desde nuestra terminal hacemos lo siguiente, tomando en cuenta que tenemos nuestro gestor de paquetes de Homebrew:


$ brew update
$ brew install mongodb

Desde Ubuntu:

$ sudo apt-get install mongodb

Ahora crearemos una carpeta, debido a que algunos usuarios con Lion tienen muchos problemas con los permisos, así que les recomiendo que creen la siguiente carpeta de esta manera:


$ brew update
$ sudo mkdir -p /data/db
$ sudo chown `id -u` /data/db

Para comenzar el servidor tecleamos lo siguiente:


$ brew update
$ mongod
MongoDB starting : pid=4932 port=27017 dbpath=/data/db/ 64-bit
...


Para entrar a la consola de MongoDB hacemos lo siguiente:

$ brew update
$ mongo
MongoDB shell version: 1.8.3
>


Sitios de referencia:

http://www.hacksparrow.com/how-to-install-mongodb-on-mac-os-x.html
http://www.hacksparrow.com/install-mongodb-on-ubuntu.html

Reporte #16

Ahora hablaremos de MongoDB, para complementarlo con la entrada anterior en la que hablabamos sobre cuales son las ventajas de usarlo. Para ello dejaré la liga a esa entrada sobre MongoDB.


Entenderemos que es un shard, un shard es uno o mas servidores en un cluster que son responsables para almacenar subconjunto de datos. Cuando hay más de un server en un shard, cada servidor tiene una copia identica de cada subconjunto de datos como en el ejemplo que verán debajo.


Los datos estan eventualmente distribuidos por shards y MongoDB mueve un subconjunto de datos desde shard a otro.Imagina que nosotros usamos una colección de datos y tomamos como base el campo de nombre.MongoDB divide los datos en pequeñas partes dandoles un rango por ejemplo.

 ["a", "g"]

Para dividir en ciertas partes MongoDB hace cosas como lo siguiente:

(a, b), donde x  es mayor que a y menor que b

(a, b], donde x es mayor que a y menor igual a b

[a, b), donde x es mayor igual que a y menor que b

[a, b], donde x es mayor igual que a y menor igual que b

Ahora digamos que tenemos un rango de [a, h). Entonces decimos que "Carlos", "Hilario" y "Alejandro" pueden estar dentro del rango por que si comparamos sus iniciales donde a < a < "Alejandro" < "Carlos" < " Hilario" < h.

La manera en la que MongoDB distribuye los datos a traves de cada shard para que estos sean responsables de cada rango de datos, por ejemplo si nosotros tenemos 4 shards, asumiendo el ejemplo anterior esto podría distribuirse de la siguiente manera.


Supongamos que muchos nombres se registraron entre [a, f), lo cual hizo más el shard 1 por lo tanto tomamos parte del shard 1 al shard 2. Con solamente ajustar los rangos digamos que shard 1 [a ,c) y shard 2 [c, n).


Supongamos que shard 1 y 2 tienen 500GB de datos, mientras que el 3 y 4 solamente tienen 300GB cada uno de ellos.Suponiendo que hacemos copias en cascada donde movemos 100GB de shard 1 a shard 2, de shard 2 pasamos 200GB a shard 3 y de shard 3 pasamos a shard 4 100GB; en total nosotros movimos 400GB. 

 
Ahora si agregamos un nuevo shard y 500 GB, entonces tendremos que mover 400GB desde nuestro shard 4 a shard 5, 300GB desde nuestro shard 3 a el shard 4, 200GB desde nuestro shard 2 a shard 3 y 100GB desde nuestro shard 1 al 2. En conclusión nosotros movimos 1TB lo cual no es muy eficiente.


MongoDB no hace esto, en lugar de ello en cada shard contiene multiples rangos. Ahora consideremos que tenemos el mismo ejemplo que fue utilizado en el primero en donde shard 1 y 2 tiene 500GB, shard 3 y 4 tiene 300GB. Recordando que MongoDB hace que se divida en multiples rangos explicaremos lo siguiente, shard 1 hacemos que cambie a dos rangos donde uno es 400GB donde digamos que [a, d) y 1 de 100GB [d, f). Ahora diremos que hacemos lo mismo con shard 2 donde [f, j) y [j, n). Luego migramos  100GB [d, f) de shard 1 a shard 3 y del shard 2 [j, n) al shard 4. A cada rango de dato le llamamos chunk.Como observarán solamente movimos 200GB.


Ahora imaginemos que agregamos otro shard lo único que haremos es partir cada chunk y le daremos partes de ello para que sea de forma distribuida este partirá de cada shard 100GB para que sea un total de movimiento de 400GB.

Esta es la manera en la que se comporta un shard en MongoDB.


jueves, 17 de mayo de 2012

Basic Concepts

Gateway 

A gateway is a link between two computer programs or systems such as Internet Forums. A gateway acts as a portal between two programs allowing them to share information by communicating between protocols on a computer or between dissimilar computers.

Reply 

A reply is respond by some action, performance in computing terms.

Gossip 

A gossip protocol is a style of computer-to-computer communication protocol inspired by the form of gossip seen in social networks. Modern distributed systems often use gossip protocols to solve problems that might be difficult to solve in other ways, either because the underlying network has an inconvenient structure, is extremely large, or because gossip solutions are the most efficient ones available.
Stress 

Refers to tests that determine the robustness of software by testing beyond the limits of normal operation, commonly put a greater emphasis on robustness, availability, and error handling under a heavy load, than on what would be considered correct behavior under normal circumstances.


Sources:

Gateway
http://en.wikipedia.org/wiki/Gateway_%28computer_program%29 
Reply
http://dictionary.reference.com/browse/reply
Gossip
http://en.wikipedia.org/wiki/Gossip_protocol
Stress
http://en.wikipedia.org/wiki/Stress_testing_%28software%29

Tutorial del uso de Subversion parte 2

Continuaremos con el tema de Subversion, antes de comenzar dejaré un link del tutorial de la parte 1:


Para comenzar hablaremos de revert, esto nos sirve para recuperar los archivos una versión anterior a la actual de igual manera nos sirve con las carpetas y copias de trabajo.La manera de usarlo es la siguiente:

svn revert Nombre del archivo

svn revert -R Carpeta

Para recuperar carpeta de trabajo, tenemos que estar dentro de ella y hacer lo siguiente:

svn revert -R

A veces es necesario ignorar algunas carpetas y archivos sobretodo para los que están encargados se cierto componente del proyecto en el que no están trabajando, para ignorar archivos y carpetas lo que debemos hacer es lo siguiente:

svn propset svn:ignore  Nombre del archivo

svn propset svn:ignore Nombre de la carpeta

Para guardar los nombres de los archivos y carpetas en un .txt hacemos esto:

svn propset svn:ignore -F svnignorado.txt

Para ignorar toda la carpeta:

svn propedit svn:ignore .

Siempre necesitamos estar actualizandonos de las modificaciones que se hay hecho en tiempo real, asi que para eso hacemos un update, la manera de utilizarlo es estando en nuestra carpeta de trabajo necesitamos hacer lo siguiente en la línea de comandos:

svn update

Ahora hablaremos como manejar conflictos, con esto queremos decir que svn entra en conflicto cuando dos usuarios hacen un cambio de algún archivo en la misma parte y en el mismo archivo.

Svn nos provee de varias opciones para resolver este tipo de conflictos y para cada conflicto nos da a escoger las siguientes opciones:

p     Pospone el arreglado del conflicto, y guarda el archivo con la marca de conflicto.

df    Nos muestra el orden en el han sido hechas las modificaciones de los archivos.

     Edita el archivo usando tu editor predeterminado.

r       Hace una marca al conflicto como resuelto, aceptando cualquier edición hecha.

mf    Ignora todo cambio de la carpeta de trabajo y usa la version del archivo actual que tienes.

tf      Ignora todos tus cambios y usa la version del archivo actual del que edito el otro usuario.

l        Usa una herramienta externa de ordenamiento para ordenar los cambios.

Esto nos puede aparecer cuando hay un conflicto, después de haber hecho un update:


 Para marcar como conflicto resuelto lo que debemos hacer es lo siguiente:

svn resolved Nombre del archivo

Nosotros nos gusta tener un control de quienes entran a nuestro proyecto osea quienes hacen commits.Para ello svn maneja el siguiente comando:

svn log

Y veremos una lista de toda la actividad :


Svn maneja un comando llamado blame para saber que personas han modificado cada línea de código de algún cierto archivo y con ello sabemos quién hizo dicho error en el código y llegar a algún acuerdo con el usuario que lo hizo.Para usarlo debemos hacer lo siguiente:

svn blame Nombre del archivo

Y podríamos ver algo como esto:


Nominaciones de la Semana:

Gaby por su traducción de algunas entradas
Emmanuel por su entrada de Benchmark
Juan Carlos y Rafael por su aportación en el monitoreo del cluster
Abraham sobre su explicación de el cluster en la medicina
Victor y Pedro por la explicación de  la red.

miércoles, 9 de mayo de 2012

Tutorial del uso de Subversion parte 1

En este tutorial haremos una explicación sobre Subversion en sí este te permite administrar proyectos complejos desde una sola persona a muchas personas, ahora según wikipedia:

"Subversion es un sistema de control de versiones, software libre bajo una licencia de tipo Apache/BSD y se le conoce también como svn por ser el nombre de la herramienta utilizada en la línea de comando.

Una característica de Subversion es que todo el repositorio tiene un único número de versión que identifica un estado común de todos los archivos del repositorio en un instante determinado del repositoro que se esta trabajando. Se puede acceder al repositorio a través de redes, lo que le permite ser usado por personas que se encuentran en distintas computadoras y con la posibilidad de que varias personas puedan modificar y administrar el mismo conjunto de datos desde sus respectivas ubicaciones fomenta la colaboración."

Ahora que hemos entendido que es un Subversion nos iremos a nuestra terminal y teclearemos:

svn --version
 
Esto nos sirve para saber si tenemos instalado el Subversion y sí es así, que version tenemos.

En caso de no tenerlo instalado debemos de teclear los siguiente.
Para Mac OS X:
  
      Con MacPorts
         sudo port install subversion
       Con Fink
       sudo fink install svn-client
Para Ubuntu:
                                                               sudo apt-get install subversion

Para comenzar a crear un repositorio e inicializarlo necesitamos hacer lo siguiente.

mkdir /var/share/svn/Repositorio

svnadmin create /var/share/svn/Repositorio

En la cual creamos una carpeta llamada Repositorio, para después crear con los comandos de Subversion un nuevo repositorio para nuestro sistema de control de versiones.Tiene que estar dentro de /var/share/~ para que este pueda ser compartido con los usuarios.

Una vez hecho lo anterior pasaremos a modificar dentro de la carpeta creada encontraremos otra carpeta llamada conf, donde encontraremos a svnserve.conf el cual descomentaremos lo siguiente.

anon-access=read                    //Acceso anónimo con permiso a lectura
auth-access=write                   //Acceso de autentificación con permiso a escritura
realm= My First Repository  //Nombre del repositorio
password-db=passwd            //Toma password de default


Con lo visto, tenemos que resaltar que ya no es necesario entrar a esta carpeta, ya que existe un comando llamado svn checkout que nos importa en una carpeta que hayamos creado un proyecto, esto lo veremos mas adelante.

Subversion usa los directorios como unidad básica de organización, el cual divide el repositorio en diferentes proyectos.Por conveniencia todas las subversiones de los proyectos deben de tener directorios llamados trunk(tronco), tags(etiquetas) y branches(ramas).Como por ejemplo:
  • /Proyecto1/trunk
  • /Proyecto1/tags
  • /Proyecto1/branches
  • /Proyecto2/trunk
  • /Proyecto2/tags
  • /Proyecto2/branches
Donde trunk es un directorio donde se hacen todas las acciones principales del desarrollo y es el directorio que vas a verificar si tu quieres trabajar en el proyecto.

El directorio tags es usado para capturar pequeñas capturas del proyecto, por ejemplo cuando liberan una nueva producción de algún tipo de componente, el equipo etiquetará el código que será liberado.Esto ayuda al equipo  cuando encuentra un error en el código y encontrar la posible solución a ello.

El directorio branches es usado cuando quieres seguir diferentes líneas de desarrollo, el desarrollo en esta carpeta se centra en el desarrollo estable mientras que en la carpeta de trunk se utiliza para desarrollo de nuevas funciones.

Para crear un directorio base para nuestro proyecto hacemos lo siguiente.

svn mkdir /usr/share/svn/proyecto

Para crear las carpetas trunk, tags y branches.


  svn mkdir /usr/share/svn/proyecto/trunk

svn mkdir /usr/share/svn/proyecto/tags

        svn mkdir /usr/share/svn/proyecto/branches

Para importar algún directorio de un proyecto ya existente hacemos esto.

svn import URL o Ruta

Para empezar con una copia de un proyecto hacemos.

svn checkout URL o Ruta

Para ver el estado de cada archivo necesitamos saber que es cada letra de indicación, entre las que tiene Subversion son las siguientes:

A  Se agregó en tu copia de trabajo.
C  Existe un conflicto por un update o una combinación.
Eliminado en tu copia de trabajo.
Combino cambios desde un repositorio
   Ignorado desde tu copia de trabajo.
M  Modificado en tu copia de trabajo.
R   Reemplazado en tu copia de trabajo.
?    No está bajo en control de versiones.
!    Se olvido algo desde tu copia de trabajo o esta incompleto

Para ver que archivos fueron cambiados en tu copia de trabajo.

svn status

*Tienes que estar dentro de la carpeta donde tienes la carpeta de trabajo.

Y veremos algo como esto.


Donde se dice que se agregó hola.py y prueba en la copia de trabajo.

Para ver como nuestros archivos han cambiado.

svn diff

*De igual manera tienes que estar dentro de la carpeta de trabajo.

Y veremos algo como esto.


Donde los "+" indican que se han agregado algunas líneas nuevas al archivo, el "-" indica que han sido removido esas líneas.Sí huvieron cambios severos veremos una gran cantidad de mas y menos.

Ahora para enviar un archivo modificado hacemos lo siguiente.

svn add archivo

*Tenemos que estar en la carpeta de trabajo.

Para hacer un update de las modificaciones hechas hacemos lo siguiente.

svn commit archivo

Y veremos algo como esto.


Para eliminar algún archivo.

svn delete archivo

Y después hacemos un "svn commit archivo" como en lo anterior.


Para renombrar un archivo.

svn mv archivo archivomodificado

Luego de eso hacemos un "svn commit archivo".


Para modificar un archivo.

svn mv ruta/proyecto/algo.py src/app/proyecto/

Y después hacemos un commit.

Para la siguiente semana hablaremos sobre el uso de Rever, Blame, Manejar conflictos y hacer update.

Nominación de la semana:

-Sergio Hernández apoyo moral
-Pedro por su entrada sobre Brenchmarks
-Victor por su intento de Geekbench
-Alex por su explicación de Malla
-Avendaño por su explicación Malla
-Obed por su expliación de PVM

jueves, 3 de mayo de 2012

Reporte #13

Se vió sobre MongoDB que es un sistema de base de datos multiplataforma orientado a documentos, de esquema libre, con esto nos referimos a que puede tener un esquema de datos diferente, con atributos o columnas que no tienen por que repetirse de un registro a otro.Una de las principales características que más destaca de MongoDB son su velocidad y su sencillo sistema de consulta.

MongoDB tiene un método llamado Sharding que es usado para una gran colección de datos en varios servidores, que comúnmente lo llamamos clúster.Ahora la gran diferencia entre los demás tipos de esquemas que se usan comúnmente es que en MongoDB hace casi todo de forma automática, una vez que le dices a MongoDB que distribuya datos, el mismo se ocupará de mantener un cierto equilibrio entre los datos de los servidores.Una vez que agregas un nuevo servidor al clúster, MongoDB se encargará de que reciba la misma cantidad de datos.

Sharding fue diseñado para cumplir con tres objetivos:

Hacer el clúster "invisible".Con esto queremos decir sí hacemos un programa, que no nos interesa que este tenga idea con quien se comunica solamente queremos darle la información de la consulta.

MongoDB viene con un proceso de enrutamiento especial llamado mongos, este reenvía las solicitudes al servidor correcto o los servidores del clúster, para luego reunir sus respuestas y enviarlas de vuelta al cliente.De esta manera se cumple ese objetivo, el cliente no tiene que saber que se está hablando hacía un clúster o un solo servidor.

Hacer el clúster siempre disponible para lectura y modificaciones.Habrá veces en el que un clúster no te podrá garantizar que siempre va estar disponible, sin embargo nunca debería de haber un momento en que los usuarios no pueden leer o escribir datos.El clúster deberá permitir a tantos nodos como sea posible para fallar antes de que su funcionalidad notablemente degrade.

MongoDB nos asegura el máximo tiempo en un par de maneras diferentes, cada parte de un clúster puede y debe tener por lo menos algunos procesos redundantes que se ejecunten en otros equipos de manera que si un proceso, máquina ó centro de datos se cae los otros inmediatamente responden y se mantienen adelante.

Permitir al clúster crecer fácilmente.Con esto nos referimos a que el clúster necesitará más espacio o recursos y nosotros deberíamos ser capaz de agregarla.MondoDB nos permite aumentar la capacidad de todo lo que se necesita, e incluso eliminar.

Vistos los anteriores objetivos nos daremos cuenta que un clúster debe ser fácil de usar y administrar.MongoDB nos permite hacer que nuestras aplicaciones crezcan de forma robusta y sencilla.

Nominación:
Alex V. por su explicación de algunos puntos a tomar al momento de programar en Cuda
Victor por su explicación de procesadores vectoriales
Raúl por su explicación a fondo de supercomputadoras
Pepe Gzz. por su explicación de OpenPBS

Fuente:

¿Qué es MongoDB?
http://www.genbetadev.com/bases-de-datos/una-introduccion-a-mongodb

Libro Scaling MondoDB O'Reilly por Kristina Chodorow

lunes, 30 de abril de 2012

Reporte #12

Esta semana investigué sobre dRuby que es un sistema de objetos distribuidos, en el cual es mas preciso para la llamada remota de metodos(RMI).Tambien te permite facilmente llamar objetos en otros procesos.

La gran diferencia que existe entre dRuby y Ruby es en que es relativamente muy facil usar un sistema de objetos distribuido en dRuby.Por ejemplo en Ruby tu puedes usar un método con una secuencia mientras que en dRuby puedes elegir de manera dinamica como enviar un objeto de manera remota, y con esto tu no tienes que describir una interfaz o un método de transportación.

dRuby puede cambiar la manera de desarrollar nuestras apps ya que toma importancia de la capa compleja de comunicacion entre procesos, y una manera fácil de comenzar a escribir.

Aquí un código ejemplo

Cliente.rb


Server.rb




Lo que hace el cliente es llamar al método get_current_time del servidor y con ello obtiene el tiempo actual como resultado de ello.


Está semana nomino a Juan Carlos por escribir los scripts que están siendo de gran ayuda.


Fuentes:

Información

http://pragprog.com/book/sidruby/the-druby-book

Código ejemplo

http://www.java-samples.com/showtutorial.php?tutorialid=1112

jueves, 19 de abril de 2012

Reporte

En está semana se investigó sobre MapReduce que este es un framework introducido por Google para dar soporte a la computación paralela sobre grandes colecciones de datos en un gran número de computadoras.El nombre del framework está inspirado en los nombres de dos importantes métodos, macros o funciones en programación funcional:
Map y Reduce

Las funciones Map y Reduce están definidas ambas con respecto a datos estructurados en pares (clave, valor). Map toma uno de estos pares de datos con un tipo en un dominio de datos, y devuelve una lista de pares en un dominio diferente:
Map(k1,v1) -> list(k2,v2)  

La función de mapeo es aplicada en paralelo para cada ítem en la entrada de datos.

Esto produce una lista de pares (k2,v2) por cada llamada. Después de eso, el framework de MapReduce junta todos los pares con la misma clave de todas las listas y los agrupa, creando un grupo por cada una de las diferentes claves generadas.

La función reduce es aplicada en paralelo para cada grupo, produciendo una colección de valores para cada dominio:
Reduce(k2, list (v2)) -> list(v2)  
Cada llamada a Reduce típicamente produce un valor v2 o una llamada vacía, aunque una llamada puede retornar más de un valor.

El retorno de todas esas llamadas se recoge como la lista de resultado deseado.  Por lo tanto, el framework MapReduce transforma una lista de pares (clave, valor) en una lista de valores. Este comportamiento es diferente de la combinación "map and reduce" de programación funcional, que acepta una lista arbitraria de valores y devuelve un valor único que combina todos los valores devueltos por mapa.

Busqué algún libro que me pueda ayudar a entender estos conceptos y lo más factible que encontré fue este:
 Writing and Querying MapReduce Views in CouchDB
http://www.amazon.com/exec/obidos/tg/detail/-/1449303129

Mi nominación de la semana es Abraham, ya que habló sobre Web Crawler y algunos conceptos no los sabía.

Fuente:
 MapReduce : Wikipedia

Conceptos Básicos

Unidad

Denominación que reciben los disco duros, las disqueteras, los lectores de cd-rom y DVD, y en general, todos los puntos de almacenamiento de datos. La posibilidad de incorporar varios discos duros en un mismo ordenador ocasiona que los programas, al instalarlos, ofrezcan la opción de elegir la unidad de disco.

Priority

La prioridad es un dato definido por el usuario que determina la importancia de cada recurso que un usuario está usando para acceder al servidor.

Access

Es el resultado positivo de una autentificación, para que el acceso dure un tiempo predeterminado, el servidor guarda en el cliente una cookie, esta permitirá que el usuario pueda entrar a su cuenta en el servidor hasta que esta caduque.

Stream

Es la distribución de multimedia a través de una red de computadoras de manera que el usuario consume el producto al mismo tiempo que se descarga. La palabra se refiere a que se trata de una corriente continua (sin interrupción).

Virtual

Es un sistema tecnológico, basado en el empleo de ordenadores y otros dispositivos, cuyo fin es producir una apariencia de realidad que permita al usuario tener la sensación de estar presente en ella.

Display

Dispositivo de ciertos aparatos electrónicos que permite mostrar información al usuario, creado a partir de la aparición de calculadoras, cajas registradoras e instrumentos de medida electrónicos en los que era necesario hacerlo.

Fuente:
http://www.ondata.es/recuperar/glosario.htm
Wikipedia

jueves, 29 de marzo de 2012

Report #8

I make a research about How to replicate data from a server to another server, and I found some things interesting like Couchdb.

Couchdb is plugged into the web, all you could use HTTP for creating and making queries (GET/PUT/POST/DELETE...), and it's RESTful, plus the fact that it's portable and great for peer to peer sharing and provides a different model for data storage than a traditional relational database in that it does not represent data as rows within tables, instead it stores data as "documents" in JSON format.

We can handling using python like in this tutorial that explain How to make a replication I found here:


The objective that I have to this week and the next is try to make a Demo or something.

To start I'll type in the wiki how to install the enviroment.

My nomination for this week is:

  Mr. X

jueves, 1 de marzo de 2012

Basic Concepts

Signal
Signal or Signals are an operating system feature that provide a means of notifying your program of an event, and having it handled asynchronously.  

Wait
 Just wait for synchronization operation something like lock acquisition to complete a task.  

Address
It's the direction where a file or something is allocated.  

Processor
A processor is the logic circuitry that responds to and processes the basic instructions that drive a computer.  

Thread
A Thread is a concurrent unit of execution. It has its own call stack for methods being invoked, their arguments and local variables.

Distributed
Distributed computing is a field of computer science that studies distributed systems.A distributed system consists of multiple autonomous computers that communicate through a computer network. The computers interact with each other in order to achieve a common goal. A computer program that runs in a distributed system is called a distributed program, and distributed programming is the process of writing such programs.  

Quality
Quality software is reasonably bug-free, delivered on time and within budget, meets requirements and/or expectations, and is maintainable.
  
Synchronization
Synchronization refers to one of two distinct but related concepts: synchronization of processes, and synchronization of data. Process synchronization refers to the idea that multiple processes are to join up or handshake at a certain point, so as to reach an agreement or commit to a certain sequence of action. Data synchronization refers to the idea of keeping multiple copies of a dataset in coherence with one another, or to maintain data integrity.  

Port
 A port is an application-specific or process-specific software construct serving as a communications endpoint in a computer's host operating system.It's associated with an IP address of the host, as well as the type of protocol used for communication.  

User
A user is an agent, either a human agent (end-user) or software agent, who uses a computer or network service.  

Event
A software message indicating that something has happened, such as a keystroke or mouse click.

Transfer
Transfers per second and its more common derivatives gigatransfers per second (abbreviated GT/s) and megatransfers per second (MT/s) are informal language that refer to the number of operations transferring data that occur in each second in some given data-transfer channel.

Source:

My report #5

I explained what was happening in the code that was made in C, using the library MPI.Because we just had the code and nobody knew what was happening.

This is the link:

http://elisa.dyndns-web.com/progra/MPI

Now I don't have a clear idea what to do next week, any suggestions will be welcome.

jueves, 23 de febrero de 2012

Examples with CUDA

The first example that we will see is a vectors sum using CUDA, where we have two lists of numbers where we sum the elements from each list and store the result in a third list.


Now we have the source code where we are using CPU.


As you saw in the comments that program is just simple we add always the library "book.h" which we need to use all the features of CUDA, and I took a screenshot of the results.

[Image of results]

Now we have the source code where we are using GPU.




Editing...

miércoles, 22 de febrero de 2012

Running programs in parallel using Parallel Python

Parallel Python is a python module which provides mechanism for parallel execution of python code on SMP(systems with multiple processors or cores) and clusters(computers connected via network).

Parallel Python has good features as you can see below:
  • Parallel execution of python code on SMP and clusters.
  • Easy to understand and implement job-based parallelization technique (easy to convert serial application in parallel).
  • Automatic detection of the optimal configuration (by default the number of worker processes is set to the number of effective processors).
  • Dynamic processors allocation (number of worker processes can be changed at runtime).
  • Low overhead for subsequent jobs with the same function (transparent caching is implemented to decrease the overhead).
  • Dynamic load balancing (jobs are distributed between processors at runtime).
  • Fault-tolerance (if one of the nodes fails tasks are rescheduled on others).
  • Auto-discovery of computational resources.
  • Dynamic allocation of computational resources (consequence of auto-discovery and fault-tolerance).
  • SHA based authentication for network connections.
  • Cross-platform portability and interoperability (Windows, Linux, Unix, Mac OS X).
  • Cross-architecture portability and interoperability (x86, x86-64, etc.).
  • Open source.


The first thing what we need to do is just download a module of Parallel Python, as you see below I leave one link where you can find it, download whichever you want.


Decompress it, and open the directory created, then type the following:

sudo setup.py install

We tested an example called sum_primes.py using two netbooks with Atom processor and a MacBookPro with i5 processor, before to see results I take some screenshots using just the MacBookPro.

 And now the results adding the two netbooks.


As you saw in the second one we have less time considerable than the first one, another thing that we saw is the warning that said statistics provided adove is not accuarte due to job rescheduling, it may occurs because they work with a little porcentage of time.

I took screenshots from my activity monitor to prove that the processor is using the top.


Source:

http://www.parallelpython.com/

jueves, 16 de febrero de 2012

My report #3

I can't install CUDA in my Ubuntu and I crashed it, now I can't start with de GUI and I couldn't try those things that I learned.

What I think to do?

The first thing that I need to do is fix my Ubuntu, then install CUDA again, and after all try for some examples those I was following in a good book about CUDA programming step by step.Then I'll find some examples in POSIX.

Who is the highest contributor in this week?

Well, I think that is Cecilia Urbina, because She did a good job in some programs those I saw, and I understand some things where I had issues.

jueves, 9 de febrero de 2012

My second contribution

To my second contribution I read a book called CUDA by Example: An Introduction to General-Purpose GPU Programming you can find it in amazon as you can see bellow I leave the link to check out that book.


I'll do some examples about CUDA programming because we need an introduction to this kind of programming environment.

lunes, 6 de febrero de 2012

Example Producer-Consumer with Python

Well let's start with this simple example about the Producer-Consumer problem as you may saw it in the last semester, if you didn't, don't worry about it I'm gonna explain it.

The producer-consumer problem illustrates the need for synchronization in systems where many processes share a resource, in this problem, two processes share a fixed-size buffer.One process produces information and puts it in the buffer, while the other process consumes information from the buffer.These processes do not take turns accessing the buffer, they both work concurrently.Instead processes, we're gonna use threads to solve that problem.


Now that we have defined the problem, we're gonna program using threads and a module called Condition, with Condition we can handle the behavoir from each thread, we need to handle one thread called Producer and another called Consumer without any kind of conflict.
from threading import Thread, Condition
import time, random

class Productor(Thread):
    def __init__(self, lista, condicion):
        Thread.__init__(self)
        self.lista = lista
        self.condicion = condicion
    
    def run(self):
        while True:
            lista = random.randint(0,10)
            self.condicion.acquire()
            print 'Condicion adquirida por %s' % self.name
            self.lista.append(lista)
            print '%d agregado a la lista por %s' %(lista, self.name)
            print 'Condicion notificada por %s'%self.name
            self.condicion.notify()
            print 'Condicion liberada por %s'% self.name
            self.condicion.release()
            time.sleep(1)

class Consumidor(Thread):
    def __init__(self,lista,condicion):
        Thread.__init__(self)
        self.lista=lista
        self.condicion = condicion
    
    def run(self):
        while True:
            self.condicion.acquire()
            print'condicion adquirida por %s'%self.name
            while True:
                if self.lista:
                    lista = self.lista.pop()
                    print '%d removido de la lista por %s' % (lista, self.name)
                    break
                print'Condicion espera por %s' % self.name
                self.condicion.wait()
            print'condicion liberada por %s' % self.name
            self.condicion.release()

def main():
    lista = []
    condicion = Condition()
    hilo1 = Productor(lista, condicion)
    hilo2 = Consumidor(lista, condicion)
    hilo1.start()
    hilo2.start()
    hilo1.join()
    hilo2.join()

main()



You'll see something like the picture below.
Sources:
http://chuwiki.chuidiang.org/index.php?title=Hilos_en_python#Condition http://code.google.com/p/chuidiang-ejemplos/source/browse/trunk/python-hilos/src/threading_hilo_condition.py

jueves, 2 de febrero de 2012