Este año, había escrito una demostración de generación de fractal, usando DSS/CCR, ver:
Distributed Agents and Fractals using DSS/VPL
Agentes Distribuidos usando DSS/VPL
Ahora, estoy explorando pasar el ejemplo a ejecución en paralelo, usando, entre otras tecnologías, Task Parallel Library, threads, o MPI (Message Passing Interface). Antes de pasar a programar esas nuevas versiones, añadí a mi proyecto Google code ajcodekatas, una aplicación base, un WinForm que dibuja un fractal, usando un solo thread, el mismo del proceso de la GUI:
http://code.google.com/p/ajcodekatas/source/browse/#svn/trunk/FractalExample
Tiene una librería de clases, con las clases principales, y un proyecto WinForm, que usa un objeto Calculator para calcular un Sector del fractal. Un fragmento de la invocación:
private void Calculate()
{
Bitmap bitmap = new Bitmap(pcbFractal.Width, pcbFractal.Height);
pcbFractal.Image = bitmap;
pcbFractal.Refresh();
realWidth = realDelta * pcbFractal.Width;
imgHeight = imgDelta * pcbFractal.Height;
realMin = realCenter - realWidth / 2;
imgMin = imgCenter - imgHeight / 2;
int width = pcbFractal.Width;
int height = pcbFractal.Height;
SectorInfo sectorinfo = new SectorInfo()
{
FromX = 0,
FromY = 0,
Width = width,
Height = height,
RealMinimum = realMin,
ImgMinimum = imgMin,
Delta = realDelta,
MaxIterations = colors.Length,
MaxValue = 4
};
Calculator calculator = new Calculator();
Sector sector = calculator.CalculateSector(sectorinfo);
this.DrawValues(sector.FromX, sector.FromY, sector.Width, sector.Height, sector.Values);
}
Ejecutando el proyecto Fractal.GUI, y haciendo click en el botón de Calculate, obtenemos:
Podemos arrastrar el mouse, seleccionando una zona. Al soltarlo, una nueva imagen es generada. Podemos cambiar los colores, que son generados al azar:
Próximos pasos
Quiero añadir en las nuevas versiones:
- Una versión multithread
- Una versión en paralelo usando Task Parallel Library
- Una versión distribuida (MPI.NET? AjMessages?)
Parte de la aplicación la vamos a mostrar en el webcast de hoy:
Webcast de desarrollo con Windows HPC Server 2008
Si son impacientes, puede ver este excelente tutorial, que implementa una aplicación fractal usando HPC 2008, y también con las tecnologías que mencioné arriba, está listo para descargar con código desde:
Learning Parallel Programming — from shared-memory multi-threading to distributed-memory multi-processing
Sugerencias, comentarios, bienvenidos!
Angel "Java" Lopez
http://www.ajlopez.com/en
http://twitter.com/ajlopez