"Results/DataRedist/Synch/config15.ini" did not exist on "7b214a6ce9151910afd3869ef2b393803510b8d2"
Merge.c 2.42 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
#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>
#include "../malleabilityStates.h"
#include "Merge.h"
#include "Baseline.h"

//--------------PRIVATE DECLARATIONS---------------//
void merge_adapt_expand(MPI_Comm *child, int is_children_group);
void merge_adapt_shrink(int numC, MPI_Comm *child, MPI_Comm comm, int myId);

//--------------PUBLIC FUNCTIONS---------------//
int merge(Spawn_data spawn_data, MPI_Comm *child, int data_state) {
  MPI_Comm new_comm = MPI_COMM_NULL;
  int local_state;
  int numRanks, is_children_group = 1;

  if(spawn_data.initial_qty > spawn_data.target_qty) { //Shrink
    if(data_state == MALL_DIST_COMPLETED)
      merge_adapt_shrink(spawn_data.target_qty, child, spawn_data.comm, spawn_data.myId)
      local_state = MALL_SPAWN_ADAPTED;
    else {
      local_state = MALL_SPAWN_ADAPT_POSTPONE;
    }
  } else { //Expand
    MPI_Comm_size(spawn_data.comm, &numRanks);
    is_children_group = spawn_data.initial_qty == numRanks ? 0:1;

    baseline(spawn_data, child);
    merge_adapt_expand(child, is_children_group);
    local_state = MALL_SPAWN_ADAPTED;
  }

  return local_state;
}

//--------------PRIVATE MERGE TYPE FUNCTIONS---------------//

/*
 * Se encarga de que el grupo de procesos resultante se 
 * encuentren todos en un intra comunicador, uniendo a
 * padres e hijos en un solo comunicador.
 *
 * Se llama antes de la redistribución de datos.
 *
 * TODO REFACTOR
 */
void merge_adapt_expand(MPI_Comm *child, int is_children_group) {
  MPI_Comm new_comm = MPI_COMM_NULL;

  MPI_Intercomm_merge(child, is_children_group, new_comm); //El que pone 0 va primero

  MPI_Comm_free(child); //POSIBLE ERROR?
  *child = new_comm;

  //*numP = numC; //TODO REFACTOR Llevar a otra parte -- Hacer solo si MALL_SPAWN_ADAPTED
  //if(*comm != MPI_COMM_WORLD && *comm != MPI_COMM_NULL) {
  //  MPI_Comm_free(comm);
  //}
}


/*
 * Se encarga de que el grupo de procesos resultante se
 * eliminen aquellos procesos que ya no son necesarios.
 * Los procesos eliminados se quedaran como zombies.
 *
 * Se llama una vez ha terminado la redistribución de datos.
 */
void merge_adapt_shrink(int numC, MPI_Comm *child, MPI_Comm comm, int myId) {
  int color = MPI_UNDEFINED;

  if(myId < numC) {
      color = 1;  
  }
  MPI_Comm_split(comm, color, myId, child);

  //TODO REFACTOR Llevar a otra parte -- Hacer solo si MALL_SPAWN_ADAPTED
  //if(*comm != MPI_COMM_WORLD && *comm != MPI_COMM_NULL)
  //  MPI_Comm_free(comm); //POSIBLE ERROR?
}