Commit 5e73e8ba authored by iker_martin's avatar iker_martin
Browse files

Arreglado error de memoria en los vectores de resultados de iteraciones

parent a49aea25
......@@ -108,7 +108,7 @@ void print_iter_results(results_data *results, int last_normal_iter_index) {
printf("%d ", results->iters_type[i] == 0);
}
printf("\nTop: "); //FIXME modificar a imprimir solo cuantas operaciones cuestan una iteracion
printf("\nTop: "); //TODO modificar a imprimir solo cuantas operaciones cuestan una iteracion?
for(i=0; i< results->iter_index; i++) {
aux = results->iters_type[i] == 0 ? results->iters_type[last_normal_iter_index] : results->iters_type[i];
printf("%d ", aux);
......@@ -161,11 +161,28 @@ void init_results_data(results_data **results, int resizes, int iters_size) {
(*results)->sync_time = calloc(resizes, sizeof(double));
(*results)->async_time = calloc(resizes, sizeof(double));
(*results)->iters_time = calloc(iters_size * 20 + 100, sizeof(double)); //FIXME Numero magico - Añadir funcion que amplie tamaño
(*results)->iters_type = calloc(iters_size * 20 + 100, sizeof(int));
(*results)->iters_size = iters_size + 100;
(*results)->iters_time = calloc(iters_size + 100, sizeof(double)); //FIXME Numero magico - Añadir funcion que amplie tamaño
(*results)->iters_type = calloc(iters_size + 100, sizeof(int));
(*results)->iter_index = 0;
}
void realloc_results_iters(results_data *results, int needed) {
double *time_aux;
int *type_aux;
time_aux = (double *) realloc(results->iters_time, needed * sizeof(double));
type_aux = (int *) realloc(results->iters_type, needed * sizeof(int));
if(time_aux == NULL || type_aux == NULL) {
fprintf(stderr, "No se ha podido realojar la memoria de resultados\n");
MPI_Abort(MPI_COMM_WORLD, 1);
}
results->iters_time = time_aux;
results->iters_type = type_aux;
}
/*
* Libera toda la memoria asociada con una estructura de resultados.
*/
......
......@@ -5,7 +5,7 @@
typedef struct {
// Iters data
double *iters_time;
int *iters_type, iter_index;
int *iters_type, iter_index, iters_size;
// Spawn, Sync and Async time
double spawn_start, *spawn_time;
......@@ -21,4 +21,5 @@ void recv_results(results_data *results, int root, int resizes, MPI_Comm interco
void print_iter_results(results_data *results, int last_normal_iter_index);
void print_global_results(results_data *results, int resizes);
void init_results_data(results_data **results, int resizes, int iters_size);
void realloc_results_iters(results_data *results, int needed);
void free_results_data(results_data **results);
......@@ -438,9 +438,14 @@ void iterate(double *matrix, int n, int async_comm) {
operations=0;
}
if(results->iter_index == results->iters_size) { // Aumentar tamaño de ambos vectores de resultados
realloc_results_iters(results, results->iters_size + 100);
}
results->iters_time[results->iter_index] = actual_time - start_time;
results->iters_type[results->iter_index] = operations;
results->iter_index = results->iter_index + 1;
}
//======================================================||
......@@ -556,15 +561,15 @@ void init_application() {
*/
void obtain_op_times() {
double result, start_time = MPI_Wtime();
int i;
int i, qty = 20000;
result = 0;
for(i=0; i<20000; i++) {
for(i=0; i<qty; i++) {
result += computePiSerial(config_file->matrix_tam);
}
printf("Creado Top con valor %lf\n", result);
fflush(stdout);
config_file->Top = (MPI_Wtime() - start_time) / 20000; //Tiempo de una operacion
config_file->Top = (MPI_Wtime() - start_time) / qty; //Tiempo de una operacion
MPI_Bcast(&(config_file->Top), 1, MPI_DOUBLE, ROOT, MPI_COMM_WORLD);
}
......
[general]
resizes=1 ; Numero de redistribuciones
matrix_tam=1000 ; Tamaño en bytes de la matriz de computo
SDR=100 ; Tamaño en bytes a redistribuir de forma sincrona
ADR=100 ; Tamaño en bytes a redistribuir de forma asincrona 1000000000
AIB=0 ; Indica si las redistribuciones asíncronas se consideran terminadas para los padres
comm_tam=10000000 ; Tamaño en bytes de los datos a comunicar en cada iteracion. Una sola vez
SDR=1000 ; Tamaño en bytes a redistribuir de forma sincrona
ADR=1000 ; Tamaño en bytes a redistribuir de forma asincrona 1000000000
AIB=3 ; Indica si las redistribuciones asíncronas se consideran terminadas para los padres
; cuando terminan de enviar (0) o cuando terminan de recibir los valores (1)
time=1 ; Tiempo necesario para realizar una iteracion
[resize0] ; Grupo inicial(mpirun)
iters=10 ; Numero de iteraciones a realizar por este grupo
iters=1 ; Numero de iteraciones a realizar por este grupo
procs=2 ; Cantidad de procesos en el grupo
factor=1 ; Factor de coste
physical_dist=cpu ; Tipo de redistribución física de los procesos
physical_dist=node ; Tipo de redistribución física de los procesos
;end [resize0]
[resize1] ; Grupo de hijos 1
iters=20
procs=4
factor=0.5
physical_dist=cpu
physical_dist=node
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