MPI & Eclipse

La configuración de MPI dentro del entorno eclipse puede ser confusa, aunque encontré todo lo necesario (aunque apenitas desactualizado) aquí. Si bien puedo correr cualquier programa escrito con MPI (instalando cualquier entorno de desarrollo MPI en linux) no logro que Eclipse interprete los comandos propios de MPI y los marca como error…. Pero a la hora de compilar, debugear y ejecutar, se trabaja lo más bien… Cuestión de seguir investigando…

Anuncios

Implementación Serial de la función de Rosenbrock en ANSI-C

Con el fin de tener un benchmark serial disponible, hice una implementación de un algoritmo genético simple (con algunos parámetros ajustables) de la minimización de la función de Rosenbrock. La dejo subida aquí.

El desempeño es muy bueno, la voy a usar como referencia para estudiar el speed up de las versiones paralelizables, en principio en MPI, más luego en otras plataformas. Acepto sugerencias de optimización del código, ya que la idea para medir speed up es utilizar la mejor versión existente del problema.

Dado que va a ser utilizada como benchmark no utilicé un corte de procesamiento en el caso de llegar a un óptimo global (si es que se puede conocer), ya que no estaría comparando una misma cantidad de iteraciones, cosa que puede ser muy útil.

La salida de una corrida se ve así:

 Fitness del mejor individuo generacion 0 = 4998.768001 [x=1.013442  y=0.916077]
 Fitness del mejor individuo generacion 5 = 4999.850536 [x=1.364238  y=1.874105]
 Fitness del mejor individuo generacion 56 = 4999.945572 [x=0.786639  y=0.609365]
 Fitness del mejor individuo generacion 90 = 4999.993030 [x=1.011555  y=1.014976]
 Fitness del mejor individuo generacion 257 = 4999.995249 [x=1.023401  y=1.040867]
 Fitness del mejor individuo generacion 290 = 4999.996838 [x=1.001817  y=1.009258]
 Fitness del mejor individuo generacion 671 = 4999.997794 [x=1.039652  y=1.078359]
 Fitness del mejor individuo generacion 891 = 4999.999793 [x=0.988134  y=0.975593]
 Fitness del mejor individuo generacion 20930 = 4999.999837 [x=1.002684  y=1.006624]
 Fitness del mejor individuo generacion 21727 = 4999.999890 [x=0.990997  y=0.981535]
 Fitness del mejor individuo generacion 52676 = 4999.999977 [x=1.001246  y=1.002026]
 Fitness del mejor individuo generacion 52678 = 4999.999977 [x=1.001244  y=1.002026]
 Fitness del mejor individuo generacion 128817 = 4999.999993 [x=0.997415  y=0.994781]
 Fitness del mejor individuo generacion 253474 = 4999.999996 [x=0.998250  y=0.996419]
 Fitness del mejor individuo generacion 547343 = 4999.999997 [x=0.998733  y=0.997576]
 Fitness del mejor individuo generacion 959670 = 4999.999999 [x=0.999087  y=0.998105]

Llegó a una diferencia menor a 10-6 en la función objetivo, y a una distancia menor a 10-3 en el plano de la función, lo que es muy positivo en una exploración discreta (la representación es del algoritmo genético simple, es decir, un arreglo de bits).

Ansi-C, Eclipse y Math.h

Escribiendo un algoritmo genético simple de benchmark para el cluster (una función de Rosenbrock) en ANSI-C, MPI con Eclipse me topé con un problema… Resulta que al utilizar la función pow de la librería Math, muchas veces (y no siempre) el compilador arrojaba undefined reference to ‘pow’.

Después de mucho pensarlo, parecía que el criterio era que cuando utilizaba una variable (y no un literal) entero en el segundo miembro de la función… Igual, tratando de encontrar una relación de causa efecto me topé con una correlación… Inútil como casi toda mi erudicción.

Googleando me di cuenta que hay un problema por el que el linker no incluye a la librería math. Entonces intenté agregar el parámetro -lm al compilador sin mucho éxito (Eclipse). Hasta que me encontré con el amigo Dystopia que dio en el clavo.