En esta práctica tendréis que implementar una verión paralela del problema de N-cuerpos. Este problema implica simular el movimiento de N cuerpos moviéndose bajo las fuerzas gravitatorias que ejerce cada cuerpo sobre todos los demás. El cómputo debería discretizarse en el tiempo, es decir, la simulación implica varios pasos de tiempo. En cada paso de tiempo, el programa calcula las fuerzas gravitatorias que se ejercen sobre cada estrella por todas las demás y actualiza la posición y velocidad de la estrella.
La fuerza gravitatoria se calcula con la siguiente fórmula:
F = K * m1 * m2 / ( r * r )
donde m1 y m2 son las masas de los dos cuerpos y r es la distancia que las separa.
La fuerza gravitatoria se usa para actualizar la nueva posición y velocidad de los cuerpos de la siguiente forma: para cada cuerpo i, la fuerza F se calcula y descompone en sus componentes Fxi y Fyi. Estas componentes se suman, obteniendose la fuerza gravitatoria total que se aplica a un cuerpo, Fx y Fy. A partir de estos valores se calculan las correspondientes aceleraciones, ax y ay, y velocidades, vx y vy, a lo largo de los ejes X e Y (ax = fx / m y vx = ax * t), donde t es el paso de tiempo.
La simulación se realiza en un espacio bidimensional. Los valores de entrada de la simulación se proporcionan en un fichero que consiste de dos partes:
Suposiciones:
Deberéis implementar un programa paralelo en MPI que realice eficientemente los cálculos. Se os proporciona una versión secuencial del programa, que toma como parámetro un fichero que contiene los parámetros de la simulación y una lista de atributos de cuerpos como se explicó anteriormente.
Deberéis implementar dos versiones del programa con diferentes estrategias de asignación:
El programa recibirá exactamente 4 argumentos:
./nbody <fichero_entrada> <fichero_salida> <X11_0|1> <tipo_reparto>
Siendo:
Por ejemplo, la siguiente orden lanza 16 procesos del programa tomando como fichero de entrada ‘example’, guardará el resultado en el fichero ‘salida’, no mostrará interfaz gráfica y usará reparto por carga de trabajo:
mpiexec -n 16 ./nbody example salida 0 1
El programa (nbody.c) se entregará electrónicamente y se corregirá mediante un corrector automático, por tanto, es ESENCIAL que el tratamiento de los argumentos sea exactamente el que se pide en los Requisitos de Programación.
La versión paralela del programa consistirá de los siguientes pasos:
Deberéis tomar medidas para 1, 4, 8, 12 y 16 procesadores: unas con igual número de cuerpos y otras con igual carga de trabajo.
Deberéis entregar:
double tstart = MPI_Wtime();
code to be timed
double tfinish = MPI_Wtime();
double TotalTime = tfinish - tstart;
Las prácticas se corregirán en las aulas informáticas usadas durante el curso (f1XX y f2XX). La forma de corregir la práctica será la siguiente:
Se descarga y se descomprime el código de partida inicial y se copia el nbody.c entregado a dicho directorio:
tar zxvf iiac2_2008.tar.gz cd iiac2_2008 cp /ruta/a/nbody.c .
mpicc -c nbody.c -o nbody.o mpicc -c video.c -o video.o mpicc nbody.o video.o -o nbody -lm -lX11 -llmpe -lmpe
mpdboot -n 16 -f maquinas
Para cada <fichero_entrada>
Para cada <tipo_reparto>="0 1"
Para cada <num_procesos>="1 2 4 8 12 16"
mpiexec -n <num_procesos> ./nbody <fichero_entrada> salida-<tipo_reparto>-<num_procesos> 0 <tipo_reparto>
mpdallexit
Para cada <fichero_entrada> ./nbody <fichero_entrada> salida-secuencial 0 diff --from-file=salida-secuencial salida-0-1 salida-0-4 ... salida-0-16 diff --from-file=salida-secuencial salida-1-1 salida-1-4 ... salida-1-16