Main.c 2.26 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>
#include "../IOcodes/read_ini.h"

#define ROOT 0

int work(int n);
void iterate(double *matrix, int n);
void computeMatrix(double *matrix, int n);
void initMatrix(double **matrix, int n);

int main(int argc, char *argv[]) {
    int numP, myId;

    MPI_Init(&argc, &argv);
    MPI_Comm_size(MPI_COMM_WORLD, &numP);
    MPI_Comm_rank(MPI_COMM_WORLD, &myId);    
/*    
    MPI_Comm_get_parent(&comm_parents);
    if(comm_parents != MPI_COMM_NULL ) { // Si son procesos hijos deben recoger la distribucion
      if(myId == ROOT) {
        printf("Nuevo set de procesos de %d\n", numP);
      }
    } else { // Primer set de procesos inicializan valores

    }
*/
    int res = work(10000);

    if(res) { // Ultimo set de procesos comprueba resultados
	    //RESULTADOS
    }

    configuration *config_file = read_ini_file("test.ini");
    print_config(config_file);

    free_config(config_file);



    MPI_Finalize();
    return 0;
}

/*
 * Bucle de computo principal
 */
int work(int n) {
  int iter, MAXITER=5; //FIXME BORRAR MAXITER
  double *matrix;

  initMatrix(&matrix, n);
  for(iter=0; iter<MAXITER; iter++) {
    iterate(matrix, n);
  }
  return 0;
}

/*
 * Simula la ejecucción de una iteración de computo en la aplicación
 */
void iterate(double *matrix, int n) {
  double start_time, actual_time;
  int TIME=10; //FIXME BORRAR

  start_time = actual_time = MPI_Wtime();
  while (actual_time - start_time > TIME) {
    computeMatrix(matrix, n);
    actual_time = MPI_Wtime();
  }
}

/*
 * Realiza una multiplicación de matrices de tamaño n
 */
void computeMatrix(double *matrix, int n) {
  int row, col, i, aux;

  for(row=0; i<n; row++) {
    /* COMPUTE */
    for(col=0; col<n; col++) {
      aux=0;
      for(i=0; i<n; i++) {
        aux += matrix[row*n + i] * matrix[i*n + col];
      }
    }
  }
}

/*
 * Init matrix
 */
void initMatrix(double **matrix, int n) {
  int i, j;

  // Init matrix
  if(matrix != NULL) {
    *matrix = malloc(n * n * sizeof(double));
    if(*matrix == NULL) { MPI_Abort(MPI_COMM_WORLD, -1);}
    for(i=0; i < n; i++) {
      for(j=0; j < n; j++) {
        (*matrix)[i*n + j] = i+j;
      }
    }
  }
}