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) { ...@@ -108,7 +108,7 @@ void print_iter_results(results_data *results, int last_normal_iter_index) {
printf("%d ", results->iters_type[i] == 0); 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++) { 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]; aux = results->iters_type[i] == 0 ? results->iters_type[last_normal_iter_index] : results->iters_type[i];
printf("%d ", aux); printf("%d ", aux);
...@@ -161,11 +161,28 @@ void init_results_data(results_data **results, int resizes, int iters_size) { ...@@ -161,11 +161,28 @@ void init_results_data(results_data **results, int resizes, int iters_size) {
(*results)->sync_time = calloc(resizes, sizeof(double)); (*results)->sync_time = calloc(resizes, sizeof(double));
(*results)->async_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_size = iters_size + 100;
(*results)->iters_type = calloc(iters_size * 20 + 100, sizeof(int)); (*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; (*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. * Libera toda la memoria asociada con una estructura de resultados.
*/ */
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
typedef struct { typedef struct {
// Iters data // Iters data
double *iters_time; double *iters_time;
int *iters_type, iter_index; int *iters_type, iter_index, iters_size;
// Spawn, Sync and Async time // Spawn, Sync and Async time
double spawn_start, *spawn_time; double spawn_start, *spawn_time;
...@@ -21,4 +21,5 @@ void recv_results(results_data *results, int root, int resizes, MPI_Comm interco ...@@ -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_iter_results(results_data *results, int last_normal_iter_index);
void print_global_results(results_data *results, int resizes); void print_global_results(results_data *results, int resizes);
void init_results_data(results_data **results, int resizes, int iters_size); 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); void free_results_data(results_data **results);
...@@ -438,9 +438,14 @@ void iterate(double *matrix, int n, int async_comm) { ...@@ -438,9 +438,14 @@ void iterate(double *matrix, int n, int async_comm) {
operations=0; 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_time[results->iter_index] = actual_time - start_time;
results->iters_type[results->iter_index] = operations; results->iters_type[results->iter_index] = operations;
results->iter_index = results->iter_index + 1; results->iter_index = results->iter_index + 1;
} }
//======================================================|| //======================================================||
...@@ -556,15 +561,15 @@ void init_application() { ...@@ -556,15 +561,15 @@ void init_application() {
*/ */
void obtain_op_times() { void obtain_op_times() {
double result, start_time = MPI_Wtime(); double result, start_time = MPI_Wtime();
int i; int i, qty = 20000;
result = 0; result = 0;
for(i=0; i<20000; i++) { for(i=0; i<qty; i++) {
result += computePiSerial(config_file->matrix_tam); result += computePiSerial(config_file->matrix_tam);
} }
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 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); MPI_Bcast(&(config_file->Top), 1, MPI_DOUBLE, ROOT, MPI_COMM_WORLD);
} }
......
[general] [general]
resizes=1 ; Numero de redistribuciones resizes=1 ; Numero de redistribuciones
matrix_tam=1000 ; Tamaño en bytes de la matriz de computo matrix_tam=1000 ; Tamaño en bytes de la matriz de computo
SDR=100 ; Tamaño en bytes a redistribuir de forma sincrona comm_tam=10000000 ; Tamaño en bytes de los datos a comunicar en cada iteracion. Una sola vez
ADR=100 ; Tamaño en bytes a redistribuir de forma asincrona 1000000000 SDR=1000 ; Tamaño en bytes a redistribuir de forma sincrona
AIB=0 ; Indica si las redistribuciones asíncronas se consideran terminadas para los padres 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) ; cuando terminan de enviar (0) o cuando terminan de recibir los valores (1)
time=1 ; Tiempo necesario para realizar una iteracion time=1 ; Tiempo necesario para realizar una iteracion
[resize0] ; Grupo inicial(mpirun) [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 procs=2 ; Cantidad de procesos en el grupo
factor=1 ; Factor de coste 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] ;end [resize0]
[resize1] ; Grupo de hijos 1 [resize1] ; Grupo de hijos 1
iters=20 iters=20
procs=4 procs=4
factor=0.5 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