Skip to content

Commit dcaa1a0

Browse files
Alessandro FanfarilloDamian Rouson
authored andcommitted
Form team
1 parent 473b72f commit dcaa1a0

File tree

2 files changed

+30
-1
lines changed

2 files changed

+30
-1
lines changed

src/libcaf.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,12 @@ typedef void* caf_token_t;
9292
#ifdef GCC_GE_7
9393
/** Add a dummy type representing teams in coarrays. */
9494
typedef void * caf_team_t;
95+
typedef struct caf_teams_list {
96+
caf_team_t team;
97+
int team_id;
98+
struct caf_teams_list *prev;
99+
}
100+
caf_teams_list;
95101
#endif
96102

97103
/* When there is a vector subscript in this dimension, nvec == 0, otherwise,
@@ -269,6 +275,8 @@ void PREFIX (error_stop_str) (const char *, int32_t)
269275
void PREFIX (error_stop) (int32_t) __attribute__ ((noreturn));
270276
void PREFIX (fail_image) (void) __attribute__ ((noreturn));
271277

278+
void PREFIX (form_team) (int, caf_team_t *, int);
279+
272280
int PREFIX (image_status) (int);
273281
void PREFIX (failed_images) (gfc_descriptor_t *, int, int *);
274282
void PREFIX (stopped_images) (gfc_descriptor_t *, int, int *);

src/mpi/mpi_caf.c

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,9 @@ char err_buffer[MPI_MAX_ERROR_STRING];
214214
MPI_COMM_WORLD for interoperability purposes. */
215215
MPI_Comm CAF_COMM_WORLD;
216216

217+
static caf_teams_list *teams_list = NULL;
218+
static MPI_Comm current_team;
219+
217220
#ifdef WITH_FAILED_IMAGES
218221
/* The stati of the other images. image_stati is an array of size
219222
* caf_num_images at the beginning the status of each image is noted here
@@ -795,6 +798,8 @@ PREFIX (init) (int *argc, char ***argv)
795798

796799
stat_tok = malloc (sizeof (MPI_Win));
797800

801+
current_team = CAF_COMM_WORLD;
802+
798803
#ifdef WITH_FAILED_IMAGES
799804
MPI_Comm_dup (MPI_COMM_WORLD, &alive_comm);
800805
/* Handling of failed/stopped images is done by setting an error handler
@@ -4668,7 +4673,6 @@ PREFIX(atomic_ref) (caf_token_t token, size_t offset,
46684673
return;
46694674
}
46704675

4671-
46724676
void
46734677
PREFIX(atomic_cas) (caf_token_t token, size_t offset,
46744678
int image_index, void *old, void *compare,
@@ -5160,3 +5164,20 @@ unimplemented_alloc_comps_message (const char * functionname)
51605164
exit (EXIT_FAILURE);
51615165
#endif
51625166
}
5167+
5168+
void PREFIX (form_team) (int team_id, caf_team_t *team, int index __attribute__ ((unused)))
5169+
{
5170+
struct caf_teams_list *tmp;
5171+
void * tmp_team;
5172+
MPI_Comm newcomm;
5173+
MPI_Comm *current_comm = &current_team;
5174+
5175+
MPI_Comm_split(*current_comm, team_id, caf_this_image, &newcomm);
5176+
5177+
tmp = calloc(1,sizeof(struct caf_teams_list));
5178+
tmp->prev = teams_list;
5179+
teams_list = tmp;
5180+
teams_list->team_id = team_id;
5181+
teams_list->team = &newcomm;
5182+
*team = &newcomm;
5183+
}

0 commit comments

Comments
 (0)