Merge.c 2.37 KB
Newer Older
1
2
3
#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>
4
5
#include "../MAM_Constants.h"
#include "../MAM_DataStructures.h"
6
7
8
9
10
11
12
13
14
#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) {
15
  MPI_Comm intercomm;
16
  int local_state;
17
  int is_children_group = 1;
18
19

  if(spawn_data.initial_qty > spawn_data.target_qty) { //Shrink
20
    if(data_state == MAM_I_DIST_COMPLETED) {
iker_martin's avatar
iker_martin committed
21
      merge_adapt_shrink(spawn_data.target_qty, child, spawn_data.comm, mall->myId);
22
      local_state = MAM_I_SPAWN_ADAPTED;
23
    } else {
24
      local_state = MAM_I_SPAWN_ADAPT_POSTPONE;
25
26
    }
  } else { //Expand
27
28
    MPI_Comm_get_parent(&intercomm);
    is_children_group = intercomm == MPI_COMM_NULL ? 0:1;
29

30

31
32
    baseline(spawn_data, child);
    merge_adapt_expand(child, is_children_group);
33
    local_state = MAM_I_SPAWN_COMPLETED;
34
35
36
37
38
  }

  return local_state;
}

39
40
int intracomm_strategy(int is_children_group, MPI_Comm *child) {
  merge_adapt_expand(child, is_children_group);
41
  return MAM_I_SPAWN_COMPLETED;
42
43
}

44
45
46
47
48
49
50
51
52
53
54
55
56
57
//--------------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;

58
  MPI_Intercomm_merge(*child, is_children_group, &new_comm); //El que pone 0 va primero
59

60
61
62
63
  //char test;
  //MPI_Bcast(&test, 1, MPI_CHAR, 0, new_comm);
  //MPI_Barrier(*child);

64
  MPI_Comm_disconnect(child);
65
66
67
68
69
70
71
72
73
74
75
76
77
78
  *child = new_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;

79
  if(*child != MPI_COMM_NULL && *child != MPI_COMM_WORLD) MPI_Comm_disconnect(child);
80
81
82
83
84
  if(myId < numC) {
      color = 1;  
  }
  MPI_Comm_split(comm, color, myId, child);
}