Compartiendo para dos mundos

Hablando de programación paralela.
Tutoriales en: https://www.youtube.com/user/jambrizgdl
Twitter: @dogoteacher

Buscar este blog

sábado, 26 de diciembre de 2009

Ejemplo en VS2008

A continuación se presenta un video que explica la conversión de una aplicación explicada en anteriores post ( ejecutada en modo consola ) a una aplicación de windows ( windows form application ) utilizando Ms Visual Studio 2008.

El código de la aplicación es el siguiente:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace winapp1
{
public partial class Form1 : Form
{
private void calculaPares(object nombre)
{
int cont = 0;
System.Console.WriteLine("iniciando: {0}", ((mensaje)nombre).msg);
for (int i = 1; i <= 500000; cont += (i % 2 == 0 ? 1 : 0), i += 1) ;
((mensaje)nombre).msg= "pares " + cont.ToString();
}

public Form1()
{
InitializeComponent();
}

private void btn_iniciar_Click(object sender, EventArgs e)
{
mensaje objMsg1 = new mensaje("pares"); //objeto intercambio de datos creado
Thread t1 = new Thread(this.calculaPares); //Objeto hilo creado
this.lb_pares.Text = objMsg1.msg; //etiqueta de la forma = "pares"
t1.Start( objMsg1 ); //inicia el hilo
while (t1.ThreadState == ThreadState.Running) ; //ciclo para esperar al hilo
this.lb_pares.Text = objMsg1.msg; //etiqueta de la forma = resultado hilo
}
}

public class mensaje
{
String msg_;

public mensaje(String valor)
{
msg_ = valor;
}

public String msg
{
get
{
return msg_;
}
set
{
msg_ = value;
}
}
}

}

miércoles, 23 de diciembre de 2009

Diferencia entre c# y JAVA en los hilos.

Para JAVA hay dos métodos para programar hilos en una clase. Uno de ellos es heredar de la clase Thread [1]. Esta es otra diferencia de C# con JAVA, el primero permite a una clase heredar de JAVA.

Por ejemplo dado este código.

using System;
using System.Threading;

namespace codigosEjemplov2
{

public class ejemplo1 :Thread
{

public static void calculaPares(object nombre)
{
int cont=0;
System.Console.WriteLine("iniciando: {0}", ((mensaje) nombre).msg );
for(int i=1; i<=500000; cont+=(i%2 ==0?1:0), i+=1 );
System.Console.WriteLine("pares {0} ", cont);
}

public static void Main()
{
ejemplo1 obj1= new ejemplo1(ejemplo1.calculaPares);
obj1.Start( );
}
}
}


Al compilar esta clase ejemplo1 se muestra el siguiente mensaje de error:


C:\temp>csc codigosEjemplov2.cs


Compilador de Microsoft (R) Visual C# 2008, versión 3.5.30729.1
para Microsoft (R) .NET Framework, versión 3.5
(C) Microsoft Corporation. Reservados todos los derechos.

codigosEjemplov2.cs(7,15): error CS0509: 'codigosEjemplov2.ejemplo1': no puede
derivar del tipo sealed 'System.Threading.Thread'
c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorlib.dll: (Ubicación del
símbolo relacionado con el error anterior)



La definición de la clase Thread como de tipo Sealed se dio en la ayuda de las referencias [1] en el siguiente párrafo.



[ComVisibleAttribute(true)]
[ClassInterfaceAttribute(ClassInterfaceType.None)]
public sealed class Thread : CriticalFinalizerObject,
_Thread



Referencia
[1] Class Thread. Sun. enlace 1

[2] MSDN Library, No declarar miembros protegidos en tipos sealed.
enlace 2

hilos en c#, el inicio básico

Un hilo es un subconjunto de sentencias de un programa con un objetivo específico. En un procesador con varios nucleos son ejecutados concurrentemente por cada nucleo; por lo tanto supone una mejora en la rapidez de ejecución de un programa.

Programar en hilos en procesadores multinucleo aprovecha la ejecución simultanea de varias partes del mismo programa por nucleos distintos,pudiendo accesar cada hilo de forma compartida variables del programa ("variables globales").

Algunos autores llaman códigos secuenciales a los que no usan hilos y códigos paralelos a los que sí los usan. Secuenciales porque debe de esperar cada actividad a que termine su antecesora; independientemente de si esta actividad es requisito previo o no para su ejecución. [apendice A]

Notas:
(1) Hilo en inglés es Thread, este término se usará en forma de sinónimo en ocasiones, dado que C# lo utiliza para definirlos.
(2) Algunos textos serán sustentados por ejemplos con código ejecutable ya probado, solo hay que ir a la referencia que se indicará con corchetes.

C# provee su namespace System.Threading para su soporte. En él distingue dos tipos de hilos:
(a) Ejecutados en primer orden -> foreground
Los hilos de forma predeterminada corresponden a esta categoría.
(b) Ejecutados en segundo plano -> background
Su característica peculiar es que terminan automáticamente cuando
han terminado todos lo hilos de tipo foreground del proceso. Para
generarse hay que cambiar la propiedad IsBackground a True.

Tal y como un proceso que pasa por varios estados los hilos también,sus estados son:
(1) Running
(2) StopRequested
(3) SuspendRequested
(4) Background
(5) Unstarted
(6) Stopped
(7) WaitSleepJoin
(8) Suspended
(9) AbortRequested
(10) Aborted

El siguiente enlace en español del MSDN da una explicación de cada uno de dichos estados [1]

Los hilos en C# pueden generarse definiendo para cada hilo un punto de entrada. ¿qué es esto? Un punto de entrada es un método de una clase que inicia la ejecución de un hilo; pueden existir distintos puntos de entrada para distintos hilos en una misma clase. Estos métodos deben tener las siguientes características:
(a) Públicos
(b) No regresan un resultado (void )

De lo contrario se generará un error al momento de compilar la clase.

Los métodos que pueden ser puntos de entrada pueden ser estáticos o no. Si son estáticos no tiene que generarse un objeto de la clase a la que pertenecen [apéndice B], de lo contrario si debe de generarse el objeto previamente [apéndice C].

Nota: Los métodos estáticos por definición deben de ser públicos, pero los métodos de instancia No necesariamente. C# permite definir puntos de entrada como métodos de instancia privados.[apéndice D]

Al punto de entrada se le pueden pasar parámetros, pero este solo puede ser uno, de la clase object [apéndice E]. Si se quieren pasar múltiples datos solo hay que generar una clase que sirva de transporte para ellos [apéndice F].

A continuación el proceso de creación de un hilo realizado por pasos:

( 1 ) Se genera un objeto de la clase Thread que controlará el hilo y que recibe como parámetro en su constructor la referencia del método que va a ejecutar como punto de entrada del hilo.

Thread h = new Thread( );

puede ser: Un método estático o uno de instancia.
Clase.metodo -> para un método estático [apéndice B]
objeto.metodo -> para un método de instancia [apéndice C]

( 2 ) Iniciar el objeto hilo que se acaba de generar, invocando al método
Start.
h.Start();

Si el método recibe un parámetro de tipo object este debe de indicarse ahora [apéndice F].

Referencias
[1] MSDN Library, ThreadState. enlace
Describe los estados que puede tener un hilo en .NET
[2] Wilsonmar. Thread programming. enlace
Realiza comparaciones entre distintos lenguajes para programar en hilos.
[3] Anita May Joseph. Introducing multithreaded programming in C#. enlace
[4] MSDN Library, ParameterizedThreadStart. enlace
Muestra ejemplos y describe la clase ParameterizedThreadStart, que se utiliza
para definir un punto de inicio de un hilo con parámetros.

Apéndices

Apéndice A
Código ejemplo, realizando en forma secuencial. No utiliza hilos.Calcula la cantidad de números pares e impares desde el 1 hasta el 500,000


using System;
using System.Threading;

namespace codigosEjemplo
{

public class ejemplo1
{
public void calculaPares()
{
int cont=0;
for(int i=1; i<=500000; cont+=(i%2 ==0?1:0), i+=1 );
System.Console.WriteLine("pares {0}", cont);
}

public void calculaImpares()
{
int cont=0;
for(int i=1; i<=500000; cont+=(i%2==1?1:0), i+=1 );
System.Console.WriteLine("Impares {0}", cont);
}

public static void Main()
{
ejemplo1 obj1= new ejemplo1();
System.Console.WriteLine("pares hasta el 500,000");
obj1.calculaPares();
obj1.calculaImpares();
}
}
}


Apéndice B
Código ejemplo, realizando en forma paralela. Utiliza hilos. Calcula la cantidad de números pares e impares desde el 1 hasta el 500,000 . El punto de entrada al hilo es un método estático.


using System;
using System.Threading;

namespace codigosEjemplo
{

public class ejemplo1
{

public static void calculaPares()
{
int cont=0;
for(int i=1; i<=500000; cont+=(i%2 ==0?1:0), i+=1 );
System.Console.WriteLine("pares {0}", cont);
}

public static void calculaImpares()
{
int cont=0;
for(int i=1; i<=500000; cont+=(i%2==1?1:0), i+=1 );
System.Console.WriteLine("Impares {0}", cont);
}

public static void Main()
{
//ejemplo1 obj1= new ejemplo1();
System.Console.WriteLine("pares hasta el 500,000");
Thread t1= new Thread( ejemplo1.calculaPares );
Thread t2= new Thread( ejemplo1.calculaImpares );
t1.Start();
t2.Start();
}
}
}



Apéndice C
Código ejemplo, realizando en forma paralela. Utiliza hilos.Calcula la cantidad de números pares e impares desde el 1 hasta el 500,000 . El punto de entrada al hilo es un método de instancia.


using System;
using System.Threading;

namespace codigosEjemplo
{

public class ejemplo1
{

public void calculaPares()
{
int cont=0;
for(int i=1; i<=500000; cont+=(i%2 ==0?1:0), i+=1 );
System.Console.WriteLine("pares {0}", cont);
}

public void calculaImpares()
{
int cont=0;
for(int i=1; i<=500000; cont+=(i%2==1?1:0), i+=1 );
System.Console.WriteLine("Impares {0}", cont);
}

public static void Main()
{
ejemplo1 obj1= new ejemplo1();
System.Console.WriteLine("pares hasta el 500,000");
Thread t1= new Thread( obj1.calculaPares );
Thread t2= new Thread( obj1.calculaImpares );
t1.Start();
t2.Start();
}
}
}


Apéndice D
Código ejemplo, realizando en forma paralela. Utiliza hilos.
Calcula la cantidad de números pares e impares desde el 1 hasta el 500,000 . El punto de entrada al hilo es un método de instancia que es privado, pero aún así compila el código y lo ejecuta correctamente.


using System;
using System.Threading;

namespace codigosEjemplo
{

public class ejemplo1
{

//public void calculaPares()
private void calculaPares()
{
int cont=0;
for(int i=1; i<=500000; cont+=(i%2 ==0?1:0), i+=1 );
System.Console.WriteLine("pares {0}", cont);
}

//public void calculaImpares()
private void calculaImpares()
{
int cont=0;
for(int i=1; i<=500000; cont+=(i%2==1?1:0), i+=1 );
System.Console.WriteLine("Impares {0}", cont);
}

public static void Main()
{
ejemplo1 obj1= new ejemplo1();
System.Console.WriteLine("pares hasta el 500,000");
Thread t1= new Thread( obj1.calculaPares );
Thread t2= new Thread( obj1.calculaImpares );
t1.Start();
t2.Start();
}
}
}


Apéndice E
Código ejemplo, realizando en forma paralela. Utiliza hilos. Calcula la cantidad de números pares e impares desde el 1 hasta el 500,000 . El punto de entrada al hilo es un método de instancia que es privado, pero aún así compila el código y lo ejecuta
correctamente.Recibe como parámetro un objecto de la clase object.


using System;
using System.Threading;

namespace codigosEjemplo
{

public class ejemplo1
{

//public void calculaPares()
private void calculaPares(object nombre)
{
int cont=0;
System.Console.WriteLine("iniciando: {0}", nombre );
for(int i=1; i<=500000; cont+=(i%2 ==0?1:0), i+=1 );
System.Console.WriteLine("pares {0} ", cont);
}

//public void calculaImpares()
private void calculaImpares(object nombre)
{
int cont=0;
System.Console.WriteLine("iniciando: {0}", nombre );
for(int i=1; i<=500000; cont+=(i%2==1?1:0), i+=1 );
System.Console.WriteLine("impares {0} ", cont);
}

public static void Main()
{
ejemplo1 obj1= new ejemplo1();
System.Console.WriteLine("pares hasta el 500,000");
Thread t1= new Thread( obj1.calculaPares );
Thread t2= new Thread( obj1.calculaImpares );
t1.Start("pares");
t2.Start("impares");
}
}
}


Apéndice F
Código ejemplo, realizando en forma paralela. Utiliza hilos. Calcula la cantidad de números pares e impares desde el 1 hasta el 500,000 . El punto de entrada a uno de los hilos es un método de instancia que es privado y para el otro hilo es público.Recibe como parámetro un objecto de la clase object que proviene de una
clase que unicamente sirve para transportar parámetros. Esta clase pudo tener más propiedades.


using System;
using System.Threading;

namespace codigosEjemplo
{

public class mensaje
{
String msg_;

public mensaje(String valor)
{
msg_= valor;
}

public String msg
{
get
{
return msg_;
}
set
{
msg_= value;
}
}
}

public class ejemplo1
{

public void calculaPares(object nombre)
{
int cont=0;
System.Console.WriteLine("iniciando: {0}", ((mensaje) nombre).msg );
for(int i=1; i<=500000; cont+=(i%2 ==0?1:0), i+=1 );
System.Console.WriteLine("pares {0} ", cont);
}

//public void calculaImpares()
private void calculaImpares(object nombre)
{
int cont=0;
System.Console.WriteLine("iniciando: {0}", ((mensaje) nombre).msg );
for(int i=1; i<=500000; cont+=(i%2==1?1:0), i+=1 );
System.Console.WriteLine("impares {0} ", cont);
}

public static void Main()
{
ejemplo1 obj1= new ejemplo1();
mensaje objMsg1= new mensaje("pares");
mensaje objMsg2= new mensaje("impares");
System.Console.WriteLine("pares hasta el 500,000");
Thread t1= new Thread( obj1.calculaPares );
Thread t2= new Thread( obj1.calculaImpares );
t1.Start( objMsg1 );
t2.Start( objMsg2 );
}
}
}

martes, 22 de diciembre de 2009

Índice de sitios para aprender a programar en paralelo usando JAVA o C#

En lugar de escribir un pequeño tutorial de como programar en paralelo usando estos dos lenguajes: JAVA o C# .He decidido mostrar un índice de enlaces a páginas que lo hacen con el fin de no duplicar información y al mismo tiempo reconocer a las personas que en lo particular creo explican el tema de forma fácil para que todos sus lectores lo entiendan.

JAVA
Antonio Bel Puchol
------------------
Referencia 1
Referencia 2

Nicolás Lichtmaier.
Referencia 1

Agustín Froufe
Referencia 1

Sun, traductor: Juan Antonio Palos
Referencia 1

En lo personal creo que el tutorial de Agustín Froufe es el más completo, pero nadie mejor que el lector/programador para decidir esto.

C#
En C# me encontré con una triste realidad, NO descubrí ningun sitio web en el cual me explicaran de forma tan clara como los anteriores sitios la programación con hilos en este lenguaje.

Los enlaces que encontré fueron ejemplos ya realizados que utilizan hilos y muestran la forma en que los hicieron; pero este no era el objetivo de mi post; así que no los mostraré.

Si tu lector tienes alguna referencia comunicala por favor, indicando el nombre del autor y el enlace. Pero recuerda OJO! debe de ser un enlace tan bueno como los anteriores escritos para JAVA y en español.

lunes, 21 de diciembre de 2009

First example of threads on C#

The next code in c# generated 100 names with two arrays without threads.

public class hilo__1
{
private String[] nombres= new String[10];
private String[] apellidos= new String[10];

public hilo__1()
{
nombres[0]= "jesus";
nombres[1]= "antonio";
nombres[2]= "claudia";
nombres[3]= "Pilar";
nombres[4]= "Magdalena";
nombres[5]= "Roberto";
nombres[6]= "Elias";
nombres[7]= "Ana";
nombres[8]= "Mario";
nombres[9]= "Maria";

apellidos[0]= "perez";
apellidos[1]= "rivera";
apellidos[2]= "marte";
apellidos[3]= "lopez";
apellidos[4]= "Liz";
apellidos[5]= "Cabrera";
apellidos[6]= "Macias";
apellidos[7]= "Rodriguez";
apellidos[8]= "Mares";
apellidos[9]= "Limon";
}

public void mostrar()
{
int i, j;
for(i=0; i< 10 ; i+=1)
{
for(j=0; j<10; j+=1 )
{
System.out.println(nombres[i] + " " + apellidos[j] );
}
}
}

public static void main(String[] args)
{
hilo__1 obj= new hilo__1();
obj.mostrar();
}

}

Now, the same code but with threads in c#

using System;
using System.Threading;

namespace hijos_v2
{
public class hilo2
{
private String[] nombres= new String[10];
private String[] apellidos= new String[10];
private int inicio;
private int termino;
private String name;

public hilo2(int i, int j, String n)
{
inicio= i;
termino= j;
name= n;

nombres[0]= "jesus";
nombres[1]= "antonio";
nombres[2]= "claudia";
nombres[3]= "Pilar";
nombres[4]= "Magdalena";
nombres[5]= "Roberto";
nombres[6]= "Elias";
nombres[7]= "Ana";
nombres[8]= "Mario";
nombres[9]= "Maria";

apellidos[0]= "perez";
apellidos[1]= "rivera";
apellidos[2]= "marte";
apellidos[3]= "lopez";
apellidos[4]= "Liz";
apellidos[5]= "Cabrera";
apellidos[6]= "Macias";
apellidos[7]= "Rodriguez";
apellidos[8]= "Mares";
apellidos[9]= "Limon";
}

public void mostrar()
{
int i, j;
for(i=inicio; i< termino; i+=1)
{
for(j=0; j " + nombres[i] + " " + apellidos[j] );
}
}
}

public static void Main()
{
hilo2 obj1= new hilo2(0,5,"1");
hilo2 obj2= new hilo2(5,10,"2");
Thread h1= new Thread( obj1.mostrar );
Thread h2= new Thread( obj2.mostrar );
h1.Start();
h2.Start();
}
}
}

Each thread work with the half of names of the first array, but take all names of the second array.

domingo, 20 de diciembre de 2009

Beging the study about parallel programming step by step

Intel is supporting parallel programming training because his processors are multicore

Your first step could be read the web page about developer training.

(1)
http://software.intel.com/en-us/developertraining/
Developer Training

I like the first article because explain the basic concepts and is simple for understand.

(2)
http://software.intel.com/en-us/articles/8-simple-rules-for-designing-threaded-applications/
8 Simple Rules for Designing Threaded Applications


There are some presentations on Ms Power Point that you must to read. I think they are a good step if you clicked the link named "Academic Courseware content site"

(3)
http://software.intel.com/en-us/articles/courseware-access/
Technology Curriculum

This page have three sections
(a) Multi Core Courseware from Intel
(b) Multi COre Courseware from faculty
(c) Intel Higher Ed Curriculum

Please choose the first option ( this material had been made for Intel people ).

(4)
http://software.intel.com/en-us/articles/multi-core-courseware-content-from-intel-1/
Multi Core Couseware from Intel

This page show you a menu, choose the option "4.a Multi core Programming for academia" and click over "Multicore programming for academia".

(5)
http://software.intel.com/en-us/articles/multi-core-programming-for-academia/
Multicore programming for academia

I believe this course is the best by his structure, if you know basic concepts you must to go to the second day. With this material you could think some exercises on C, C++, C#, JAVA, VB, so on

Paso por paso en el web de Intel sobre programación paralela para principantes

Iniciando paso por paso en la programación paralela

Intel está apoyando la capacitación en programación paralela ya que sus procesadores se han vuelto "multinucleo".

Puedes iniciar revisando la página dedicada al entrenamiento para desarrolladores:

(1)
http://software.intel.com/en-us/developertraining/
Developer Training

En lo personal puedo recomendar el artículo que ellos también recomiendan, ya que inicia con conceptos básicos y creo que el orden de exposición y la sencillez son buenos.

(2)
http://software.intel.com/en-us/articles/8-simple-rules-for-designing-threaded-applications/
8 Simple Rules for Designing Threaded Applications

Para iniciar con una serie de presentaciones en Ms Power Point
que van desde el conocimiento bàsico hasta uno medianamente
avanzado, creo que una buena recomendaciòn que puedo darte es
posterior a leer el paso 2, regresar a la pàgina (1) y oprimir
el enlace hacia "Academic Courseware content site"

(3)
http://software.intel.com/en-us/articles/courseware-access/
Technology Curriculum

En esta pàgina aparecen tres grandes divisiones:
(a) Multi Core Courseware from Intel
(b) Multi COre Courseware from faculty
(c) Intel Higher Ed Curriculum

Por favor escoge la primera opciòn, donde veras material
desarrolado por personal de Intel.

(4) Multi Core Couseware from Intel
http://software.intel.com/en-us/articles/multi-core-courseware-content-from-intel-1/

Nuevamente se vuelve a dividir en muchas opciones, mostràndose
un menu. Por favor escoge la opciòn "4.a Multi core Programming for Academia"
Una vez hecho esto solo se recorrerà al final de la pàgina, en ese momento
debes oprimir el enlace con el tìtulo " Multicore programming for academia".

(5)
http://software.intel.com/en-us/articles/multi-core-programming-for-academia/
Multicore programming for academia

Creo que este curso es el que mejor está estructurado. si conoces conceptos básicos
salta al dìa 2. Este material te darà muchas ideas en que pensar para comenzar a
practicar la programaciòn con hilos usando C, C++, C#, JAVA, VB, etc.