Commit 3819a29c authored by iker_martin's avatar iker_martin
Browse files

Nueva version. Permite comunicacion uno a muchos en bucle de computo

parent 2663ec23
...@@ -33,6 +33,8 @@ static int handler(void* user, const char* section, const char* name, ...@@ -33,6 +33,8 @@ static int handler(void* user, const char* section, const char* name,
} else if (MATCH("general", "matrix_tam")) { } else if (MATCH("general", "matrix_tam")) {
pconfig->matrix_tam = atoi(value); pconfig->matrix_tam = atoi(value);
} else if (MATCH("general", "comm_tam")) {
pconfig->comm_tam = atoi(value);
} else if (MATCH("general", "SDR")) { } else if (MATCH("general", "SDR")) {
pconfig->sdr = atoi(value); pconfig->sdr = atoi(value);
} else if (MATCH("general", "ADR")) { } else if (MATCH("general", "ADR")) {
...@@ -127,7 +129,7 @@ void free_config(configuration *user_config) { ...@@ -127,7 +129,7 @@ void free_config(configuration *user_config) {
} }
} }
/* /* TODO Añadir COMMTAM
* Imprime por salida estandar toda la informacion que contiene * Imprime por salida estandar toda la informacion que contiene
* la configuracion pasada como argumento * la configuracion pasada como argumento
*/ */
...@@ -245,15 +247,15 @@ configuration *recv_config_file(int root, MPI_Comm intercomm) { ...@@ -245,15 +247,15 @@ configuration *recv_config_file(int root, MPI_Comm intercomm) {
* de la estructura de configuracion con una sola comunicacion. * de la estructura de configuracion con una sola comunicacion.
*/ */
void def_struct_config_file(configuration *config_file, MPI_Datatype *config_type) { void def_struct_config_file(configuration *config_file, MPI_Datatype *config_type) {
int i, counts = 8; int i, counts = 9;
int blocklengths[8] = {1, 1, 1, 1, 1, 1, 1, 1}; int blocklengths[9] = {1, 1, 1, 1, 1, 1, 1, 1, 1};
MPI_Aint displs[counts], dir; MPI_Aint displs[counts], dir;
MPI_Datatype types[counts]; MPI_Datatype types[counts];
// Rellenar vector types // Rellenar vector types
types[0] = types[1] = types[2] = types[3] = types[4] = types[5] = MPI_INT; types[0] = types[1] = types[2] = types[3] = types[4] = types[5] = types[6] = MPI_INT;
types[6] = MPI_FLOAT; types[7] = MPI_FLOAT;
types[7] = MPI_DOUBLE; types[8] = MPI_DOUBLE;
// Rellenar vector displs // Rellenar vector displs
MPI_Get_address(config_file, &dir); MPI_Get_address(config_file, &dir);
...@@ -261,11 +263,12 @@ void def_struct_config_file(configuration *config_file, MPI_Datatype *config_typ ...@@ -261,11 +263,12 @@ void def_struct_config_file(configuration *config_file, MPI_Datatype *config_typ
MPI_Get_address(&(config_file->resizes), &displs[0]); MPI_Get_address(&(config_file->resizes), &displs[0]);
MPI_Get_address(&(config_file->actual_resize), &displs[1]); MPI_Get_address(&(config_file->actual_resize), &displs[1]);
MPI_Get_address(&(config_file->matrix_tam), &displs[2]); MPI_Get_address(&(config_file->matrix_tam), &displs[2]);
MPI_Get_address(&(config_file->sdr), &displs[3]); MPI_Get_address(&(config_file->comm_tam), &displs[3]);
MPI_Get_address(&(config_file->adr), &displs[4]); MPI_Get_address(&(config_file->sdr), &displs[4]);
MPI_Get_address(&(config_file->aib), &displs[5]); MPI_Get_address(&(config_file->adr), &displs[5]);
MPI_Get_address(&(config_file->general_time), &displs[6]); MPI_Get_address(&(config_file->aib), &displs[6]);
MPI_Get_address(&(config_file->Top), &displs[7]); MPI_Get_address(&(config_file->general_time), &displs[7]);
MPI_Get_address(&(config_file->Top), &displs[8]);
for(i=0;i<counts;i++) displs[i] -= dir; for(i=0;i<counts;i++) displs[i] -= dir;
......
...@@ -7,7 +7,7 @@ typedef struct ...@@ -7,7 +7,7 @@ typedef struct
{ {
int resizes; int resizes;
int actual_resize; int actual_resize;
int matrix_tam, sdr, adr; int matrix_tam, comm_tam, sdr, adr;
int aib; int aib;
float general_time; float general_time;
double Top; double Top;
......
...@@ -29,6 +29,7 @@ void iterate(double *matrix, int n, int async_comm); ...@@ -29,6 +29,7 @@ void iterate(double *matrix, int n, int async_comm);
void init_group_struct(char *argv[], int argc, int myId, int numP); void init_group_struct(char *argv[], int argc, int myId, int numP);
void init_application(); void init_application();
void obtain_op_times();
void free_application_data(); void free_application_data();
void print_general_info(int myId, int grp, int numP); void print_general_info(int myId, int grp, int numP);
...@@ -45,6 +46,8 @@ typedef struct { ...@@ -45,6 +46,8 @@ typedef struct {
int numS; // Cantidad de procesos hijos int numS; // Cantidad de procesos hijos
int commAsync; int commAsync;
MPI_Comm children, parents; MPI_Comm children, parents;
char *compute_comm_array;
char **argv; char **argv;
char *sync_array, *async_array; char *sync_array, *async_array;
} group_data; } group_data;
...@@ -356,24 +359,27 @@ void Sons_init() { ...@@ -356,24 +359,27 @@ void Sons_init() {
int numP_parents = config_file->procs[group->grp -1]; int numP_parents = config_file->procs[group->grp -1];
init_results_data(&results, config_file->resizes - 1, config_file->iters[group->grp]); init_results_data(&results, config_file->resizes - 1, config_file->iters[group->grp]);
if(config_file->adr > 0) { // Recibir datos asincronos if(config_file->comm_tam) {
group->compute_comm_array = malloc(config_file->comm_tam * sizeof(char));
}
if(config_file->adr) { // Recibir datos asincronos
recv_sync(&(group->async_array), config_file->adr, group->myId, group->numP, ROOT, group->parents, numP_parents); recv_sync(&(group->async_array), config_file->adr, group->myId, group->numP, ROOT, group->parents, numP_parents);
results->async_time[group->grp] = MPI_Wtime(); results->async_time[group->grp] = MPI_Wtime();
MPI_Bcast(&(group->iter_start), 1, MPI_INT, ROOT, group->parents); MPI_Bcast(&(group->iter_start), 1, MPI_INT, ROOT, group->parents);
} }
if(config_file->sdr > 0) { // Recibir datos sincronos if(config_file->sdr) { // Recibir datos sincronos
recv_sync(&(group->sync_array), config_file->sdr, group->myId, group->numP, ROOT, group->parents, numP_parents); recv_sync(&(group->sync_array), config_file->sdr, group->myId, group->numP, ROOT, group->parents, numP_parents);
results->sync_time[group->grp] = MPI_Wtime(); results->sync_time[group->grp] = MPI_Wtime();
} }
// Guardar los resultados de esta transmision // Guardar los resultados de esta transmision
recv_results(results, ROOT, config_file->resizes, group->parents); recv_results(results, ROOT, config_file->resizes, group->parents);
if(config_file->sdr > 0) { // Si no hay datos sincronos, el tiempo es 0 if(config_file->sdr) { // Si no hay datos sincronos, el tiempo es 0
results->sync_time[group->grp] = MPI_Wtime() - results->sync_start; results->sync_time[group->grp] = MPI_Wtime() - results->sync_start;
} else { } else {
results->sync_time[group->grp] = 0; results->sync_time[group->grp] = 0;
} }
if(config_file->adr > 0) { // Si no hay datos asincronos, el tiempo es 0 if(config_file->adr) { // Si no hay datos asincronos, el tiempo es 0
results->async_time[group->grp] = MPI_Wtime() - results->async_start; results->async_time[group->grp] = MPI_Wtime() - results->async_start;
} else { } else {
results->async_time[group->grp] = 0; results->async_time[group->grp] = 0;
...@@ -408,6 +414,11 @@ void iterate(double *matrix, int n, int async_comm) { ...@@ -408,6 +414,11 @@ void iterate(double *matrix, int n, int async_comm) {
for(i=0; i < operations; i++) { for(i=0; i < operations; i++) {
aux += computePiSerial(n); aux += computePiSerial(n);
} }
if(config_file->comm_tam) {
MPI_Bcast(group->compute_comm_array, config_file->comm_tam, MPI_CHAR, ROOT, MPI_COMM_WORLD);
}
actual_time = MPI_Wtime(); // Guardar tiempos actual_time = MPI_Wtime(); // Guardar tiempos
if(async_comm == MAL_ASYNC_PENDING) { // Se esta realizando una redistribucion de datos asincrona if(async_comm == MAL_ASYNC_PENDING) { // Se esta realizando una redistribucion de datos asincrona
operations=0; operations=0;
...@@ -513,14 +524,23 @@ void init_application() { ...@@ -513,14 +524,23 @@ void init_application() {
config_file = read_ini_file(group->argv[1]); config_file = read_ini_file(group->argv[1]);
init_results_data(&results, config_file->resizes, config_file->iters[group->grp]); init_results_data(&results, config_file->resizes, config_file->iters[group->grp]);
if(config_file->sdr > 0) { if(config_file->comm_tam) {
group->compute_comm_array = malloc(config_file->comm_tam * sizeof(char));
}
if(config_file->sdr) {
malloc_comm_array(&(group->sync_array), config_file->sdr , group->myId, group->numP); malloc_comm_array(&(group->sync_array), config_file->sdr , group->myId, group->numP);
} }
if(config_file->adr > 0) { if(config_file->adr) {
malloc_comm_array(&(group->async_array), config_file->adr , group->myId, group->numP); malloc_comm_array(&(group->async_array), config_file->adr , group->myId, group->numP);
} }
obtain_op_times();
}
/*
* Obtiene cuanto tiempo es necesario para realizar una operacion de PI
*/
void obtain_op_times() {
double result, start_time = MPI_Wtime(); double result, start_time = MPI_Wtime();
int i; int i;
result = 0; result = 0;
...@@ -530,20 +550,24 @@ void init_application() { ...@@ -530,20 +550,24 @@ void init_application() {
printf("Creado Top con valor %lf\n", result); printf("Creado Top con valor %lf\n", result);
fflush(stdout); fflush(stdout);
config_file->Top = (MPI_Wtime() - start_time) / 20000; //Tiempo de una iteracion en numero de iteraciones config_file->Top = (MPI_Wtime() - start_time) / 20000; //Tiempo de una operacion
MPI_Bcast(&(config_file->Top), 1, MPI_DOUBLE, ROOT, MPI_COMM_WORLD); MPI_Bcast(&(config_file->Top), 1, MPI_DOUBLE, ROOT, MPI_COMM_WORLD);
} }
/* /*
* Libera toda la memoria asociada con la aplicacion * Libera toda la memoria asociada con la aplicacion
*/ */
void free_application_data() { void free_application_data() {
if(config_file->sdr > 0) { if(config_file->comm_tam) {
free(group->compute_comm_array);
}
if(config_file->sdr) {
free(group->sync_array); free(group->sync_array);
} }
if(config_file->adr > 0) { if(config_file->adr) {
free(group->async_array); free(group->async_array);
} }
free(group); free(group);
free_config(config_file); free_config(config_file);
free_results_data(&results); free_results_data(&results);
......
import sys import sys
import glob import glob
def general(f, resizes, matrix_tam, sdr, adr, aib, time): def general(f, resizes, matrix_tam, comm_tam, sdr, adr, aib, time):
f.write("[general]\n") f.write("[general]\n")
f.write("resizes=" + resizes +"\n") f.write("resizes=" + resizes +"\n")
f.write("matrix_tam=" + matrix_tam +"\n") f.write("matrix_tam=" + matrix_tam +"\n")
f.write("comm_tam=" + comm_tam +"\n")
f.write("SDR=" + sdr +"\n") f.write("SDR=" + sdr +"\n")
f.write("ADR=" + adr +"\n") f.write("ADR=" + adr +"\n")
f.write("AIB=" + aib +"\n") f.write("AIB=" + aib +"\n")
...@@ -30,11 +31,12 @@ if len(sys.argv) < 12: ...@@ -30,11 +31,12 @@ if len(sys.argv) < 12:
name = sys.argv[1] name = sys.argv[1]
resizes = int(sys.argv[2]) resizes = int(sys.argv[2])
matrix_tam = sys.argv[3] matrix_tam = sys.argv[3]
sdr = int(sys.argv[4]) comm_tam = sys.argv[4]
adr_perc = float(sys.argv[5]) sdr = int(sys.argv[5])
aib = sys.argv[6] adr_perc = float(sys.argv[6])
time = sys.argv[7] aib = sys.argv[7]
proc_time = float(sys.argv[8]) # Usado para calcular el factor de cada proceso time = sys.argv[8]
proc_time = float(sys.argv[9]) # Usado para calcular el factor de cada proceso
adr = (sdr * adr_perc) / 100 adr = (sdr * adr_perc) / 100
sdr = sdr - adr sdr = sdr - adr
...@@ -44,13 +46,13 @@ sdr = str(sdr) ...@@ -44,13 +46,13 @@ sdr = str(sdr)
factor = 0 factor = 0
f = open(name, "w") f = open(name, "w")
general(f, str(resizes), matrix_tam, sdr, adr, aib, time) general(f, str(resizes), matrix_tam, comm_tam, sdr, adr, aib, time)
resizes = resizes + 1 # Internamente, los primeros procesos se muestran como un grupo resizes = resizes + 1 # Internamente, los primeros procesos se muestran como un grupo
for resize in range(resizes): for resize in range(resizes):
iters = sys.argv[9 + 3 * resize] iters = sys.argv[10 + 3 * resize]
procs = sys.argv[9 + 3 * resize + 1] procs = sys.argv[10 + 3 * resize + 1]
physical_dist = sys.argv[9 + 3 * resize + 2] physical_dist = sys.argv[10 + 3 * resize + 2]
if proc_time != 0: # Si el argumento proc_time es 0, todos los grupos tienen un factor de 1 if proc_time != 0: # Si el argumento proc_time es 0, todos los grupos tienen un factor de 1
factor = proc_time / float(procs) factor = proc_time / float(procs)
......
...@@ -10,11 +10,12 @@ echo "START TEST" ...@@ -10,11 +10,12 @@ echo "START TEST"
groups=$1 #TODO Modificar para que admita más de dos grupos de procesos groups=$1 #TODO Modificar para que admita más de dos grupos de procesos
matrix_tam=$2 matrix_tam=$2
N_qty=$3 # Datos a redistribuir comm_tam=$3
time=$4 N_qty=$4 # Datos a redistribuir
proc_init=$5 #El tiempo por iteracion es para esta cantidad de procesos time=$5
iters=$6 proc_init=$6 #El tiempo por iteracion es para esta cantidad de procesos
node_qty=$7 iters=$7
node_qty=$8
max_procs=$(($node_qty * 20)) max_procs=$(($node_qty * 20))
procs_array=() procs_array=()
...@@ -69,7 +70,7 @@ do ...@@ -69,7 +70,7 @@ do
array=("${array0[@]}") array=("${array0[@]}")
array0=($iters $procs_sons $phy_dist) array0=($iters $procs_sons $phy_dist)
array+=("${array0[@]}") array+=("${array0[@]}")
python3 $dir$execDir/./create_ini.py config$i.ini 1 $matrix_tam $N_qty $adr_perc $ibarrier_use $time $proc_init "${array[@]}" python3 $dir$execDir/./create_ini.py config$i.ini 1 $matrix_tam $comm_tam $N_qty $adr_perc $ibarrier_use $time $proc_init "${array[@]}"
done done
done done
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment