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:
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:
Nos leemos!
Angel “Java” Lopez
http://www.ajlopez.com
http://twitter/ajlopez