Fractales usando MPI.NET y HPC

Actualicé mi ejemplo de fractal y ahora soporta MPI.NET (Message Passing Interface with .NET) y tasks paramétricas en Windows HPC Server 2008. El ejemplo puede ser bajado desde mi proyecto Google code ajcodekatas:

http://code.google.com/p/ajcodekatas/source/browse/#svn/trunk/FractalExample

Hay dos soluciones. Esta es la Fractal.sln:

El proyecto Fractal.Console es una aplicación de consola que toma parámetros de la línea de comando. Los usa para generar un sector del fractal, al que serializa binariamente en un archivo:

 

static void Main(string[] args) { if (args[4].Equals("*")) args[4] = "0"; SectorInfo sectorinfo = new SectorInfo() { RealMinimum = Convert.ToDouble(args[0]), ImgMinimum = Convert.ToDouble(args[1]), Delta = Convert.ToDouble(args[2]), FromX = Convert.ToInt32(args[3]), FromY = Convert.ToInt32(args[4]), Width = Convert.ToInt32(args[5]), Height = Convert.ToInt32(args[6]), MaxIterations = Convert.ToInt32(args[7]), MaxValue = Convert.ToInt32(args[8]) }; Calculator calculator = new Calculator(); Sector sector = calculator.CalculateSector(sectorinfo); SectorSerializer serializer = new SectorSerializer(); string filename = string.Format("{0}-{1}-{2}-{3}-{4}.bin", args[9], sectorinfo.FromX, sectorinfo.FromY, sectorinfo.Width, sectorinfo.Height); serializer.Serialize(sector, filename); }

 


Pueden ejecutar el proyecto en modo DebugYou can run the project in Debug mode, con parámetros:



Lancen el nuevo proyecto Fractal.GUIFiles. Es una aplicación WinForm, como la que presenté en mi anterior posts, pero con un nuevo botón Read a la derecha:


 


Con ese botón, pueden seleccionar uno más archivos de sector, como el que generó Fractal.Console en su directorio bin\debug:



Este es el resultado:



Creando sectores con HPC


La aplicación de consola puede ser usada en un cluster. Supongamos que la aplicación está instalada en el directorio c:\FractalConsole en cada nodo del cluster. Supongamos que el nombre de la máquina head del cluster es HEAD-NODE, y que ahí hay un directorio compartido llamado \shared, que puede ser accedido desde cada nodo. Entones, podemos lanzar un job paramétrico:


job submit /parametric:0-500:100 c:\FractalConsole\Fractal.Console.exe 0.3 0.3 0.01 0 * 1000 100 2000 4 \\HEAD-NODE\shared\sector


Este comando envía un trabajo al cluster, pero con un parámetro variable. El asterisco en la lista de parámetros será reemplazado por los valores 0,100,200,300,400 y 500 (en este caso, es la coordinada Y de la esquina superior izquierda de un sector). Cada ejecución producirá un archivo con un sector serializado en el directorio compardio, que podremos leer y mostrar usando la aplicación Fractal.GUIFiles.


Usando MPI.NET


Hay una segunda solución Fractal.MPI:



Este código usa MPI (Message Passing Interface). El rank 0 recibe los datos de un sector, y lo parte en subsectores, que son enviados a todos los ranks (instancias) de la aplicación. Cada instancia genera un archivo, con la serialización de un subsector del sector original. 


Para compilar y ejecutar este ejemplo hay que instalar el HPC Pack que se baja de:


HPC Pack 2008 SDK download

e instalar el MPI.NET Software

(Yo instalé MPI.NET SDK.msi pero también bajé y expandí MPI.NET-1.0.0.zip: tiene mejores ejemplos, con soluciones completas para Visual Studio)

(Nota: si quieren ejecutar el ejemplo bajo XP Pro, deben bajarse NO el HPC Pack, sino la anterior versión:
Microsoft Compute Cluster Pack SDK

El nuevo SDK tiene un problema con XP. Más información en:

http://social.microsoft.com/Forums/en-US/windowshpcdevs/thread/19deb181-15c2-40be-bb5e-2d4604b984a4
http://www.pluralsight.com/community/blogs/drjoe/archive/2008/10/10/32-bit-sdk-for-hpc-server-2008-fails-quot-the-procedure-entry-point-getprocessidofthread-could-not-be-located-quot.aspx
)

Podemos ejecutar el programa usando el utilitario mpiexec, que lanza varias instancias de un mismo programa, conectados como ranks de MPI:


mpiexec -n 10 Fractal.Mpi.Exe 0 0 0.01 0 0 500 1000 2000 4 sector

El sector será producido entonces por 10 instancias, en este caso:


que podemos leer y mostrar usando Fractal.GUIFiles.

Podemos ejecutar el anterior comando en un HPC cluster, usando:

job submit /numnodes=10 mpiexec c:\FractalMpi\Fractal.Mpi.Exe 0 0 0.01 0 0 500 1000 2000 4 \\HEAD-NODE\shared\sector

(asumiendo que hemos copiado la aplicación en cada nodo, dentro del directorio c:\FractalMpi de cada nodo)

Para un más completo ejemplo, ver:

Learning Parallel Programming — from shared-memory multi-threading to distributed-memory multi-processing

Nos leemos!

Angel “Java” Lopez
http://www.ajlopez.com
http://twitter/ajlopez

This entry was posted in 1389, 5374, 9409. Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>