Procesamiento en GPU : Una introduccion al Procesamiento Paralelo

 

 

Anuncios

Econometria

Rama de la economía que utiliza métodos estadísticos para estudiar y cuantificar mediante datos reales los fenómenos económicos, brindando así indicios sobre la pertinencia de las teorías científicas elaboradas por los economistas .

A word of explanation regarding the term econometrics may be in order. Its definition is implied in thestatement of the scope of the [Econometric] Society, in Section I of the Constitution, which reads: “The  Econometric Society is an international society for the advancement of economic theory in its relation to statistics and mathematics…Its main object shall be to promote studies that aim at a unification of the theoretical-quantitative and the empirical-quantitative approach to economic problems…” But there are several aspects of the quantitative approach to economics, and no single one of these aspects, taken by itself, should be confounded with econometrics. Thus, econometrics is by no means the same as economic statistics. Nor is it identical with what we call general economic theory, although a considerable portion of this theory has a definitely quantitative character. Nor should econometrics be taken as synonomous with the application of mathematics to economics. Experience has shown that each of these three view-points, that of statistics, economic theory, and mathematics, is a necessary, but not by itself a suficient, condition for a real understanding of the quantitative relations in modern economic life. It is the unification of all three that is powerful. And it is this unification that constitutes econometrics .

 

Para que sirve la econometria :

  • Prediccion
  • Estimacion de Relaciones Causales
  • Contraste de Teorias Economicas
  • Evaluacion de Politicas

Hay dos características que distinguen la Econometría de lo que sería la  estadística aplicada a la economía :

  1. Los datos económicos son no experimentales.  No podemos clasificar a los individuos o las empresas como si fueran “grupos experimentales” y “grupos de control”. Los individuos son  libres y se auto-seleccionan en grupos  (nivel educativo, ocupación,  etc. ). Precisamente la Econometría tiene en cuenta esta circunstancia,  es decir tiene en cuenta el comportamiento del individuo, sus decisiones.
  2. Los modelos económicos (simples o sofisticados) son cruciales para interpretar los resultados estadísticos en las aplicaciones econométricas. 

De lo espuesto anteriormente se pueden plantear algunas preguntas :

  • ¿Cómo y por qué las matemáticas y la estadística se han extendido a la economía? 
  • ¿El uso de las matemáticas y la estadística, qué problemas económicos han podido resolver, o son capaces de hacerlo? ¿Qué impacto metodológico, si lo hubiere, ha dado origen la aplicación de esos métodos a la econometría y al pensamiento económico?,
  • ¿cómo ha evolucionado la econometría? y ¿Podrá la econometría, en base a la evolución de sus métodos, eventualmente alcanzar su objetivo de hacer del análisis económico un proceso científico completo?

Los primeros Econometristas : Ragnard Frisch, Jan Tinbergen, Oskar Morgenstern .

 

 

 

 

 

 

 

 

 

 

 

 

 

La historia de C

El desarrollo inicial de C se llevó a cabo en los Laboratorios Bell de AT&T entre 1969 y 1973; según Ritchie, el periodo más creativo tuvo lugar en 1972. Se le dio el nombre “C” porque muchas de sus características fueron tomadas de un lenguaje anterior llamado “B“.

Hay muchas leyendas acerca del origen de C y el sistema operativo con el que está íntimamente relacionado, Unix. Algunas de ellas son:

  • El desarrollo de C fue el resultado del deseo de los programadores de jugar con Space Travel. Habían estado jugando en el mainframe de su compañía, pero debido a su poca capacidad de proceso y al tener que soportar 100 usuarios, Thompson y Ritchie no tenían suficiente control sobre la nave para evitar colisiones con los asteroides. Por ese motivo decidieron portar el juego a un PDP-7 de la oficina que no se utilizaba; pero esa máquina no teníasistema operativo, así que decidieron escribir uno. Finalmente decidieron portar el sistema operativo del PDP-11 que había en su oficina, pero era muy costoso, pues todo el código estaba escrito en lenguaje ensamblador. Entonces decidieron usar un lenguaje de alto nivel y portátil para que el sistema operativo se pudiera portar fácilmente de un ordenador a otro. Consideraron usar B, pero carecía de las funcionalidades necesarias para aprovechar algunas características avanzadas del PDP-11. Entonces empezaron a crear un nuevo lenguaje, C.
  • La justificación para obtener el ordenador original que se usó para desarrollar Unix fue crear un sistema que automatizase el archivo de patentes. La versión original de Unix se desarrolló en lenguaje ensamblador. Más tarde, el lenguaje C se desarrolló para poder reescribir el sistema operativo.

En 1973, el lenguaje C se había vuelto tan potente que la mayor parte del kernel Unix, originalmente escrito en el lenguaje ensamblador PDP-11/20, fue reescrita en C. Éste fue uno de los primeros núcleos de sistema operativo implementados en un lenguaje distinto al ensamblador. (Algunos casos anteriores son el sistema Multics, escrito en PL/I, y Master Control Program para el B5000 de Burroughs, escrito en ALGOL en 1961).

Ritchie diseñó, desde 1970 a 1972 junto a Brian Kernighan, un lenguaje que permitía realizar una programación estructurada en la que se podían economizar las expresiones a usar y con el que los desarrolladores podrían contar con un buen conjunto de operadores y tipos de datos para programar tanto en alto como en bajo nivel de manera simultánea. Ente sus características:

  • Núcleo de lenguaje simple que incluye funciones matemáticas y de manejo de archivos proporcionadas por bibliotecas
  • Lenguaje flexible que permitía programar de manera estructurada y no estructurada
  • Inclusión de un sistema de tipos que impedía la realización de operaciones sin sentido
  • Acceso a memoria de bajo nivel mediante el uso de punteros
  • Conjunto reducido de palabras reservadas
  • Paso de parámetros a funciones por valor
  • Tipos de datos agregados (struct) que permitían combinar, bajo un mismo tipo, datos de tipos distintos y manejarlos como uno solo.

El lenguaje C ofrecía diversos tipos de datos: “CHAR” (carácter), “INT” (enteros), “FLOAT” (números reales en precisión simple), y “DOUBLE” (números reales en precisión doble) a los que posteriormente se añadieron los tipos “SHORT” (números enteros de tamaño menor a un INT), “LONG” (números enteros de tamaño mayor a un INT), “UNSIGNED” (Enteros sin signo), y “ENUMERACIONES” que junto a las estructuras, las uniones y las tablas y matrices componían un variado juego de tipos de datos con los que abordar múltiples problemas.

Veamos un par de ejemplos :


/* Este es un ejemplo muy elelemtal de programa C 	*/
/* multiplica dos matrices, utilizando indices		*/

#include <stdio.h>

/* Definimos un tipo: matriz cuadrada de 2x2 */
typedef	int matriz2x2[2][2];

/* Declaramos las matrices a multiplicar */
matriz2x2 A ;
matriz2x2 B ;

/* Declaramos e inicializamos la matriz resultado */
matriz2x2 R = {0, 0, 0, 0};

/* Declaramos prototipos de funciones utilizadas en el programa */
void Entra_Mat2x2( matriz2x2 M );
void Mult_Mat2x2( matriz2x2 H, matriz2x2 F, matriz2x2 G);
void Visu_Mat2x2( matriz2x2 M );
main()
{

	/* Introducimos valores de las matrices a multiplicar */
	Entra_Mat2x2( A );
	Entra_Mat2x2( B );

	/* Multiplicamos matrices */
	Mult_Mat2x2( A, B, R );

	/* Visualizamos matriz resultado */
	Visu_Mat2x2( R );

}

/* Funcion para entrar por teclado los valores de una matriz	*/
/* Cuadrada de dimension 2					*/
void Entra_Mat2x2( matriz2x2 M )
{
	int i,j;

	/* Recorremos la matriz para introducir los valores */
	/* Fijate en los valores de los indices */
	for (i=0; i<2; i++) {
		printf("\n");
		for(j=0; j<2; j++) {
			printf("(%d,%d) = ",i,j);
			scanf("%d",&M[i][j]);
		}
	}

	printf("\n\n");

	return;

}

/* Funcion que multiplica dos matrices cuadardas de dimension 2 */
/* A y B son las matrices a multiplicar 			*/
/* En R se deposita el resultado 				*/
void Mult_Mat2x2( matriz2x2 A, matriz2x2 B, matriz2x2 R )
{
	int i, j, q;

	/* Bucles anidados para calcular el producto */
	/* Fijate en los indices i y j */
	for (i=0; i<2; i++)
		for (j=0; j<2; j++)
			for (q=0; q<2; q++)
				R[i][j] += A[i][q]*B[q][j];

	return;

}

/* Esta es una funcion que visualiza el contenido de una matriz	*/
/* Cuadrada de dimension 2					*/
void Visu_Mat2x2( matriz2x2 M )
{
	int i,j;

	/* Bucle para recorrer la matriz a visualizar */
	for (i=0; i<2; i++) {
		printf("\n");
		for (j=0; j<2; j++)
			printf("(%d,%d) = %d ",i,j,M[i][j]);
	}

	printf("\n\n");

	return;

}

Y ahora su version usando punteros :


/* Este es un ejemplo muy elelemtal de programa C 	*/
/* Hace lo mismo que ejemplo1, solo que utiliza		*/
/* punteros para recorrer las matrices			*/

#include <stdio.h>

/* Definimos un tipo: matriz cuadrada de 2x2 */
typedef	int matriz2x2[2][2];

/* Declaramos las matrices a multiplicar */
matriz2x2 A ;
matriz2x2 B ;

/* Declaramos e inicializamos la matriz resultado */
matriz2x2 R = {0, 0, 0, 0};

/* Declaramos prototipos de funciones utilizadas en el programa */
void Entra_Mat2x2( matriz2x2 M );
void Mult_Mat2x2( matriz2x2 H, matriz2x2 F, matriz2x2 G);
void Visu_Mat2x2( matriz2x2 M );
main()
{

	/* Introducimos valores de las matrices a multiplicar */
	Entra_Mat2x2( A );
	Entra_Mat2x2( B );

	/* Multiplicamos matrices */
	Mult_Mat2x2( A, B, R );

	/* Visualizamos matriz resultado */
	Visu_Mat2x2( R );

}

/* Funcion para entrar por teclado los valores de una matriz	*/
/* Cuadrada de dimension 2					*/
void Entra_Mat2x2( matriz2x2 M )
{
	int i,j;
	int *p;

	/* Bucle de lectura de valores de la matriz */
	p = &M[0][0];
	for (i=0; i<2; i++) {
		printf("\n");
		for(j=0; j<2; j++) {
			printf("(%d,%d) = ",i,j);
			scanf("%d",p);
			p++;
		}
	}

	printf("\n\n");

	return;

}

/* Funcion que multiplica dos matrices cuadardas de dimension 2 */
/* A y B son las matrices a multiplicar 			*/
/* En R se deposita el resultado 				*/
void Mult_Mat2x2( matriz2x2 A, matriz2x2 B, matriz2x2 R )
{
	int i, j, q;
	int *p_A, *p_B, *p_R, *aux;

	p_R = (int *)R; /* Esto es un ejemplo de cast */

	/* Bucles anidados que realizan el producto entre matrices */
	for (i=0; i<2; i++) {
		p_A = (int *)A + i*2; /* Aritmetica de punteros!! */
		for (j=0; j<2; j++) {
			aux = p_A;
			p_B = (int *)B + j; /* Aritmetica de punteros !! */
			for (q=0; q<2; q++) {
				(*p_R) += (*aux) * (*p_B);
				aux++;
				p_B += 2;
			}
			p_R++;
		}
	}

	return;

}

/* Esta es una funcion que visualiza el contenido de una matriz	*/
/* Cuadrada de dimension 2					*/
void Visu_Mat2x2( matriz2x2 M )
{
	int i,j;
	int *p;

	p = (int *)M;

	/* Bucle para visualizar los valores de la matriz */
	for (i=0; i<2; i++) {
		printf("\n");
		for (j=0; j<2; j++)
			printf("(%d,%d) = %d ",i,j,*p++);
	}

	printf("\n\n");

	return;

}


El Lenguaje C se ha utilizado mucho para para la programación en sistemas UNIX aunque también se ha utilizado en el desarrollo de sistemas operativos como Windows o GNU/Linux y en el desarrollo de aplicaciones de escritorio como GIMP. Tampoco es raro verlo en sistemas empotrados (control de procesos industriales, ascensores, sistemas de monitorización, etc) o como base de kits de desarrollo de microcontroladores (abstrayendo al usuario de la programación en ensamblador). Además, como decía al inicio, es un lenguaje muy especial dentro del mundo de la ingeniería puesto que se sigue enseñando en los primeros cursos de estos estudios y nunca ha dejado de ser utilizado.

 

Paqueteria en LInux (Ubuntu)

La primera pregunta natural seria :

  • ¿ Como instalo software en linux?En el mundo Linux hay dos formas naturales de hacer este proceso de instalacion, la primera es instalar los paquetes a partir del codigo fuente (http://www.tuxfiles.org/linuxhelp/softinstall.html) , la otra forma es usar algun gestor de paquetes (Con él podemos instalar muchisimos programas de forma inmediata usando los repositoriosdesde Internet o desde un CD. Por ejemplo, en Ubuntu puedes instalar aplicaciones yendo alCentro de software (o también instalando el gestor de paquetes Synaptic)).

    Las ventajas que tiene usar el sistema de paquetes es que te permite instalar, desinstalar y actualizar los programas de forma muy sencilla, ya que cada programa está formado por uno o varios paquetes que el gestor de paquetes controla que funcionen bien, además si la aplicación que instalas depende de otros paquetes extra, el gestor los añadirá automáticamente.

    Para tener un  mejor manejo y comprension de esto es sufiente con leer la documentacion presentada por la gente de Ubuntu .

    https://help.ubuntu.com/community/Repositories/Ubuntu

     

Una (Rapida) introduccion a Linux .

La pregunta inicial es para que o porque cambiariamos nuestro sistema operativo – que en la mayoria de los casos es windows – a uno nuevo, la respuesta a esta pregunta se repite en muchos articulos que se pueden encontrar facilmente. Tal vez la decision es mas sencilla de tomar si es que tenemos una necesidad . En la mayoria de los casos esa necesidad es academica , por el simple hecho de que en una tesis no podemos usar software pirata . Analizemos el caso de alguien que desea desarrollar el tema de Mecanica de Fluidos Computacional (http://en.wikipedia.org/wiki/Computational_fluid_dynamics). En esta rama de la matematica ampliamente usada y con muchos campos de aplicacion el desarrollo de una simulacion es primordial para poder mostrar los resultados . Para ello una de las herramientas que se usa (casi por defecto)  es matlab, pero como es de esperarse no es la unica . Independiente de la opcion que se tome para desarrollar una simulacion de este tipo, el mejor escenario es desarrollarla sobre un entorno linux .

Este maravilloso sistema operativo se lo debemos a muchas personas, pero a mi parecer deberiamos mencionar a los siguientes 4 :

  1. Brian Kernigham : http://www.cs.princeton.edu/~bwk/


  2. Dennis Ritchie : 

  3. Linus Torvalds
  4. Richard Stallman

Lo primero que deberiamos aprender es como manejar el sistema operativo desde la consola :

 

Esta consola nos va otorgar acceso a un ambiente de trabajo :

  • Nombre de usuario
  • Directorio Personal
  • Shell

Esta informacion es almacenada en algunas variables del sistema :

  • USER
  • HOME
  • SHELL

Por jemplo , las podemos consultar de la siguiente manera

  • echo $USER
  • echo $HOME
  • echo $SHELL

Una manera grafica de entender el sistema de archivos es la siguiente :

Algunos Comando Basicos de la Shell :

  • ls : Lista el contenido de un directorio
  • ls -l : Muestra una lista con mas detalle
  • cd <path>  : Cambia de directorio
  • cd ..  : Se ubica en el directorio inmediato superior
  • pwd : Muestra el actual directorio de trabajo
  • clear : Limpia la pantalla
  • mkdir <dirname> : Crea un directorio
  • rmdir <dirname> : Remueve (Borra) un directorio
  • rm <filename>  : Remueve (Borra)  un archivo
  • mv <src> <dest> : Mueve un archivo
  • cp <src> <dest> : Copia un archivo
  • ln -s <src> <link> : Crea un link
  • touch <filename> : Crea un archivo y regresa a la consola .
  • ps : Muestra todos los procesos
  • ps u : Muestra tus procesos
  • kill <id>  : Mata el proceso con id

Una vez que ya se tiene alguna (poca, en realidad) experiencia manejando el sistema operativo ya se tiene que comenzar a editar , para ello existen muchas  opciones (http://en.wikipedia.org/wiki/Editor_war) . Las mas comunes en la comunidad hacker son las siguientes :

  • Emacs : Extensible y personalisable
  • Vi : Ubicuo : Disponible para todos los sistemas (Muy conocido por su rapidez y ligereza)
  • Nano : Simple, no se necesita recordar nada.

 

Con esto ya estamos listos para programar.

Algoritmos iterativos

Un componente básico de los algoritmos es la iteración. Esta palabra implica repetición, ya que iterar significa ejecutar repetidamente  algunos pasos elementales de un algoritmo acercándose, paso a paso, a la solución. Para realizar un programa de ordenador es muy  conveniente localizar los pasos que se repiten y anidarlos dentro de un sistema iterativo.

La opción al uso de algoritmos iterativos es el uso de la recursividad en funciones. Estas implican una escritura más sencilla (corta), tanto para su implementación como para su entendimiento, pero en contraparte, utilizan mucho más recursos de sistema que una iteración debido a que necesitan, además del uso del procesador, la pila del sistema para “apilar” los diversos ámbitos de cada función.

Ejemplo de uso de un algoritmo iterativo en C

int
gcd_iter(int u, int v) {
  int t;
  while (v) {
    t = u; 
    u = v; 
    v = t % v;
  }
  return u < 0 ? -u : u; /* abs(u) */
}

Ejemplo de uso de un algoritmo iterativo en Fortran

subroutine gcd_iter(value, u, v)
  integer, intent(out) :: value
  integer, intent(inout) :: u, v
  integer :: t
 
  do while( v /= 0 )
     t = u
     u = v
     v = mod(t, v)
  enddo
  value = abs(u)
end subroutine gcd_iter

Ejemplo de uso de un algoritmo iterativo en python

def egcd(a, b):
    x,y, u,v = 0,1, 1,0
    while a != 0:
        q,r = b/a,b%a; m,n = x-u*q,y-v*q
        b,a, x,y, u,v = a,r, u,v, m,n
    return b, x, y

Costes de Tiempo y Espacio

 La caracterıstica basica que debe tener un algoritmo es que sea correcto, es decir, que produzca el resultado deseado en tiempo finito.  Adicionalmente puede interesarnos que sea claro, que esté bien estructurado, que sea fácil de usar, que sea fácil de implementar y que sea eficiente.

Entendemos por eficiencia de un algoritmo la cantidad de recursos de cómputo que requiere; es decir, cúal es su tiempo de ejecución y qué cantidad de memoria utiliza. A la cantidad de tiempo que requiere la ejecución de un cierto algoritmo se le suele llamar coste en tiempo mientras que a la cantidad de memoria que requiere se le suele llamar coste en espacio.
Es evidente que conviene buscar algoritmos correctos que mantengan tan bajo como sea posible el consumo de recursos que hacen del  sistema, es decir, que sean lo más eficientes posible. Cabe hacer notar que el concepto de eficiencia de un algoritmo es un concepto relativo, esto quiere decir que ante dos algoritmos correctos que resuelven el mismo problema, uno es más eficiente que otro si consume menos recursos. Por tanto, podemos observar que el concepto de eficiencia y en consecuencia el concepto de coste nos permitirá comparar  distintos algoritmos entre ellos.

En general, ¿cómo podemos elegir entre un algoritmo y otro si ambos resuelven el mismo problema?

Una posibilidad es hacerlo mediante pruebas empíricas. En este caso habría que traducir ambos algoritmos a un lenguaje de programación, realizar medidas del tiempo de ejecución de los programas cuando se aplican a un conjunto de muestras de entrada y a  partir de estas medidas intentar inferir el rendimiento de los programas. Pero este método tiene varios inconvenientes ya que los resultados dependen:

  • del subconjunto de pruebas escogidas
  • del ordenador en el que se realicen las pruebas
  • del lenguaje de programación utilizado o
  • del compilador, entre otros factores.

Además, no siempre es fácil implementar un algoritmo (algunos pueden ser muy largos o complicados), por tanto, en muchas ocasiones puede ser muy útil poder predecir cómo va a comportarse un algoritmo sin tenerlo que implementar. Para ello es conveniente analizar un algoritmo matemáticamente.

Coste de los algoritmos iterativos

Las siguientes reglas facilitan el cálculo o el análisis del coste de los algoritmos iterativos en el caso peor.

Owncloud : Your Cloud, Your Data, Your Way!

El fenómeno de la nube llegó hace tiempo para quedarse definitivamente entre nosotros. Nos facilita el trabajo y el ocio en muchos sentidos. Servicios como Dropbox trabajan en esta línea para facilitarnos el acceso remoto a nuestros archivos desde cualquier lugar del mundo y desde cualquier dispositivo con conexión a la Red. OwnCloud sigue esa filosofía pero con la particularidad indicada por su nombre: se trata de una aplicación web open source mediante la cual podremos crear nuestro almacén remoto privado, donde podremos guardar todo lo que queramos siempre que haya espacio suficiente en nuestro disco duro. De este modo, no será necesario utilizar servicios de terceros y tendremos control absoluto sobre quién accede a “nuestra nube”.

Anuncio Oficial :

Boston, MA – May 22, 2012 – ownCloud, the popular open source file sync and share project,today released version 4 of its community edition – adding innovations and enhancements that make the popular project even more flexible, secure and innovative.

ownCloud 4 – built through active community support – adds innovative features like file versioning, – which actively saves files, allowing users to “rollback” to previous versions – and a new API — giving developers an easy, stable and supported way to develop applications on top of ownCloud capabilities.

The latest version, updated from ownCloud 3 released January 30, also enables users to view Open Document Format (ODF used by LibreOffice, Apache OpenOffice and others) files – quickly and easily without having to download them – something only ownCloud offers.

In addition, ownCloud 4 includes an “experimental” feature for mounting of external file systems – including Dropbox, FTP and Google Drive as well as other popular consumer applications – enabling users to have all their file sync and share tools in a single ownCloud interface.

“Version 3 represented a great technology leap forward. As our community continues to grow, Version 4 has benefited greatly, and the result is the most innovative and flexible sync and share platform to date,” said Frank Karlitschek, founder ofownCloud. “The latest ownCloud offers features businesses and service providers have been asking for, and adds new features and applications that meet the needs of the community and will greatly enhance our upcoming commercial editions.”

With more than 450,000 users, ownCloud offers the ease-of-use of Dropbox with more flexibility and security. ownCloud users can run their own file sync and share services on their own hardware and storage, use popular public hosting and storage offerings, or both.