Compartiendo para dos mundos

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

Buscar este blog

miércoles, 12 de marzo de 2014

estrategia de programación paralela: division de datos


El video 2 nos habla de:

Para programar de forma paralela tenemos que buscar "oportunidades"
La clave es tener a los cores trabajando simultáneamente. Hay tres estrategias sencillas
Que platica el expositor:
  • Descomposición de datos ( domain decomposition)
  • Descomposición de tareas ( task decomposition)
  • Generar una línea de producción (pipelining )

Todas ellas son muy sencillas:
Para la descomposición de datos hay que partir la información de forma que a cada core le toque procesar una parte de ella esto funciona cuando no hay dependencias entre el procesamiento de cada dato, es decir que el procesamiento del segundo dato dependa del resultado de procesar el primero. Por ejemplo, se tiene una lista de elementos y se aplicará una multiplicación a cada dato; entonces se parten el arreglo los cores y a cada uno le toda una parte, así que cada uno está procesando la parte que le corresponde.

Has implementado esta estrategia?
En que lenguaje?
Quieres compartir tu código con otros?
(no temas por la crítica, recuerda que hay que desechar el mito del genio programador! - link -)
Compartiendo todos podemos aprender y mejorar nuestros códigos.

éxito en tu programación!


jam

recursos para aprender programación paralela


En el link (minuto 8:48 ) habla que mas personas aprenden programación paralela 
(poco a poco, pero bueno algo es algo )

conoces recursos para aprender a programar de forma paralela usando los cores que tienes en tu compu?}

por favor, comparte si conoces algún otro mas.

introducción a la programación paralela -> https://www.udacity.com/course/cs344

Programacion paralela en .net framework ->  http://msdn.microsoft.com/es-es/library/dd460693(v=vs.110).aspx


Intel courseware sobre programación paralela -> http://software.intel.com/en-us/academic#pid-13124-91

exito en la semana!

jam


la enseñanza y la programación paralela

En el minuto 7 de la primara presentación el profesor hablaba sobre un problema que en lo personal creo que es el peor problema de la programación paralela:

"Most people do not learn parallel programming"   -- 
  la mayoría de las personas no aprende programación paralela


cuantos lenguajes les enseñan en la universidad?

cuando aprenderán programación paralela en esos lenguajes? ( si apenas hay tiempo de verlos en lo básico! )

existen lenguajes "pedagógicos" (es decir lenguajes que sirven para aprender ciertos conceptos de programación) , como Karel o Alice que enseñan programación estructurada u orientado a objetos, pero 

Hay algún lenguaje para enseñar conceptos de programación paralela?



éxito en la semana!

jam

lunes, 17 de febrero de 2014

Compiladores apoyando a la programación paralela

En el primer video del courseware de Intel, el expositor indica en una diapositiva lo siguiente:
"
Successful attempts require both
1. Understanding of where parallelism can be effective
2. Knowledge of how to design and implements good solutions.
"

Esto es correcto, pero también es cierto que actualmente hay vario compiladores que apoyan al dearrollador analizando su código y verificando los puntos donde se pueden genera hilos para aprovechar el paralelismo (con o sin la indicación explicita de parte del programador que convierta su código de "secuencial" a "paralelo" ).

Una de esas técnicas es muy sencilla, si ve que pueden partirse los datos que maneja el programa de forma que le toque una parte a un hilo distinto, el compilador generará el código necesario para que se generen los hilos que se requieren, por ejemplo:
for(i=0; i< 1000000; i++ )
{
 arreglo[ i ] = arreglo[ i ] * 50000;
}

El cálculo realizado en cada iteración solo afecta a un elemento y este valor calculado (por lo menos en el ciclo) no es dependiente de los otros valores en el ciclo, por lo tanto se podrán generar "n" cantidad de hilos que se repartan el trabajo de dicho ciclo.

éxito en la programación!

jam

Courseware de programación paralela en Intel

Recomendación para esta semana de auto-estudio:

Intel coloco hace tiempo este curso de programación paralela en base a videos.
El primer video habla de porque se requiere programar de forma paralela.

éxito en su programación

JAM


viernes, 26 de abril de 2013

programación paralela en .net

Estos son algunos de los principales recursos que puedes encontrar para iniciar en el mundo de la programación paralela para Microsoft .NET, están listados de menor a mayor complejidad:


http://channel9.msdn.com/Events/TechDays/TechDays-2011-Belgium/TD030
Parallel Programming in .NET 4.0 - Tasks and Threading

parallel computing on MSDN
http://msdn.microsoft.com/es-mx/vstudio/bb964701

Como depurar aplicaciones que tienen multiprocesos
http://msdn.microsoft.com/library/vstudio/ms164746(VS.110).aspx

Programando con subprocesos para ASP .net PERO! usando javascript!
http://msdn.microsoft.com/es-mx/library/windows/apps/hh700330.aspx

Patrones en el desarrollo de programación paralela usando .net
http://www.microsoft.com/en-us/download/details.aspx?id=19222

viernes, 5 de abril de 2013

Programación en tiempo real para JAVA

Encontré un artículo que recomiendo mucho en Dr Dobbs acerca de la programación en hilos para tiempo real de JAVA y posteriormente una Fe de Erratas sobre ese artículo escrito por el propio autor.

éxito el fin de semana!

jam

lunes, 11 de marzo de 2013

APIs disponibles para programación paralela en HTML5



La especificación HTML5 NO ha sido terminada y quedará lista para finales del 2014. Indica que para programar en forma paralela se tienen las siguientes opciones:
3 APIs distintas:
* Web Workers
* Parallel Javascript
* WebGL
* WebCL

Web workers
Es una API que especifica un modelo de programación basado en paso de mensajes. Sus objetos no comparten datos con los otros objetos "tradicionales" del DOM
(como Document).
Se implementa como un archivo javascript que se ejecuta de forma paralela a la página web que se está visualizando.
Entre la página web que se visualiza y el JS ejecutándose en paralelo se pueden enviar mensajes para disparar eventos.
Se recomienda para un uso de paralelismo "general" que no implica manejo de vectores y/o gráficos.

Parallel Javascript
También conocida como Rivel Trail, extiende la funcionalidad de JS por medio de estructuras que permiten el paralelismo y las operaciones que trabajan sobre ellas. Se recomienda para lograr mayor abstracción del cómputo paralelo en la aplicación web.

WebGL
Es un API de javascript basada en OpenGL ES 2.0 que trabaja con el objeto "canvas" de HTML5 . Se recomienda cuando se quiere sacar más provecho a la unidad de procesamiento de gráficos.

WebCL
Es un API de javascript que se basa en OpenCL ( el cual es un estándar de programación
en mutinucleos heterogéneos ). Es un modelo acelerador que genera un "kernel" que ejecuta el procesamiento que quieres.

Referencias
[1] Plan 2014. W3 Consorcium. http://dev.w3.org/html5/decision-policy/html5-2014-plan.html
Describe la planeación que se llevará a cabo este año para los entregables.
[2] Web Worker. Wikipedia. http://en.wikipedia.org/wiki/Web_worker
[3] WebGL- OpenGL ES 2.0 for the web. KHRONOS Group. http://www.khronos.org/webgl/
[3] WebCL . KHRONOS Group. http://www.khronos.org/webcl/
[4] RiverTrail. Intel. https://github.com/rivertrail/rivertrail/wiki

jueves, 15 de noviembre de 2012

Intel vs NVidia

Tratando de colocarse en el mercado de tarjetas con co-procesadores para proporcionar procesamiento paralelo de "altos vuelos", Intel ha sacado su Xeon Phi (hace 2 días ).

La revista Dr Dobbs da más detalles en uno de sus artículos al respecto y en Youtube ya esta también un conjunto de videos que apoyan su aprendizaje!

¿quién ganará?
(a) Intel
(b) NVidia


jam

lunes, 6 de agosto de 2012

Halide: The new MIT creation for image processing


Halide use parallelism for image-processing. You have to specify 2 things: the algorithm that you using and the processing schedule.

Halide is joining to the battle for the image processing against IAL


Halide usa la programación en paralelo para realizar el procesamiento de imágenes. Se necesita especificar 2 cosas: el algoritmo que se usará y una agenda del procesamiento ( como atacarás el problema usando la programación paralela ) Hay que recordar que hay varias formas de convertir un programa "serial" a paralelo .
Hay otros lenguajes de este tipo en la comunidad académica que buscan colocarse, uno de ellos IAL.

Para ver el artículo completo.

jam

martes, 3 de enero de 2012

Este es el enlace directo: http://msftdbprodsamples.codeplex.com/releases/view/55926 This is the link: http://msftdbprodsamples.codeplex.com/releases/view/55926
¿Donde se puede encontrar la base de datos de ejemplo para Ms SQLServer 2008 R2? http://sqlserversamples.codeplex.com/ Where do you find the sample database for Ms SQL Server 2008 R2?

miércoles, 31 de marzo de 2010

Pattern for parallel programming - concurrency stage

Introduction

This article is a code example that is changed from serial to parallel.




In the book "patterns for parallel programming" by Timothy G. Mattson, Beverly A. Sanders and Berna L. Massingill.
They have broken the pattern language structure into 4 design spaces.




The first design space is: "finding concurrency". In the next code ( that
show a plane that can shooting ) exists a "concurrency block" when each
shoot is moving. But this code is serial.




The serial code



#include <stdio.h>
#include <conio.h>
#include <windows.h>

/*
@autor jose jesus ambriz meza
@fecha 23/en/2010
@descrip programa en "simbolo de sistema" que muestra un avion
lanzando tiros ( máximo 10 ) no validado todavía la
eliminación de los tiros que llegan a la máxima columna.

this airplane can shooting 10 shot. It has a
concurrent code when the shots are moving.
*/
#define SIMBOLO_ASTERISCO '*'
#define CHARACTER_SALIDA 'x'
#define SIMBOLO_ARRIBA 'e'
#define SIMBOLO_ABAJO 'c'
#define SIMBOLO_DISPARO ' '
#define CANTIDAD_MAXIMA_DISPAROS 5
#define SIMBOLO_GUION '-'
#define TIEMPO_ESPERA_ENTRE_DISPAROS 30
#define COLUMNA_MAXIMA 40

void mostrarAvion( int c, int r, char simbolo );
void mostrarSimbolo( int c, int r, char simbolo );
void agregarDisparo( int c, int r, int colDisparos[],int renDisparos[], int *cantDisparos );

void main()
{
int colAsterisco=3, renAsterisco=10; //posicion del avion
char letra; //letra recibida
int colDisparos[ CANTIDAD_MAXIMA_DISPAROS ]; //columna de cada disparo
int renDisparos[ CANTIDAD_MAXIMA_DISPAROS ]; //renglón de cada disparo
int cantDisparos= 0; //cantidad de disparos
int disparoActual= 0;

clrscr(); //limpiar pantalla
mostrarAvion( colAsterisco, renAsterisco, SIMBOLO_ASTERISCO ); //mostrar avion por primera vez
while ( (letra=getch())!= CHARACTER_SALIDA ) //tomar lectura de teclado
{
mostrarAvion( colAsterisco, renAsterisco, SIMBOLO_DISPARO ); //borrar avion en cada movimiento
switch ( letra )
{
case SIMBOLO_ARRIBA: //avion hacia arriba
if ( renAsterisco>2 ) //si se puede hacer hacia arriba
{
renAsterisco-=1;
}
break;
case SIMBOLO_ABAJO: //avion hacia abajo
if ( renAsterisco<79 ) //si se puede hacer hacia abajo
{
renAsterisco+=1;
}
break;
case SIMBOLO_DISPARO:
if ( cantDisparos< CANTIDAD_MAXIMA_DISPAROS ) //hay disparos disponibles
{
agregarDisparo( colAsterisco, renAsterisco, colDisparos,renDisparos, &cantDisparos );
}
break;
}
mostrarAvion( colAsterisco, renAsterisco, SIMBOLO_ASTERISCO ); //mostrar avion en cada movimiento
/*
Begins concurrency block
*/
while ( !kbhit() )
{
if ( cantDisparos>0 ) //si hay disparos
{
mostrarSimbolo( //borrar el disparo
colDisparos[ disparoActual ],
renDisparos[ disparoActual ],
SIMBOLO_DISPARO );
colDisparos[ disparoActual ]+=1;
mostrarSimbolo( //mostrar el disparo
colDisparos[ disparoActual ],
renDisparos[ disparoActual ],
SIMBOLO_GUION );
Sleep( TIEMPO_ESPERA_ENTRE_DISPAROS );
//si el disparo realizado se salió de los límites de la pantalla
if ( colDisparos[ disparoActual ] >= COLUMNA_MAXIMA )
{
mostrarSimbolo( //borrar el disparo
colDisparos[ disparoActual ],
renDisparos[ disparoActual ],
SIMBOLO_DISPARO );
//si quedan más disparos por hacer
if ( disparoActual<(cantDisparos-1) )
{
//el último disparo remplaza al disparo actual
colDisparos[ disparoActual ]= colDisparos[ cantDisparos -1 ];
renDisparos[ disparoActual ]= renDisparos[ cantDisparos -1 ];
//se vuelve al anterior disparo para el siguiente
//IF repita el disparo de la posición actual
disparoActual -=1 ;
}
cantDisparos -= 1; //se elimina el último disparo porque este cambio de lugar por el disparo eliminado
}
//si NO se recorrieron todos los disparos
if ( disparoActual< (cantDisparos-1) )
disparoActual += 1; //seguir con el siguiente disparo
else
disparoActual= 0; //volver al primer disparo
}
}
/*
Ends concurrency block
*/

}
}

/*
@descrip muestra el avion en una posición determinada
@param c columna de las alas del avión
@param r renglón del centro del avión
@param simbolo character con el cual se escribirá el avion, puede
mostrarse o borrarse el avión con la misma subrutina.
*/
void mostrarAvion( int c, int r, char simbolo )
{
gotoxy(c,r);printf("%c", simbolo );
gotoxy(c,r-1);printf("%c", simbolo );
gotoxy(c,r+1);printf("%c", simbolo );
gotoxy(c+1,r);printf("%c", simbolo );
}

/*
@descrip muestra un símbolo en una posición determinada
@param c columna del símbolo
@param r renglón del símbolo
@param simbolo character que se muestra
*/
void mostrarSimbolo( int c, int r, char simbolo )
{
gotoxy(c,r);
printf("%c", simbolo );
}

/*
@descrip agrega un disparo al arreglo de disparos
@param c columna del avión del cual sale el disparo
@param r renglón del avión del cual sale el disparo
@param renDisparos arreglo que contiene los renglones de cada disparo
@param colDisparos arreglo que contiene las columnas de cada disparo
@param *cantDisparos cantidad de disparos, se cambiará al final
*/
void agregarDisparo( int c, int r, int colDisparos[],int renDisparos[], int *cantDisparos )
{
colDisparos[ *cantDisparos ]= c + 2;
renDisparos[ *cantDisparos ]= r;
(*cantDisparos) += 1;
}





The next step is "Algorithm structure". One decision is made a thread for
the plane and another for all the shoots; but you can made a thread for the plane y one thread for each shoot.
Which are the best choice?

to be continued in the next article...

References
[1] Timothy G. Mattson, Beverly A. Sanders and Berna L. Massingill.
Patterns for Parallel Programming. 2005. Addison Wesley

viernes, 19 de marzo de 2010

Example of threads and Application.Run with two forms

In this code, Main method generate two applications in differents threads


using System;
using System.Windows.Forms;
using System.Threading;

/*
@descrip Execute two forms with "application.run" method.
@autor José Jesús Ambriz Meza
@fecha 19/03/2010
@version 1
*/
namespace variasVentanas
{
public class ventana: Form
{
public ventana(string t)
{
this.Text= t;
}

//start method for threading
public void inicio()
{
Application.Run( this ); //start this application
}

public static void Main()
{
//new ventana object ( form object )
ventana obj1= new ventana("uno");
//new ventana object ( form object )
ventana obj2= new ventana("dos");
//new thread with obj1
Thread t1= new Thread( obj1.inicio );
//new thread with obj2
Thread t2= new Thread( obj2.inicio );
//execute Application.Run with obj1
t1.Start();
//execute Application.Run with obj2
t2.Start();
}
}
}

domingo, 3 de enero de 2010

recomendación de curso en sitio web de Intel

Esta es un video que muestra un curso que recomiendo para iniciar en la programaciòn paralela. Este curso se encuentra en los cursos que promueve ( courseware access ) Intel link.

Red de desarrolladores en programaciòn paralela

Es un esfuerzo de Intel por motivar la autocapacitación y el intercambio de experiencias entre programadores de todo el mundo en programación paralela.

link

domingo, 27 de diciembre de 2009

Conversión aplicación consola a modo windowsForm

La información del programa mostrado en el anterior post (que tiene un video ) es colocada en el grupo de programación paralela que se encuentra en el siguiente enlace

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 );
}
}
}